Estratégia de acompanhamento de fuga


Data de criação: 2024-01-31 17:06:36 última modificação: 2024-01-31 17:06:36
cópia: 0 Cliques: 1280
1
focar em
1617
Seguidores

Estratégia de acompanhamento de fuga

Visão geral

A ideia principal da estratégia é identificar a direção da tendência em um período de tempo maior e encontrar um ponto de entrada de ruptura em um período de tempo menor, enquanto o ponto de saída de parada segue a média móvel em um período de tempo maior.

Princípio da estratégia

A estratégia baseia-se em três indicadores principais:

Em primeiro lugar, o cálculo de uma média móvel simples de X dias de um período mais longo (como a linha do dia) só permite a compra quando a média móvel está na estação de preço. Isso pode ser usado para determinar a direção da tendência geral e evitar períodos de volatilidade de negociação.

Em segundo lugar, calcule o máximo preço de um período mais curto (por exemplo, 5 dias) e, quando o preço supera esse máximo, aumente o sinal de compra. Combine isso com um retrospecto do parâmetro de ciclo lb para encontrar o ponto de ruptura apropriado.

Terceiro, estabelecer uma linha de stop loss. Depois de entrar em posição, a linha de stop loss é bloqueada no preço mínimo de um determinado período de lbStop a partir do ponto mais baixo mais próximo. Ao mesmo tempo, definir uma média móvel (como a EMA de 10 dias da linha solar) como mecanismo de saída para sair da posição quando o preço estiver abaixo dessa média móvel.

A estratégia também define o valor do ATR para evitar a compra de pontos exagerados. Além disso, existem outras condições auxiliares, como o intervalo de tempo de retracção.

A interação dos três indicadores acima constitui a lógica central da estratégia.

Análise de vantagens estratégicas

Esta é uma estratégia inovadora de rastreamento, com as seguintes vantagens:

  1. Usando dois períodos de tempo, para evitar ser preso a falsas rupturas em mercados turbulentos. O período de tempo mais longo é para julgar a tendência geral, e o período mais curto é para encontrar pontos de entrada específicos.

  2. Utilizando os pontos de ruptura que formam o swing high, esses tipos de rupturas têm uma certa inercia e são facilmente rastreáveis. Ao mesmo tempo, olhando para o parâmetro de lb do ciclo, pode ser ajustado para encontrar rupturas realmente eficazes.

  3. O método de stop loss é mais rigoroso, rastreando os baixos mais recentes e deixando uma certa distância de amortecimento para evitar ser bloqueado.

  4. A utilização de médias móveis como mecanismo de saída permite uma paralisação flexível conforme as circunstâncias.

  5. O indicador ATR evita os riscos de excesso de liberação.

  6. Pode-se configurar diferentes combinações de parâmetros para testar o efeito, com maior espaço para otimização.

Análise de Riscos

A estratégia também traz alguns riscos:

  1. Quando os preços oscilam para cima e para baixo perto da média móvel, é fácil ser repetidamente trocado para dentro e para fora da posição. Isso corre o risco de maiores comissões.

  2. Quando os pontos de compra se aproximam da média móvel, há um risco maior de retração. Isso é uma característica da própria estratégia.

  3. Quando a tendência não é visível, o tempo de manutenção pode ser muito longo e o risco de tempo é alto.

  4. É necessário definir razoavelmente os parâmetros do ATR. Se o ATR for muito pequeno, o filtro será fraco, se for muito grande, a chance de entrada será menor.

  5. É necessário testar a influência de diferentes parâmetros de lb sobre os resultados. Parâmetros muito grandes podem perder algumas oportunidades, e parâmetros muito pequenos podem identificar falsas brechas.

A solução para o risco:

  1. Ajuste adequadamente os parâmetros da média móvel, aumentando a filtragem.
  2. Optimizar os parâmetros do ATR e auxiliar o julgamento visual.
  3. Ajuste o retorno do ciclo lb para encontrar o melhor parâmetro.
  4. Suspensão de transações em caso de convulsões.

Direção de otimização da estratégia

A estratégia também pode ser otimizada a partir das seguintes dimensões:

  1. Teste diferentes combinações de parâmetros de média móvel para encontrar o melhor parâmetro.

  2. Experimente diferentes configurações de parâmetros ATR para equilibrar as oportunidades de entrada e o controle de risco.

  3. Optimizar o período de revisão dos parâmetros lb, identificando rupturas mais eficientes.

  4. Tente estabelecer um stop loss dinâmico para controlar o risco com base na volatilidade e na retração.

  5. A eficácia da brecha é avaliada em combinação com outros fatores, como o volume de transações.

  6. Desenvolver métodos de busca de extremos como referência.

  7. Tente Machine Learning para treinar os parâmetros para obter o parâmetro ideal

Resumir

A estratégia como um todo é uma estratégia típica de rastreamento de breakout. O julgamento de dois quadros de tempo, o Swing High identifica o momento de entrada, a linha de parada e o mecanismo de saída de seguro duplo da média móvel, formando um sistema lógico completo. As características de risco e ganho da estratégia são mais claras e adequadas para os investidores do tipo de rastreamento de linha média e longa. Embora haja um certo risco, o nível de risco pode ser reduzido com a otimização de parâmetros e otimização de regras.

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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © millerrh

// The intent of this strategy is to buy breakouts with a tight stop on smaller timeframes in the direction of the longer term trend.
// Then use a trailing stop of a close below either the 10 MA or 20 MA (user choice) on that larger timeframe as the position 
// moves in your favor (i.e. whenever position price rises above the MA).
// Option of using daily ATR as a measure of finding contracting ranges and ensuring a decent risk/reward.
// (If the difference between the breakout point and your stop level is below a certain % of ATR, it could possibly find those consolidating periods.)

//@version=4
strategy("Qullamaggie Breakout", overlay=true, initial_capital=10000, currency='USD', 
   default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)
   
// === BACKTEST RANGE ===
Start = input(defval = timestamp("01 Jan 2019 06:00 +0000"), title = "Backtest Start Date", type = input.time)
Finish = input(defval = timestamp("01 Jan 2100 00:00 +0000"), title = "Backtest End Date", type = input.time)

// Inputs
lb = input(defval = 3, title = "Lookback Period for Swing High", minval = 1,
   tooltip = "Lookback period for defining the breakout level.")
lbStop = input(defval = 3, title = "Lookback Bars for Stop Level", minval = 1,
   tooltip = "Initial stop placement is the lowest low this many bars back. Allows for tighter stop placement than referencing swing lows.")  
htf = input(defval="D", title="Timeframe of Moving Averages", type=input.resolution,
  tooltip = "Allows you to set a different time frame for the moving averages. The default behavior is to identify good tightening setups on a larger timeframe
  (like daily) and enter the trade on a breakout occuring on a smaller timeframe, using the moving averages of the larger timeframe to trail your stop.")
maType = input(defval="SMA", options=["EMA", "SMA"], title = "Moving Average Type")
ma1Length = input(defval = 10, title = "1st Moving Average Length", minval = 1)
ma2Length = input(defval = 20, title = "2nd Moving Average Length", minval = 1)
ma3Length = input(defval = 50, title = "3rd Moving Average Length", minval = 1)
useMaFilter = input(title = "Use 3rd Moving Average for Filtering?", type = input.bool, defval = true,
  tooltip = "Signals will be ignored when price is under this slowest moving average.  The intent is to keep you out of bear periods and only
             buying when price is showing strength or trading with the longer term trend.")
trailMaInput = input(defval="2nd Moving Average", options=["1st Moving Average", "2nd Moving Average"], title = "Trailing Stop")

// MA Calculations
ma(maType, src, length) =>
    maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
ma1 = security(syminfo.tickerid, htf, ma(maType, close, ma1Length))
ma2 = security(syminfo.tickerid, htf, ma(maType, close, ma2Length))
ma3 = security(syminfo.tickerid, htf, ma(maType, close, ma3Length))

plot(ma1, color=color.purple, style=plot.style_line, title="MA1", linewidth=2, transp = 60)
plot(ma2, color=color.yellow, style=plot.style_line, title="MA2", linewidth=2, transp = 60)
plot(ma3, color=color.white, style=plot.style_line, title="MA3", linewidth=2, transp = 60)

// === USE ATR FOR FILTERING ===
// The idea here is that you want to buy in a consolodating range for best risk/reward. So here you can compare the current distance between 
// support/resistance vs.the ATR and make sure you aren't buying at a point that is too extended from normal.
useAtrFilter = input(title = "Use ATR for Filtering?", type = input.bool, defval = false,
  tooltip = "Signals will be ignored if the distance between support and resistance is larger than a user-defined percentage of Daily ATR. 
             This allows the user to ensure they are not buying something that is too extended and instead focus on names that are consolidating more.")
atrPerc = input(defval = 100, title = "% of Daily ATR Value", minval = 1)
atrValue = security(syminfo.tickerid, "D", atr(14))*atrPerc*.01

// === PLOT SWING HIGH/LOW AND MOST RECENT LOW TO USE AS STOP LOSS EXIT POINT ===
// Change these values to adjust the look back and look forward periods for your swing high/low calculations
pvtLenL = lb
pvtLenR = lb

// Get High and Low Pivot Points
pvthi_ = pivothigh(high, pvtLenL, pvtLenR)
pvtlo_ = pivotlow(low, pvtLenL, pvtLenR)

// Force Pivot completion before plotting.
Shunt = 1 //Wait for close before printing pivot? 1 for true 0 for flase
maxLvlLen = 0 //Maximum Extension Length
pvthi = pvthi_[Shunt]
pvtlo = pvtlo_[Shunt]

// Count How many candles for current Pivot Level, If new reset.
counthi = barssince(not na(pvthi))
countlo = barssince(not na(pvtlo))
 
pvthis = fixnan(pvthi)
pvtlos = fixnan(pvtlo)
hipc = change(pvthis) != 0 ? na : color.maroon
lopc = change(pvtlos) != 0 ? na : color.green

// Display Pivot lines
plot((maxLvlLen == 0 or counthi < maxLvlLen) ? pvthis : na, color=hipc, transp=0, linewidth=1, offset=-pvtLenR-Shunt, title="Top Levels")
// plot((maxLvlLen == 0 or countlo < maxLvlLen) ? pvtlos : na, color=lopc, transp=0, linewidth=1, offset=-pvtLenR-Shunt, title="Bottom Levels")
plot((maxLvlLen == 0 or counthi < maxLvlLen) ? pvthis : na, color=hipc, transp=0, linewidth=1, offset=0, title="Top Levels 2")
// plot((maxLvlLen == 0 or countlo < maxLvlLen) ? pvtlos : na, color=lopc, transp=0, linewidth=1, offset=0, title="Bottom Levels 2")

// BUY CONDITIONS
stopLevelCalc = valuewhen(pvtlo_, low[pvtLenR], 0) //Stop Level at Swing Low
buyLevel = valuewhen(pvthi_, high[pvtLenR], 0) //Buy level at Swing High
plot(buyLevel, style=plot.style_line, color=color.blue, title = "Current Breakout Level", show_last=1, linewidth=1, transp=50, trackprice=true)

// Conditions for entry and exit
stopLevel = float(na) // Define stop level here as "na" so that I can reference it in the inPosition 
  // variable and the ATR calculation before the stopLevel is actually defined.
buyConditions = (useMaFilter ? buyLevel > ma3 : true) and
  (useAtrFilter ? (buyLevel - stopLevel[1]) < atrValue : true)
// buySignal = high > buyLevel and buyConditions
buySignal = crossover(high, buyLevel) and buyConditions
trailMa = trailMaInput == "1st Moving Average" ? ma1 : ma2
sellSignal = crossunder(close, trailMa)
// sellSignal = security(syminfo.tickerid, htf, close < trailMa) and security(syminfo.tickerid, htf, close[1] < trailMa)


// STOP AND PRICE LEVELS
inPosition = bool(na)
inPosition := buySignal[1] ? true : sellSignal[1] ? false : low <= stopLevel[1] ? false : inPosition[1]

lowDefine = lowest(low, lbStop)
stopLevel := inPosition ? stopLevel[1] : lowDefine
// plot(stopLevel)

buyPrice = buyLevel
buyPrice := inPosition ? buyPrice[1] : buyLevel
plot(stopLevel, style=plot.style_line, color=color.orange, title = "Current Stop Level", show_last=1, linewidth=1, transp=50, trackprice=true)
plot(inPosition ? stopLevel : na, style=plot.style_circles, color=color.orange, title = "Historical Stop Levels", transp=50, trackprice=false)
// plot(buyPrice, style=plot.style_line, color=color.blue, linewidth=1, transp=50, trackprice=true)

// (STRATEGY ONLY) Comment out for Study
strategy.entry("Long", strategy.long, stop = buyLevel, when = buyConditions)
strategy.exit("Exit Long", from_entry = "Long", stop=stopLevel[1])
if (low[1] > trailMa)
    strategy.close("Long", when = sellSignal)
// if (low[1] > trailMa)
//     strategy.exit("Exit Long", from_entry = "Long", stop=trailMa) //to get this to work right, I need to reference highest highs instead of swing highs
    //because it can have me buy right back in after selling if the stop level is above the last registered swing high point.