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

Autora:ChaoZhang, Data: 2024-01-24 11:09:58
Tags:

img

Resumo

Esta estratégia gera sinais de negociação baseados no cruzamento entre linhas médias móveis rápidas e lentas para determinar tendências e pontos de entrada do mercado. Quando a EMA rápida cruza acima da EMA lenta, julga-se que o mercado está em uma tendência ascendente e um sinal de compra é gerado. Quando a EMA rápida cruza abaixo da EMA lenta, julga-se que o mercado está em uma tendência descendente e um sinal de venda é gerado. A estratégia também define o stop loss e os preços de lucro para gerenciar riscos.

Estratégia lógica

A estratégia utiliza o cruzamento entre uma EMA rápida (8 dias) e uma EMA lenta (21 dias) para determinar a tendência do mercado.

  1. Calcular a EMA de 8 dias e a EMA de 21 dias
  2. Quando a EMA de 8 dias cruza acima da EMA de 21 dias, determina-se que a tendência de mercado se invertiu e uma tendência ascendente começou.
  3. Quando a EMA de 8 dias cruza abaixo da EMA de 21 dias, determina-se que a tendência de mercado se invertiu e que uma tendência descendente começou.
  4. Durante uma tendência de alta, um sinal de compra é gerado.
  5. Estabelecer preços de stop loss e take profit para gerir os riscos para cada posição

A estratégia combina indicadores de impulso e análise de tendências para capturar efetivamente a direção do mercado e os pontos de reversão.

Análise das vantagens

As principais vantagens desta estratégia são:

  1. Os cruzamentos rápidos e lentos da EMA podem determinar eficazmente as tendências do mercado e os sinais de negociação
  2. Grande espaço de otimização para os parâmetros da estratégia onde os períodos de EMA podem ser ajustados ainda mais
  3. Os sinais de ruído podem ser efetivamente filtrados incorporando indicadores de momento
  4. Controle ativo do risco através da configuração da lógica de stop loss e take profit

Em resumo, a estratégia combina indicadores de tendência e impulso. Através do ajuste de parâmetros, ela pode se adaptar a diferentes ambientes de mercado e é uma estratégia de negociação de curto prazo relativamente flexível.

Análise de riscos

Há também alguns riscos com esta estratégia:

  1. Em mercados variados, sinais de cruzamento frequentes da EMA podem gerar mais transacções falsas
  2. O risco de lacuna não é gerido de forma eficaz
  3. Não é considerada a direcção da tendência a longo prazo

Para fazer face a estes riscos, podem ser feitas algumas otimizações:

  1. Adicionar outros filtros como Bandas de Bollinger, KDJ para reduzir falsos sinais
  2. Incorporar indicadores de prazo mais longo para determinar a tendência a longo prazo
  3. Otimizar parâmetros como comprimentos de EMA para se adaptar a diferentes mercados
  4. Intervenção manual para evitar perdas enormes de deslizamento devido a lacunas

Orientações de otimização

Ainda há muito espaço para otimizar esta estratégia:

  1. Otimizar os parâmetros do período EMA com base no desempenho histórico
  2. Adicionar outros indicadores técnicos para filtragem de sinais, por exemplo, KDJ, MACD para melhorar a precisão
  3. Otimizar as configurações de stop loss e take profit para melhor se adequarem às características do mercado
  4. Usar técnicas de aprendizagem de máquina para otimização automatizada de parâmetros

Estas medidas podem melhorar consideravelmente a estabilidade, a adaptabilidade e a rentabilidade da estratégia.

Conclusão

Em conclusão, esta é uma estratégia de negociação de curto prazo típica baseada em seguimento de tendências e cruzes de indicadores de impulso. Combina a lógica de cruzamento EMA e stop loss / take profit para capturar rapidamente oportunidades de mercado direcionais. Há amplo espaço para otimização através da introdução de outros indicadores de assistência e métodos automatizados de ajuste de parâmetros, o que pode tornar o desempenho da estratégia mais estável e excelente.


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

Mais.