
A estratégia de ruptura de dinâmica é uma estratégia de negociação quantitativa para acompanhar a tendência do mercado. Computa os indicadores de dinâmica dos preços históricos, julga a tendência e a intensidade do movimento dos preços do mercado, para capturar a tendência da linha média do mercado.
A estratégia é baseada principalmente em indicadores de dinâmica. O indicador de dinâmica é o preço de fechamento do ciclo atual menos o preço de fechamento antes do ciclo N. Quando o preço de fechamento da linha K mais recente é maior que o do ciclo N, a dinâmica é positiva, indicando um impulso ascendente; Quando o preço de fechamento da linha K mais recente é menor que o do ciclo N, a dinâmica é negativa, indicando um impulso descendente.
A estratégia primeiro calcula a dinâmica de um período de 18 ciclos, ou seja, o preço de fechamento atual menos o preço de fechamento anterior ao período de 18 ciclos, obtendo mom0 ≠. Em seguida, calcula a dinâmica de um período de mom0 , obtendo mom1 ≠.
Quando a mom0>0 e a mom1>0 produzem um sinal de fazer mais, isso indica que o preço está em alta forte; Quando a mom0 e a mom1 produzem um sinal de fazer menos, isso indica que o preço está em baixa forte.
A estratégia registra o último sinal de alta e baixa, mantendo uma posição de baixa quando a alta é maior do que a baixa.
A estratégia tem as seguintes vantagens:
A estratégia é clara, simples e fácil de entender, adequada para iniciantes em negociação quantitativa.
Os indicadores de dinâmica são capazes de capturar tendências e intensidades de mercado, seguindo tendências de linha média e longa com uma alta taxa de vitória.
O uso de filtros de dupla potência permite a filtragem de parte dos danos causados por falsas brechas.
A partir do momento em que os sinais de negociação são produzidos, a posição de tendência é criada e pode obter ganhos extras com a tendência.
A retirada atempada do stop loss pode controlar os prejuízos individuais e evitar prejuízos excessivos devido à reversão.
A estratégia também apresenta alguns riscos que devem ser lembrados:
A correção de curto prazo em uma corrida de múltiplos títulos causa uma saída de stop loss e não pode capturar o ciclo completo. A faixa de stop loss pode ser adequadamente amenizada.
A frequência de abertura de posições em situações de turbulência pode aumentar as taxas de transação e os pontos de perda. As condições de filtragem podem ser adequadamente relaxadas e a frequência de negociação pode ser reduzida.
A reversão da tendência ainda mantém a posição original, causando expansão de perdas. A reversão da tendência pode ser avaliada em combinação com o indicador de tendência.
A configuração inadequada dos parâmetros pode causar sinais de negociação errados ou produzir sinais errados. Os parâmetros precisam ser ajustados para diferentes mercados.
A estratégia pode ser melhorada em vários aspectos:
Otimizar os parâmetros de dinâmica, calcular a duração da dinâmica para diferentes ciclos e ajustes de mercado, melhorar a qualidade do sinal.
Adicionar filtros para outros indicadores, como MACD, KD, etc., para evitar que a reversão de tendência cause perdas.
Optimizar a estratégia de parada de perda, com a liberação apropriada de parada de perda em uma tendência de negociação; Mercado não-trend apropriadamente apertado de parada de perda.
Aumentar a estratégia de gerenciamento de posições, reduzir as posições em situações não tendenciais; aumentar as posições em situações tendenciais para obter mais receita.
Otimizar os parâmetros para diferentes variedades, aumentando a adaptabilidade dos parâmetros.
Adicionar algoritmos de aprendizagem de máquina para permitir que a estratégia otimize os parâmetros de forma dinâmica.
A estratégia de quebra de dinâmica geral é uma estratégia de seguimento de tendências simples e intuitiva. Ela é capaz de capturar efetivamente as tendências de longo prazo no mercado e obter melhores ganhos em situações de tendência.
/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Momentum BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)
/////////////// Time Frame ///////////////
_0 = input(false, "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)
testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
testPeriod() => true
///////////// Momentum /////////////
_1 = input(false, "═══════ Momentum ══════")
length = input(18)
price = close
momentum(seria, length) =>
mom = seria - seria[length]
mom
mom0 = momentum(price, length)
mom1 = momentum(mom0, 1)
/////////////// Strategy ///////////////
long = mom0 > 0 and mom1 > 0
short = mom0 < 0 and mom1 < 0
last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)
last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])
last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])
in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal
last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1])
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1])
/////////////// Stop Losses Long ///////////////
_5 = input(false, "═══════ Stop Loss L ══════")
SL_typel = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inpl = input(8.0, title='Fixed Stop Loss %') / 100
atrLkbl = input(20, minval=1, title='ATR Stop Period')
atrMultl = input(1.5, step=0.25, title='ATR Stop Multiplier')
atr1l = atr(atrLkbl)
longStop1l = 0.0
longStop1l := short_signal ? na : long_signal ? close - (atr1l * atrMultl) : longStop1l[1]
slLongl = in_long_signal ? strategy.position_avg_price * (1 - sl_inpl) : na
long_sll = in_long_signal ? slLongl : na
/////////////// Stop Losses Short ///////////////
_6 = input(false, "═══════ Stop Loss S ══════")
SL_types = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inps = input(7.0, title='Fixed Stop Loss %') / 100
atrLkbs = input(20, minval=1, title='ATR Stop Period')
atrMults = input(1.5, step=0.25, title='ATR Stop Multiplier')
atr1s = atr(atrLkbs)
shortStop1s = 0.0
shortStop1s := long_signal ? na : short_signal ? close + (atr1s * atrMults) : shortStop1s[1]
slShorts = strategy.position_avg_price * (1 + sl_inps)
short_sls = in_short_signal ? slShorts : na
_7 = input(false, "══════ Longs or Shorts ═════")
useLongs = input(true, title="Use Longs")
useShorts = input(true, title="Use Shorts")
/////////////// Execution ///////////////
if testPeriod()
if useLongs
strategy.entry("L", strategy.long, when=long)
strategy.exit("L SL", "L", stop = SL_typel == "Fixed" ? long_sll : longStop1l, when=since_longEntry > 0)
if useShorts
strategy.exit("S SL", "S", stop = SL_types == "Fixed" ? short_sls : shortStop1s, when=since_shortEntry > 0)
strategy.entry("S", strategy.short, when=short)
if not useShorts
strategy.close("L", when=short)
if not useLongs
strategy.close("S", when=long)
/////////////// Plotting ///////////////
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=40)
p0 = plot(close)
p1 = plot(strategy.position_size <= 0 ? na : SL_typel == "Fixed" ? long_sll : longStop1l, title="Long Stop Loss", color=color.yellow, style=plot.style_linebr, linewidth=2)
p2 = plot(strategy.position_size >= 0 ? na : SL_types == "Fixed" ? short_sls : shortStop1s, title="Short Stop Loss", color=color.orange, style=plot.style_linebr, linewidth=2)
p3 = plot(strategy.position_size <= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Long Entry", color=color.green, linewidth=2)
p4 = plot(strategy.position_size >= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Short Entry", color=color.red, linewidth=2)
fill(p0, p3, color = color.lime, transp=60)
fill(p0, p4, color = color.red, transp=60)