Com base na estratégia de fuga de acompanhamento de tendências


Data de criação: 2024-01-22 17:21:10 última modificação: 2024-01-22 17:21:10
cópia: 0 Cliques: 545
1
focar em
1617
Seguidores

Com base na estratégia de fuga de acompanhamento de tendências

Visão geral

Trata-se de uma estratégia de ruptura baseada no acompanhamento de tendências. Compra ações de alta intensidade quando ocorre uma ruptura e vende ações de baixa intensidade quando ocorre uma ruptura, permitindo o acompanhamento de tendências.

Princípio da estratégia

A estratégia baseia-se principalmente em dois indicadores para julgar os sinais de entrada e saída, um é o preço mais alto dentro de um determinado período de julgamento da função highest () e um é o preço mais baixo dentro de um determinado período de julgamento da função lowest ().

Quando o preço de fechamento é superior ao preço máximo do período anterior, considera-se uma ruptura da tendência ascendente e, portanto, é emitido um sinal negativo. Quando o preço de fechamento é inferior ao preço mínimo do período anterior, considera-se uma ruptura da tendência descendente e, portanto, é emitido um sinal negativo.

Esta estratégia define o stop loss móvel e o stop loss fixo simultaneamente. O stop loss móvel é baseado no indicador ATR, calculado pelo valor do ATR em um determinado período e multiplicado por um múltiplo (parameter trailingAtrMultiplier) como ponto de stop loss móvel. O stop loss fixo é similar, calculado com base no indicador ATR.

A primeira linha K de raiz fixa, depois de fazer mais curto-circuito, é efetuada; depois é convertida em uma linha K de raiz móvel. Esta combinação pode bloquear parte dos lucros e, ao mesmo tempo, acompanhar a tendência.

A estratégia também estabelece regras para o cálculo das posições. As posições são calculadas com base na porcentagem de perdas máximas aceitáveis, direitos e interesses da conta.

Em geral, esta é uma estratégia típica de seguimento de tendências, que entra no campo quando se julga que a ruptura ocorreu, bloqueando os lucros e seguindo a tendência através de um stop loss e saindo do campo quando a tendência se inverte.

Análise de vantagens

É uma estratégia inovadora, cujas principais vantagens são:

  1. A precisão de julgar a tendência. Usar o preço mais alto e o preço mais baixo para julgar se a tendência está invertida. A precisão é alta e não é fácil emitir sinais errados.

  2. A posição e a ciência de stop loss são razoáveis. A configuração da proporção máxima de perda, a correlação de interesses da conta, etc., tornam a posição razoável, evitando transações excessivas ou inválidas. A combinação de stop loss bloqueia os lucros e segue a tendência.

  3. Simples, prático e fácil de entender. Apenas os indicadores mais básicos são necessários, a lógica da estratégia é simples, clara e fácil de dominar.

  4. Boa escalabilidade. Parâmetros de indicadores, regras de posicionamento, etc. são fornecidos em caixas de entrada, que o usuário pode ajustar conforme necessário.

Em geral, é uma estratégia de ruptura muito prática. É segura e confiável em termos de julgamento, mas a estratégia é projetada com o controle e o rastreamento do risco em mente. É muito adequada para a posse de linhas médias e longas.

Análise de Riscos

Os principais riscos desta estratégia são:

  1. Risco de reversão de tendência. A estratégia de ruptura depende muito do julgamento de tendências, podendo ter grandes perdas se for mal julgado.

  2. Risco de parâmetros inadequados. A escolha inadequada dos parâmetros do ciclo de preços mais altos e mais baixos pode perder a tendência, e a configuração inadequada dos parâmetros de posição pode causar perdas excessivas.

  3. O risco de um stop loss ser muito radical. Se o stop loss móvel for muito pequeno, pode ser eliminado pelo ruído do mercado.

Os principais soluções são:

  1. Adicionar filtros de tendência. Por exemplo, adicionar outros indicadores de julgamento para evitar erros de ruptura.

  2. Optimizar a seleção de parâmetros. Testar os parâmetros para obter valores de otimização e garantir sua estabilidade.

  3. A distância de travamento pode ser adequadamente relaxada. A distância de travamento pode ser adaptada a uma certa regressão.

Direção de otimização

A estratégia pode ser melhorada em:

  1. Adicionar mais indicadores para julgar a tendência. Além do preço máximo mínimo, pode-se adicionar julgamentos como a média móvel, para que o julgamento da tendência seja mais preciso.

  2. Configuração de parâmetros de otimização. Teste os parâmetros do ciclo de preço mínimo e máximo, parâmetros de parâmetros de parâmetros de parâmetros de parâmetros de parâmetros de parâmetros de parâmetros de parâmetros de parâmetros de parâmetros de parâmetros de parâmetros de parâmetros de parâmetros de parâmetros de parâmetros de parâmetros de parâmetros de parâmetros de parâmetros de parâmetros de parâmetros de parâmetros.

  3. De acordo com o algoritmo de posição de ajuste de mercado. Pode permitir que a posição esteja vinculada à volatilidade do mercado, como a queda da posição quando o VIX sobe.

  4. Aumentar a quantidade de capacidade indica filtragem. Apenas entrar em uma brecha de amplificação de quantidade, para evitar falsas brechas.

  5. Considere variedades preferenciais de negociação com base e correlação. Escolha uma combinação de variedades com baixa variação de base e baixa correlação para reduzir o risco da combinação.

  6. Otimizar e ajustar o mecanismo de suspensão. Pode testar a combinação proporcional de suspensão móvel e suspensão fixa, reduzindo o risco de suspensão excessivamente radical.

Resumir

A estratégia funciona bem como uma estratégia de ruptura do tipo de rastreamento de tendências, em termos de precisão de julgamento, controle de posição e risco, facilidade de operação. Captura tendências mais cedo, equilibra o bloqueio de lucros e o rastreamento de tendências com um stop loss móvel.

Claro, como uma estratégia de ruptura, ele é altamente dependente de julgamento de tendências e é facilmente perturbado pelo ruído. Além disso, a configuração inadequada de parâmetros também pode afetar o desempenho da estratégia. Isso precisa ser resolvido com mais otimização.

Em geral, é uma estratégia muito prática, e sua estrutura básica já contém os elementos mais importantes necessários para uma estratégia de quantificação. Se puder ser constantemente otimizada e melhorada, pode ser uma estratégia de programação de lucro estável.

Código-fonte da estratégia
/*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')