Estratégia de negociação de média móvel de momentum


Data de criação: 2024-01-24 11:09:58 última modificação: 2024-01-24 11:09:58
cópia: 0 Cliques: 614
1
focar em
1617
Seguidores

Estratégia de negociação de média móvel de momentum

Visão geral

A estratégia baseia-se no cruzamento de médias móveis rápidas e lentas para determinar a tendência do mercado e os pontos de compra e venda. Quando a EMA rápida atravessa a EMA lenta, o mercado é considerado em uma tendência ascendente e gera um sinal de compra. Quando a EMA rápida atravessa a EMA lenta, o mercado é considerado em uma tendência descendente e gera um sinal de venda.

Princípio da estratégia

A estratégia usa um cruzamento de uma EMA rápida (linha de 8 dias) e uma EMA lenta (linha de 21 dias) para determinar a tendência do mercado. A lógica específica é:

  1. Calcular o EMA de 8 e 21 dias
  2. Quando a EMA do dia 8 passa para a EMA do dia 21, a tendência ascendente começa a ser julgada como uma mudança de mercado
  3. Quando a EMA do dia 8 atravessa a EMA do dia 21, a tendência descendente começa a ser julgada como uma mudança de mercado
  4. Quando a tendência é ascendente, gera um sinal de compra; quando a tendência é descendente, gera um sinal de venda
  5. Configurar um preço de stop loss e um preço de parada para gerenciar o risco de cada ordem

A estratégia combina os indicadores de momentum e a análise de tendências para capturar de forma eficaz a direção e os pontos de reversão do mercado. Os EMAs de cruzamento rápido e suave combinados com as médias móveis podem filtrar parte do ruído dos sinais de negociação.

Análise de vantagens

As principais vantagens desta estratégia são:

  1. Os EMAs rápidos e os EMAs lentos cruzam-se para determinar a tendência e os pontos de venda
  2. Os parâmetros da estratégia têm muito espaço para otimização e o ciclo EMA pode ser ajustado ainda mais
  3. Combinação de indicadores de potência para filtrar eficazmente os sinais de ruído
  4. Configuração de lógica de parada de perda para controlar ativamente o risco

Em geral, a estratégia combina tendências e indicadores de dinâmica, que podem ser adaptados a diferentes condições de mercado por meio de ajustes de parâmetros, uma estratégia de negociação de linha curta relativamente flexível.

Análise de Riscos

A estratégia também traz alguns riscos:

  1. Em situações de turbulência, os sinais de cruzamento EMA são frequentes e geram mais transações erradas
  2. Incapacidade de lidar com a ocorrência de uma brecha de escape
  3. Não se considera a tendência de longo prazo em grande escala.

Para responder a esses riscos, podemos fazer otimizar as seguintes coisas:

  1. Adicionar filtros para outros indicadores, como banda Brin, KDJ, etc., para reduzir a probabilidade de sinais errados
  2. Combinação de indicadores de ciclo de nível maior para determinar tendências de longo prazo
  3. Parâmetros de otimização, ajustando a duração do EMA para adaptar-se a diferentes circunstâncias de mercado
  4. Negociação de intervenção humana para evitar que a brecha de vazio cause grandes perdas acima do limite de perda

Direção de otimização

A estratégia ainda tem muito espaço para otimização, principalmente nas seguintes direções:

  1. Optimizar os parâmetros do ciclo EMA para testar diferentes parâmetros de rendimento em dados históricos
  2. Adicionar filtragem de outros indicadores técnicos, como KDJ, MACD, etc., para aumentar a precisão da estratégia
  3. Otimização da configuração do Stop Loss Stop para melhor atender às características do cenário
  4. Parâmetros de otimização automática através de métodos de aprendizagem de máquina

Essas medidas de otimização podem aumentar significativamente a estabilidade, a adaptabilidade e a rentabilidade das estratégias.

Resumir

Esta estratégia é uma estratégia típica de negociação de curta linha baseada no seguimento de tendências e no cruzamento de indicadores de dinâmica. Combina o cruzamento de linhas rápidas e lentas da EMA e a lógica de stop loss para capturar rapidamente oportunidades de direção do mercado.

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"}]
*/

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

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)