Estratégia de trailing stop multi-time frame


Data de criação: 2024-01-08 11:24:24 última modificação: 2024-01-08 11:24:24
cópia: 0 Cliques: 644
1
focar em
1617
Seguidores

Estratégia de trailing stop multi-time frame

Visão geral

Esta estratégia é uma versão multi-frame de tempo da estratégia de tracking stop simples que eu publiquei anteriormente. A estratégia anterior usava apenas o tracking stop básico para entrar em posição.

Nessa estratégia, você pode usar apenas o ATR Stop e escolher outros 3 quadros de tempo mais altos, além do quadro de tempo atual. O tracking stop nesses quadros de tempo será traçado no gráfico. Se todos os 4 quadros de tempo emitirem sinais de multi-cabeças, entre mais. Quando pelo menos 2 quadros de tempo discordam do sinal de multi-cabeças, leve a posição de multi-cabeças.

Princípio da estratégia

O núcleo da estratégia é o rastreamento de stop loss e seguimento de tendência. O rastreamento de stop loss é usado para definir o ponto de parada, que pode ser efetivamente evitado de ser ultrapassado, com base no cálculo do valor do ATR. O seguimento de tendência é usado para determinar a entrada observando a direção da tendência em diferentes prazos.

Concretamente, a estratégia primeiro calcula o valor do ATR em diferentes prazos e define a distância de parada. Em seguida, emite um sinal de fazer mais ou fazer menos quando julgar que o preço quebra o ponto de parada.

A combinação de tendências de diferentes períodos permite filtrar eficazmente as brechas falsas. Ao mesmo tempo, o rastreamento de stop-loss pode bloquear os lucros e controlar eficazmente o risco.

Vantagens estratégicas

  1. Utilizando o julgamento de múltiplos quadros temporais, pode filtrar o ruído e identificar a direção da tendência
  2. ATR tracking stop loss pode ajustar dinamicamente a distância de parada para reduzir a probabilidade de arbitragem
  3. A combinação de acompanhamento de tendências e gestão de paradas permite o acompanhamento de tendências e a paragem em tempo hábil.
  4. Menos parâmetros, fácil de entender e ajustar

Análise de Riscos

  1. ATR Stop loss Se os parâmetros são configurados de forma inadequada, pode ser muito perto ou longe do preço, sendo fácil de ser ultrapassado ou parar a distância excessiva
  2. A combinação de multi-quadros de tempo pode não funcionar efetivamente ou cometer erros se os parâmetros forem configurados incorretamente
  3. Parâmetros de stop loss e parâmetros de time frame precisam ser configurados em simultâneo, caso contrário, o ótimo efeito pode não ser alcançado

Solução:

  1. Teste repetidamente diferentes combinações de parâmetros e variedades para encontrar o melhor parâmetro
  2. Optimizar a proporção e a quantidade de quadros temporais para garantir que se possa fornecer um julgamento confiável de tendências
  3. Ajustar o múltiplo do stop ATR para encontrar um equilíbrio entre o stop não ser ultrapassado e a distância não ser muito grande

Direção de otimização

A estratégia pode ser otimizada em:

  1. Aumentar ou diminuir o número de quadros de tempo para encontrar um conjunto de quadros para determinar as melhores tendências
  2. Testar diferentes ATRs para determinar a melhor distância de parada
  3. Adição de mecanismos de reentrada para criar mais posições se a tendência continuar
  4. Em combinação com outros indicadores de filtragem de entrada de tempo, como indicadores de quantidade de preço, etc.
  5. Optimizado para diferentes parâmetros

Resumir

Esta estratégia permite uma combinação orgânica de acompanhamento de tendências e controle de risco, através da forma como o ATR de vários quadros temporais acompanha o stop loss. Em comparação com um único stop loss, é possível julgar com mais clareza a direção da tendência; em comparação com um único time frame, ele filtra muito do ruído.

Código-fonte da estratégia
/*backtest
start: 2023-01-01 00:00:00
end: 2024-01-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="MTF Trailing SL Strategy [QuantNomad]", shorttitle = "MTF TrailingSL [QN]", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

////////////
// Inputs //

atr_length = input(14,    title = "ATR Length")
atr_mult   = input(2,     title = "ATR Mult",    type = input.float)

tf2 = input('120', title = "TF2", type = input.string)
tf3 = input('180', title = "TF3", type = input.string)
tf4 = input('240', title = "TF4", type = input.string)

// BACKTESTING RANGE
// From Date Inputs
fromDay   = input(defval = 1,    title = "From Day",   minval = 1, maxval = 31)
fromMonth = input(defval = 1,    title = "From Month", minval = 1, maxval = 12)
fromYear  = input(defval = 2016, title = "From Year",  minval = 1970)
 
// To Date Inputs
toDay   = input(defval = 1,    title = "To Day",   minval = 1, maxval = 31)
toMonth = input(defval = 1,    title = "To Month", minval = 1, maxval = 12)
toYear  = input(defval = 2100, title = "To Year",  minval = 1970)
 
// Calculate start/end date and time condition
startDate  = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear,   toMonth,   toDay,   00, 00)

time_cond = time >= startDate and time <= finishDate

//////////////////
// CALCULATIONS //


tsl() => 
    // SL values
    sl_val = atr_mult * atr(atr_length)
     
    // Init Variables
    pos         = 0
    trailing_sl = 0.0
    
    // Signals
    long_signal  = nz(pos[1]) !=  1 and high > nz(trailing_sl[1])
    short_signal = nz(pos[1]) != -1 and low  < nz(trailing_sl[1]) 
    
    // Calculate SL
    trailing_sl := short_signal     ? high + sl_val : 
                   long_signal      ? low  - sl_val : 
                   nz(pos[1]) ==  1 ? max(low  - sl_val, nz(trailing_sl[1])) :  
                   nz(pos[1]) == -1 ? min(high + sl_val, nz(trailing_sl[1])) : 
                   nz(trailing_sl[1])
                   
    // Position var               
    pos := long_signal  ? 1 : short_signal ? -1 : nz(pos[1]) 
    trailing_sl
    
    
trailing_sl1 = tsl()
trailing_sl2 = security(syminfo.tickerid, tf2, tsl())
trailing_sl3 = security(syminfo.tickerid, tf3, tsl())
trailing_sl4 = security(syminfo.tickerid, tf4, tsl())

pos1 = 0
pos1 := low <= trailing_sl1 ? -1 : high >= trailing_sl1 ? 1 : nz(pos1[1])

pos2 = 0
pos2 := low <= trailing_sl2 ? -1 : high >= trailing_sl2 ? 1 : nz(pos2[1])

pos3 = 0
pos3 := low <= trailing_sl3 ? -1 : high >= trailing_sl3 ? 1 : nz(pos3[1])

pos4 = 0
pos4 := low <= trailing_sl4 ? -1 : high >= trailing_sl4 ? 1 : nz(pos4[1])

total_pos = pos1 + pos2 + pos3 + pos4

//////////////
// PLOTINGS //

plot(trailing_sl1, linewidth = 2 , color = pos1 == 1 ? color.green : color.red, title = "TSL TF1")
plot(trailing_sl2, linewidth = 2 , color = pos2 == 1 ? color.green : color.red, title = "TSL TF2", transp = 25)
plot(trailing_sl3, linewidth = 2 , color = pos3 == 1 ? color.green : color.red, title = "TSL TF3", transp = 50)
plot(trailing_sl4, linewidth = 2 , color = pos4 == 1 ? color.green : color.red, title = "TSL TF4", transp = 75)

//////////////
// STRATEGY //

//strategy.entry("long",  true,  stop = trailing_sl1)
//strategy.entry("short", false, stop = trailing_sl1)

strategy.entry("long",    true, when = total_pos ==  4)
strategy.entry("short",  false, when = total_pos == -4)

strategy.close("long",  when = total_pos <= 0)
strategy.close("short", when = total_pos >= 0)