Esta é uma estratégia de breakout baseada no rastreamento da tendência, que compra força quando uma breakout ocorre e vende fraqueza para rastrear a tendência.
A estratégia baseia-se principalmente em dois indicadores para determinar os sinais de entrada e saída - a função mais alta que determina o preço mais alto em um determinado período e a função mais baixa que determina o preço mais baixo em um determinado período.
Quando o preço de fechamento está acima do preço mais alto durante um determinado período (parâmetro highPeriod), é considerado uma quebra de tendência ascendente, portanto, é emitido um sinal longo.
A estratégia também define um stop loss móvel e um stop loss fixo. O stop loss móvel é baseado no indicador ATR, calculado por um valor ATR durante um determinado período multiplicado por um fator (parâmetro trailingAtrMultiplier) como o nível de stop loss móvel. O stop loss fixo é calculado de forma semelhante com base no indicador ATR.
Depois de ir longo ou curto, o stop loss fixo entra em vigor para a primeira barra; então ele muda para um stop loss principalmente móvel.
A estratégia também estabelece regras para o cálculo do tamanho da posição. Com base na percentagem máxima de perda aceitável, no capital da conta, etc., calcula o tamanho da posição adequado. Também leva em conta o número de instrumentos de negociação, reduzindo adequadamente o tamanho da posição para cada instrumento.
Em resumo, esta é uma estratégia típica de breakout de rastreamento de tendências.
As principais vantagens desta estratégia são:
Julgamento preciso da tendência Usando os preços mais altos e mais baixos para determinar se as tendências se inverteram, a precisão é muito alta e sinais falsos são improváveis.
Dimensão razoável da posição e stop loss. Definição de porcentagem máxima de perda, associação de patrimônio da conta, etc. tornam os tamanhos das posições razoáveis, evitando excesso de negociação ou negociação ineficaz. O stop loss combinado bloqueia os lucros e acompanha os movimentos da tendência.
É simples e prático, fácil de compreender e de usar, baseia-se apenas em indicadores básicos e a lógica é simples e fácil de entender.
Os parâmetros do indicador, as regras de dimensionamento da posição, etc., fornecem caixas de entrada para os utilizadores ajustarem conforme necessário.
Em resumo, esta é uma estratégia de fuga muito prática, segura e confiável em julgamento, enquanto o projeto considera o controle e rastreamento de riscos, muito adequado para a detenção de médio a longo prazo.
Os principais riscos desta estratégia são:
As estratégias de ruptura dependem fortemente do julgamento da tendência, se correr mal, podem enfrentar grandes perdas.
Risco de parâmetros inadequados. Se os parâmetros do ciclo de preços mais altos/mais baixos forem escolhidos de forma incorreta, as tendências podem ser perdidas. Parâmetros de dimensionamento de posição inadequados podem levar a perdas excessivas.
Se a distância de parada de perda em movimento for muito pequena, o ruído do mercado pode eliminar a posição prematuramente.
As principais soluções são:
Adicionar filtros de tendência, como indicadores adicionais para verificar falhas.
Otimizar a selecção dos parâmetros através de testes de estabilidade.
Relaxar a distância de stop loss adequadamente para suportar retracements razoáveis.
As principais direcções de otimização para esta estratégia são:
Adicionar mais indicadores para determinar tendências. Além dos preços mais altos / mais baixos, também podem ser adicionados indicadores como médias móveis para tornar a determinação da tendência mais precisa.
Teste e encontre as combinações ideais para parâmetros como ciclos de preços mais altos / mais baixos, fatores de multiplicador de stop loss, etc.
Ajustar o algoritmo de dimensionamento das posições com base nas condições do mercado, por exemplo, reduzir o tamanho das posições quando a volatilidade (por exemplo, VIX) aumenta.
Adicione um filtro de volume para confirmar a fuga, para evitar falsas fugas.
Considerar os spreads e as correlações na selecção dos instrumentos de negociação.
Otimize o mecanismo de stop loss. Teste diferentes composições de stop loss móveis e fixos para tornar os stop losses menos agressivos.
Como uma estratégia de breakout de rastreamento de tendências, esta estratégia tem um bom desempenho em termos de precisão de julgamento, dimensionamento de posições e controle de riscos, facilidade de operação, etc. Captura tendências precocemente e equilibra a tomada de lucro e o rastreamento através de movimentos de stop losses.
É claro que, como uma estratégia de ruptura, ele depende fortemente do julgamento da tendência e é propenso a interferências de ruído do mercado.
No geral, esta é uma estratégia muito prática. Sua estrutura básica já contém os componentes mais cruciais para uma estratégia de quantidade. Com otimizações e melhorias contínuas, ela definitivamente pode se tornar uma estratégia automatizada estável e rentável.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(shorttitle="Trend Surfers - Breakout", title="Trend Surfers - Premium Breakout", overlay=true) // Risk for position and pyramid maxriskval = input(2, "Max % risk", type = input.float, tooltip="Risk % over total equity / Position", group = "Risk Management") pairnumber = input(title = "How many pairs",type = input.integer, defval= 1, tooltip="How many pairs are you trading with the strategy?", group = "Risk Management") // Emtry Exit highPeriod = input(title="Highest High Period", type=input.integer, defval=168 , tooltip="Highest High of X bars - This will trigger a Long Entry when close is above. (Thin Green Line)" , group = "Entry Condition") lowPeriod = input(title="Lowest Low Period", type=input.integer, defval=168, tooltip="Lowest low of X bars - This will trigger a Short Entry when close is under. (Thin Red Line)" , group = "Entry Condition") // Stoploss trailingAtrPeriod = input(title="Trailing ATR Pediod", type=input.integer, defval=10, tooltip="Average True Range for the Trailing Stop. (Thick Green Line) " , group = "Exit Condition") trailingAtrMultiplier = input(title="Trailing ATR Multiplier", type=input.float, defval=8 , group = "Exit Condition") fixAtrPeriod = input(title="Fix ATR Pediod", type=input.integer, defval=10, tooltip="Average True Range for the Fix Stoloss. (Thick Yellow Line)" , group = "Exit Condition") fixAtrMultiplier = input(title="Fix ATR Multiplier", type=input.float, defval=2 , group = "Exit Condition") // Pair info pair = syminfo.basecurrency + syminfo.currency // High Low Variable highestHigh = highest(high, highPeriod)[1] lowestLow = lowest(low, lowPeriod)[1] trailingAtr = atr(trailingAtrPeriod) * trailingAtrMultiplier // Trade Condition longCondition = crossover(close, highestHigh) shortCondition = crossunder(close, lowestLow) // Risk Variable fixAtr = atr(fixAtrPeriod) * fixAtrMultiplier stopvaluelong = close[1] - fixAtr[1] stopvalueshort = close[1] + fixAtr[1] // Position size Long maxpossize = strategy.equity / close positionsizelong = ( ( ( (maxriskval/100) * strategy.equity) / (close - stopvaluelong))) stopperclong = ((close - stopvaluelong) / close) * 100 leveragelong = max(1, ceil(positionsizelong / maxpossize)) * 2 posperclong = (((positionsizelong * close) / strategy.equity) *100 / leveragelong) / pairnumber realposlong = (((posperclong / 100) * strategy.equity) * leveragelong) / close // Position size Short positionsizeshort = ( ( ( (maxriskval/100) * strategy.equity) / (stopvalueshort - close))) stoppercshort = ((close - stopvalueshort) / close) * 100 leverageshort = max(1, ceil(positionsizeshort / maxpossize)) * 2 pospercshort = (((positionsizeshort * close) / strategy.equity) *100 / leverageshort) / pairnumber realposshort = (((pospercshort / 100) * strategy.equity) * leverageshort) / close // Alert Message entry_long_message = '\nGo Long for ' + pair + 'NOW!' + '\nPosition Size % =' + tostring(posperclong) + '\nLeverage' + tostring(leveragelong) + '\nStoploss Price =' + tostring(stopvaluelong) + '\nClose any Short position that are open for ' + pair + '!' + '\n\nVisit TrendSurfersSignals.com' + '\nFor automated premium signals (FREE)' entry_short_message ='\nGo Short for ' + pair + 'NOW!' + '\nPosition Size % =' + tostring(pospercshort) + '\nLeverage' + tostring(leverageshort) + '\nStoploss Price =' + tostring(stopvalueshort) + '\nClose any Long position that are open for ' + pair + '!' + '\n\nVisit TrendSurfersSignals.com' + '\nFor automated premium signals (FREE)' exit_short_message = '\nExit Short for ' + pair + 'NOW!' + '\n\nVisit TrendSurfersSignals.com' + '\nFor automated premium signals (FREE)' exit_long_message = '\nExit Long for ' + pair + 'NOW!' + '\n\nVisit TrendSurfersSignals.com' + '\nFor automated premium signals (FREE)' // Order if longCondition strategy.entry("Long", strategy.long, stop=highestHigh, comment="Long", qty=realposlong , alert_message = entry_long_message) if shortCondition strategy.entry("Short", strategy.short, stop=lowestLow, comment="Short", qty=realposshort , alert_message = entry_short_message) // Stoploss Trailing longTrailing = close - trailingAtr shortTrailing = close + trailingAtr var longTrailingStop = 0.0 var shortTrailingStop = 999999.9 trailingStopLine = 0.0 trailingStopLine := na fixedStopLine = 0.0 fixedStopLine := na var inTrade = 0 if longCondition or shortCondition if 0 == inTrade if longCondition inTrade := 1 else inTrade := -1 if 1 == inTrade and (shortCondition or low <= max(fixedStopLine[1], longTrailingStop)) inTrade := 0 if -1 == inTrade and (longCondition or high >= min(fixedStopLine[1], shortTrailingStop)) inTrade := 0 longTrailingStop := if (1 == inTrade) stopValue = longTrailing max(stopValue, longTrailingStop[1]) else 0 shortTrailingStop := if (-1 == inTrade) stopValue = shortTrailing min(stopValue, shortTrailingStop[1]) else 999999 // Fix Stoploss firstPrice = 0.0 firstFixAtr = 0.0 firstPrice := na firstFixAtr := na if 0 != inTrade firstPrice := valuewhen(inTrade != inTrade[1] and 0 != inTrade, close, 0) firstFixAtr := valuewhen(inTrade != inTrade[1] and 0 != inTrade, fixAtr, 0) if 1 == inTrade fixedStopLine := firstPrice - firstFixAtr trailingStopLine := longTrailingStop else fixedStopLine := firstPrice + firstFixAtr trailingStopLine := shortTrailingStop if (strategy.position_size > 0) strategy.exit(id="L Stop", stop=max(fixedStopLine, longTrailingStop) , alert_message = exit_long_message) if (strategy.position_size < 0) strategy.exit(id="S Stop", stop=min(fixedStopLine, shortTrailingStop) , alert_message = exit_long_message) // Plot plot(highestHigh, color=color.green, linewidth=1, transp=0, title='Highest High') plot(lowestLow, color=color.red, linewidth=1, transp=0, title='Lowest Low') plot(trailingStopLine, color=color.lime, linewidth=2, transp=0, offset=1, title='Trailing Stop') plot(fixedStopLine, color=color.orange, linewidth=2, transp=0, offset=1, title='Fixed Stop')