Estratégia de rastreamento de tendências

Autora:ChaoZhang, Data: 2024-01-22 17:21:10
Tags:

img

Resumo

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.

Estratégia lógica

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.

Análise das vantagens

As principais vantagens desta estratégia são:

  1. 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.

  2. 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.

  3. É 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.

  4. 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.

Análise de riscos

Os principais riscos desta estratégia são:

  1. As estratégias de ruptura dependem fortemente do julgamento da tendência, se correr mal, podem enfrentar grandes perdas.

  2. 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.

  3. 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:

  1. Adicionar filtros de tendência, como indicadores adicionais para verificar falhas.

  2. Otimizar a selecção dos parâmetros através de testes de estabilidade.

  3. Relaxar a distância de stop loss adequadamente para suportar retracements razoáveis.

Orientações de otimização

As principais direcções de otimização para esta estratégia são:

  1. 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.

  2. 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.

  3. 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.

  4. Adicione um filtro de volume para confirmar a fuga, para evitar falsas fugas.

  5. Considerar os spreads e as correlações na selecção dos instrumentos de negociação.

  6. Otimize o mecanismo de stop loss. Teste diferentes composições de stop loss móveis e fixos para tornar os stop losses menos agressivos.

Conclusão

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')

Mais.