Breakout de tendência - Estratégia de sombra longa

Autora:ChaoZhang, Data: 2023-11-15 16:43:17
Tags:

img

Esta estratégia julga a direção da tendência atual calculando a proporção de comprimento de sombra de alta / baixa e identifica a tendência com o indicador ATR.

Estratégia lógica

A estratégia avalia principalmente a tendência atual através do cálculo da relação de sombra de alta/baixa.

A lógica específica é:

  1. Calcular sombra de baixa: fechamento - baixa
  2. Calcule a sombra de alta: alta - aberta
  3. Tome o máximo de sombra de baixa e alta como comprimento da sombra
  4. Calcule o comprimento do corpo da vela: alto - baixo
  5. Calcular a relação entre a sombra e o comprimento do corpo
  6. Se o rácio for > 0,5 e de baixa > alta, julgar tendência descendente e posição longa
  7. Se o rácio for > 0,5 e de alta > baixa, julgar tendência ascendente e posição curta
  8. Validação de ruptura com comprimento da vela > 0,75 * ATR
  9. Estabelecer um stop loss e um take profit após a entrada, com um rácio de 2:1

O que precede é a lógica básica de negociação, identificando pontos de ruptura reversa com detecção de tendência e otimizando o lucro com stop loss/take profit.

Vantagens

  1. A proporção de sombras julga com precisão a tendência
  2. O ATR filtra falsos sinais de fuga.
  3. Stop loss e take profit gerem o risco
  4. Relação risco/recompensa 2: 1 atende ao padrão de negociação quantitativa
  5. Adequado para negociação a curto prazo de ações de alta volatilidade
  6. Lógica simples e clara, fácil de entender

Riscos

  1. A volatilidade dos preços pode afetar o stop loss e aumentar a perda
  2. O desempenho depende muito do ajuste dos parâmetros
  3. A inversão da tendência pode conduzir a perdas
  4. A expansão do stop loss/take profit pode aumentar a probabilidade de perda
  5. Uma fuga fracassada pode levar a grandes perdas.

Os riscos podem ser gerenciados por uma parada de perda razoável, otimização de parâmetros e saída oportuna da posição.

Reforço

A estratégia pode ser otimizada das seguintes formas:

  1. Otimizar o parâmetro de proporção de sombras para obter o melhor valor
  2. Otimizar o parâmetro ATR para o melhor comprimento da vela
  3. Otimizar os coeficientes stop loss/take profit para obter o melhor risco-recompensa
  4. Adicionar dimensionamento de posição como aumento gradual de posição
  5. Adicionar stop loss para proteção de lucros
  6. Adicionar outros indicadores aos sinais filtrados
  7. Otimizar o período de tempo de backtest e testar diferentes estágios de mercado

Com testes e otimização multifacetados, o desempenho da estratégia pode ser maximizado.

Em geral, esta estratégia beneficia das oscilações de preços de curto prazo através da identificação de tendências e gestão de riscos.


/*backtest
start: 2022-11-08 00:00:00
end: 2023-11-14 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/
// © ondrej17

//@version=4
strategy("longWickstrategy", overlay=true )
 
// Inputs
st_yr_inp = input(defval=2020, title='Backtest Start Year')
st_mn_inp = input(defval=01, title='Backtest Start Month')
st_dy_inp = input(defval=01, title='Backtest Start Day')
en_yr_inp = input(defval=2025, title='Backtest End Year')
en_mn_inp = input(defval=01, title='Backtest End Month')
en_dy_inp = input(defval=01, title='Backtest End Day')
sltp_inp = input(defval=0.8, title='N - % offset for N*SL and (2N)*TP')/100
 
// Dates
start = timestamp(st_yr_inp, st_mn_inp, st_dy_inp,00,00)
end = timestamp(en_yr_inp, en_mn_inp, en_dy_inp,00,00)
canTrade = time >= start and time <= end
// Indicators Setup


 
// Strategy Calcuations
lowerWick = (open > close) ? close-low : open - low
upperWick = (open > close) ? high-open : high-close
wickLength = max(lowerWick,upperWick)
candleLength = high-low
wickToCandleRatio = wickLength / candleLength
entryFilterCandleLength = candleLength > 0.75*atr(48)


// Entries and Exits
 
longCondition = entryFilterCandleLength and wickToCandleRatio > 0.5 and lowerWick > upperWick and canTrade and strategy.position_size == 0
shortCondition = entryFilterCandleLength and wickToCandleRatio > 0.5 and lowerWick < upperWick and canTrade and strategy.position_size == 0

strategy.entry("pendingLong", strategy.long, limit=low+wickLength/2, when = longCondition)
strategy.entry("pendingShort", strategy.short, limit=high-wickLength/2, when = shortCondition)

longStop = strategy.position_size > 0 ? strategy.position_avg_price*(1-sltp_inp) : na
longTP = strategy.position_size > 0 ? strategy.position_avg_price*(1+2*sltp_inp) : na
shortStop = strategy.position_size < 0 ? strategy.position_avg_price*(1+sltp_inp) : na
shortTP = strategy.position_size < 0 ? strategy.position_avg_price*(1-2*sltp_inp) : na

strategy.exit("longSLTP","pendingLong", stop=longStop, limit = longTP)
strategy.exit("shortSLTP","pendingShort", stop=shortStop, limit = shortTP)  
 

plot(longStop, color=color.red, style=plot.style_linebr, linewidth=2)
plot(shortStop, color=color.red, style=plot.style_linebr, linewidth=2)
plot(longTP, color=color.green, style=plot.style_linebr, linewidth=2)
plot(shortTP, color=color.green, style=plot.style_linebr, linewidth=2)

plotLongCondition = longCondition ? high+abs(open-close) : na
plot(plotLongCondition, style=plot.style_circles, linewidth=4, color=color.green)
plotShortCondition = shortCondition ? high+abs(open-close) : na
plot(plotShortCondition, style=plot.style_circles, linewidth=4, color=color.red)



Mais.