
A estratégia de seguimento de tendência de média móvel exponencial dupla é uma estratégia de acompanhamento de tendência baseada em cruzamentos de média. A estratégia determina a direção da tendência atual calculando a EMA rápida e a EMA lenta e baseando-se em sua interseção. Quando a linha rápida atravessa a linha lenta, é considerada uma posição de baixa; Quando a linha rápida atravessa a linha lenta, é considerada uma posição de baixa.
A lógica central da estratégia é calcular a média EMA de dois períodos diferentes, um como linha de cabeça vazia e outro como linha de cabeça múltipla. Concretamente, a estratégia calcula uma média EMA rápida de 8 ciclos, como linha de cabeça múltipla, com o indicador talib; além disso, calcula uma média EMA lenta de 21 ciclos, como linha de cabeça vazia.
A estratégia pode executar operações de negociação em excesso ou em vazio; ou pode ser executada em ambos os sentidos quando uma linha rápida e lenta se cruza. Além disso, a estratégia também configura um preço de parada e parada. Após a abertura da posição, se a direção do preço for negativa, a parada será retirada; se a operação do preço atingir o objetivo esperado, a parada será encerrada.
A maior vantagem da estratégia de acompanhamento de dupla linha de equilíbrio da EMA é que ela usa a forte capacidade de discernimento de tendências do cruzamento da linha de equilíbrio. A linha de equilíbrio da EMA é uma ferramenta de discernimento de tendências comumente usada para identificar a tendência de mudança de preço e o momento de reversão através do cruzamento da linha de equilíbrio.
Além disso, a estratégia de configuração de direção de negociação flexível, que pode adaptar-se a um cenário unidirecional, mas também pode capturar oportunidades bidirecionais de preços em zonas de choque, aumenta a praticidade da estratégia. Ao mesmo tempo, a configuração de stop loss, pode controlar eficazmente o risco, bloqueando parte dos lucros.
O maior risco da estratégia de seguimento de dupla linha média de EMA é que o cruzamento de pequenas dimensões em situações de choque causa o desencadeamento frequente de sinais de cruzamento e falsos sinais. Isso levará a uma estratégia de abertura e perda frequentes. Nesse caso, o ciclo de EMA pode ser aumentado adequadamente, reduzindo a frequência de cruzamento e a probabilidade de ocorrência de falsos sinais.
Por outro lado, a definição de um limite de perda muito pequeno também aumenta a probabilidade de uma estratégia ser atingida. Nesse caso, o limite de perda pode ser expandido de forma apropriada, mas o risco de arbitragem também deve ser compensado.
A estratégia pode ser melhorada em alguns aspectos:
Ajuste dinâmico do ciclo da linha média do EMA. Pode ser feito de acordo com a volatilidade do mercado e os resultados da avaliação dos parâmetros ótimos, para que o ciclo do EMA mude de forma dinâmica, evitando problemas de sobreajuste no período fixo.
Aumentar a condição de filtragem para filtração de falsos sinais. Por exemplo, pode ser combinado com o volume de transação, para filtrar o falso cruzamento gerado por pequenas oscilações. Também pode ser combinado com outros indicadores, como MACD, KDJ, etc., para evitar a geração de sinais em períodos de incerteza.
Otimizar a estratégia de parada de perda, combinada com indicadores como o ATR, pode permitir o acompanhamento dinâmico da parada de perda.
Teste diferentes períodos de detenção. Períodos de detenção muito longos, que são facilmente afetados por eventos inesperados; Períodos de detenção muito curtos, com custos de transação e custos de deslizamento mais elevados. Encontre o melhor número de dias de detenção para aumentar a rentabilidade da estratégia.
A estratégia de acompanhamento de dupla EMA é uma estratégia de acompanhamento de tendência robusta e prática. Ela usa a EMA para determinar a tendência de preços e pode capturar efetivamente a direção da tendência.
/*backtest
start: 2024-01-02 00:00:00
end: 2024-02-01 00:00:00
period: 2h
basePeriod: 15m
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/
// © TradersPostInc
//@version=5
strategy('TradersPost Example MOMO Strategy', overlay=true, default_qty_value=100, initial_capital=100000, default_qty_type=strategy.percent_of_equity, pyramiding=0)
startTime = input(defval = timestamp('01 Jan 2021 00:00 +0000'), title = 'Start Time', group = 'Date Range')
endTime = input(defval = timestamp('31 Dec 2023 23:59 +0000'), title = 'End Time', group = 'Date Range')
timeCondition = true
timeConditionEnd = timeCondition[1] and not timeCondition
fastEmaLength = input.int(defval = 8, title = 'Fast EMA Length')
slowEmaLength = input.int(defval = 21, title = 'Slow EMA Length')
sides = input.string(defval = 'Both', title = 'Sides', options = ['Long', 'Short', 'Both', 'None'])
fastEma = ta.ema(close, fastEmaLength)
slowEma = ta.ema(close, slowEmaLength)
isUptrend = fastEma >= slowEma
isDowntrend = fastEma <= slowEma
trendChanging = ta.cross(fastEma, slowEma)
ema105 = request.security(syminfo.tickerid, '30', ta.ema(close, 105)[1], barmerge.gaps_off, barmerge.lookahead_on)
ema205 = request.security(syminfo.tickerid, '30', ta.ema(close, 20)[1], barmerge.gaps_off, barmerge.lookahead_on)
plot(ema105, linewidth=4, color=color.new(color.purple, 0), editable=true)
plot(ema205, linewidth=2, color=color.new(color.purple, 0), editable=true)
aa = plot(fastEma, linewidth=3, color=color.new(color.green, 0), editable=true)
bb = plot(slowEma, linewidth=3, color=color.new(color.red, 0), editable=true)
fill(aa, bb, color=isUptrend ? color.green : color.red, transp=90)
tradersPostBuy = trendChanging and isUptrend and timeCondition
tradersPostSell = trendChanging and isDowntrend and timeCondition
pips = syminfo.pointvalue / syminfo.mintick
percentOrPipsInput = input.string('Percent', title='Percent or Pips', options=['Percent', 'Pips'])
stopLossLongInput = input.float(defval=0, step=0.01, title='Stop Loss Long', minval=0)
stopLossShortInput = input.float(defval=0, step=0.01, title='Stop Loss Short', minval=0)
takeProfitLongInput = input.float(defval=0, step=0.01, title='Target Profit Long', minval=0)
takeProfitShortInput = input.float(defval=0, step=0.01, title='Target Profit Short', minval=0)
stopLossPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (stopLossLongInput / 100) * pips
stopLossPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (stopLossShortInput / 100) * pips
takeProfitPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (takeProfitLongInput / 100) * pips
takeProfitPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (takeProfitShortInput / 100) * pips
takeProfitALong = takeProfitLongInput > 0 ? takeProfitLongInput : na
takeProfitBLong = takeProfitPriceLong > 0 ? takeProfitPriceLong : na
takeProfitAShort = takeProfitShortInput > 0 ? takeProfitShortInput : na
takeProfitBShort = takeProfitPriceShort > 0 ? takeProfitPriceShort : na
stopLossALong = stopLossLongInput > 0 ? stopLossLongInput : na
stopLossBLong = stopLossPriceLong > 0 ? stopLossPriceLong : na
stopLossAShort = stopLossShortInput > 0 ? stopLossShortInput : na
stopLossBShort = stopLossPriceShort > 0 ? stopLossPriceShort : na
takeProfitLong = percentOrPipsInput == 'Pips' ? takeProfitALong : takeProfitBLong
stopLossLong = percentOrPipsInput == 'Pips' ? stopLossALong : stopLossBLong
takeProfitShort = percentOrPipsInput == 'Pips' ? takeProfitAShort : takeProfitBShort
stopLossShort = percentOrPipsInput == 'Pips' ? stopLossAShort : stopLossBShort
buyAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "buy", "price": ' + str.tostring(close) + '}'
sellAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "sell", "price": ' + str.tostring(close) + '}'
exitLongAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}'
exitShortAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}'
if (sides != "None")
if tradersPostBuy
strategy.entry('Long', strategy.long, when = sides != 'Short', alert_message = buyAlertMessage)
strategy.close('Short', when = sides == "Short" and timeCondition, alert_message = exitShortAlertMessage)
if tradersPostSell
strategy.entry('Short', strategy.short, when = sides != 'Long', alert_message = sellAlertMessage)
strategy.close('Long', when = sides == 'Long', alert_message = exitLongAlertMessage)
exitAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit"}'
strategy.exit('Exit Long', from_entry = "Long", profit = takeProfitLong, loss = stopLossLong, alert_message = exitAlertMessage)
strategy.exit('Exit Short', from_entry = "Short", profit = takeProfitShort, loss = stopLossShort, alert_message = exitAlertMessage)
strategy.close_all(when = timeConditionEnd)