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

Autora:ChaoZhang, Data: 2023-12-27 16:07:49
Tags:

img

Resumo

Esta estratégia gera sinais de compra e venda com base na cruz de ouro e cruz de morte das médias móveis. Especificamente, usa uma média móvel exponencial de 5 dias (EMA) e uma média móvel exponencial dupla de 34 dias (DEMA). Quando a EMA de 5 dias de curto prazo cruza acima da DEMA de 34 dias de longo prazo, um sinal de compra é gerado. Quando a EMA de 5 dias de curto prazo cruza abaixo da DEMA de 34 dias de longo prazo, um sinal de venda é gerado.

Estratégia lógica

  1. Calcular a EMA de 5 dias e a DEMA de 34 dias
  2. Gerar um sinal de compra quando a EMA de 5 dias de curto prazo cruzar acima da DEMA de 34 dias de longo prazo
  3. Gerar um sinal de venda quando a EMA de 5 dias de curto prazo cruzar abaixo da DEMA de 34 dias de longo prazo
  4. Opção para negociar apenas durante sessões específicas de negociação
  5. Opção de utilização de stop loss de atraso

Esta estratégia combina os fatores de cruzamento da média móvel e da média móvel para um desempenho estável. As médias móveis como indicador de tendência podem identificar efetivamente as tendências do mercado; A combinação EMA e DEMA pode efetivamente suavizar os dados de preços para gerar sinais de negociação; Os cruzes entre as médias móveis de curto e longo prazo podem fornecer sinais de negociação precoces quando grandes mudanças de tendência ocorrem.

Análise das vantagens

  1. Lógica estratégica simples e clara, fácil de compreender e implementar
  2. A utilização combinada de médias móveis considera tanto o julgamento da tendência como a suavização dos dados de preços
  3. Os cruzamentos entre as médias móveis de curto prazo e de longo prazo podem fornecer sinais precoces nos principais pontos de virada
  4. Os parâmetros podem ser otimizados para ajustar comprimentos médios móveis para diferentes produtos e prazos
  5. A integração de dois factores pode melhorar a estabilidade da estratégia

Análise de riscos

  1. Mais sinais falsos podem ocorrer em mercados variados
  2. Os comprimentos médios móveis inadequados podem causar atraso no sinal
  3. Horários de negociação inadequados e configurações de stop loss podem afetar a rentabilidade da estratégia

Estes riscos podem ser reduzidos ajustando os comprimentos da média móvel, otimizando as horas de negociação e definindo um stop loss razoável.

Orientações de otimização

  1. Ajustar os parâmetros de comprimento médio móvel para diferentes produtos de negociação e prazos
  2. Otimizar os parâmetros da sessão de negociação para negociar durante os períodos mais ativos
  3. Comparação de stop loss fixo vs stop loss de trailing
  4. Teste de impacto das diferentes opções de fonte de preços na estratégia

Conclusão

Esta estratégia gera sinais de negociação por meio de cruzamentos duplos de média móvel, combinados com técnicas de acompanhamento de tendências e suavização de dados. É uma estratégia simples e prática de acompanhamento de tendências. Através do ajuste de parâmetros e do refinamento da lógica, pode se adaptar a diferentes produtos e prazos, fornecer sinais iniciais em grandes mudanças de tendência e evitar sinais falsos. Vale a pena recomendar e aplicar.


/*backtest
start: 2023-11-01 00:00:00
end: 2023-11-30 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
args: [["v_input_1",false]]
*/

//@version=2
strategy(title='[STRATEGY][RS]MicuRobert EMA cross V2', shorttitle='S', overlay=true)
USE_TRADESESSION = input(title='Use Trading Session?', type=bool, defval=true)
USE_TRAILINGSTOP = input(title='Use Trailing Stop?', type=bool, defval=true)
trade_session = input(title='Trade Session:',  defval='0400-1500', confirm=false)
istradingsession = not USE_TRADESESSION ? false : not na(time('1', trade_session))
bgcolor(istradingsession?gray:na)
trade_size = input(title='Trade Size:', type=float, defval=1)
tp = input(title='Take profit in pips:', type=float, defval=55.0) * (syminfo.mintick*10)
sl = input(title='Stop loss in pips:', type=float, defval=22.0) * (syminfo.mintick*10)
ma_length00 = input(title='EMA length:', defval=5)
ma_length01 = input(title='DEMA length:',  defval=34)
price = input(title='Price source:', defval=open)

//  ||--- NO LAG EMA, Credit LazyBear:  ---||
f_LB_zlema(_src, _length)=>
    _ema1=ema(_src, _length)
    _ema2=ema(_ema1, _length)
    _d=_ema1-_ema2
    _zlema=_ema1+_d
//  ||-------------------------------------||

ma00 = f_LB_zlema(price, ma_length00)
ma01 = f_LB_zlema(price, ma_length01)
plot(title='M0', series=ma00, color=black)
plot(title='M1', series=ma01, color=black)

isnewbuy = change(strategy.position_size)>0 and change(strategy.opentrades)>0
isnewsel = change(strategy.position_size)<0 and change(strategy.opentrades)>0

buy_entry_price = isnewbuy ? price : buy_entry_price[1]
sel_entry_price = isnewsel ? price : sel_entry_price[1]
plot(title='BE', series=buy_entry_price, style=circles, color=strategy.position_size <= 0 ? na : aqua)
plot(title='SE', series=sel_entry_price, style=circles, color=strategy.position_size >= 0 ? na : aqua)
buy_appex = na(buy_appex[1]) ? price : isnewbuy ? high : high >= buy_appex[1] ? high : buy_appex[1]
sel_appex = na(sel_appex[1]) ? price : isnewsel ? low : low <= sel_appex[1] ? low : sel_appex[1]
plot(title='BA', series=buy_appex, style=circles, color=strategy.position_size <= 0 ? na : teal)
plot(title='SA', series=sel_appex, style=circles, color=strategy.position_size >= 0 ? na : teal)
buy_ts = buy_appex - sl
sel_ts = sel_appex + sl
plot(title='Bts', series=buy_ts, style=circles, color=strategy.position_size <= 0 ? na : red)
plot(title='Sts', series=sel_ts, style=circles, color=strategy.position_size >= 0 ? na : red)

buy_cond1 = crossover(ma00, ma01) and (USE_TRADESESSION ? istradingsession : true)
buy_cond0 = crossover(price, ma00) and ma00 > ma01 and (USE_TRADESESSION ? istradingsession : true)
buy_entry = buy_cond1 or buy_cond0
buy_close = (not USE_TRAILINGSTOP ? low <= buy_entry_price - sl: low <= buy_ts) or high>=buy_entry_price+tp//high>=last_traded_price + tp or low<=last_traded_price - sl //high >= hh or 
sel_cond1 = crossunder(ma00, ma01) and (USE_TRADESESSION ? istradingsession : true)
sel_cond0 = crossunder(price, ma00) and ma00 < ma01 and (USE_TRADESESSION ? istradingsession : true)
sel_entry = sel_cond1 or sel_cond0
sel_close = (not USE_TRAILINGSTOP ? high >= sel_entry_price + sl : high >= sel_ts) or low<=sel_entry_price-tp//low<=last_traded_price - tp or high>=last_traded_price + sl //low <= ll or 

strategy.entry('buy', long=strategy.long, qty=trade_size, comment='buy', when=buy_entry)
strategy.close('buy', when=buy_close)
strategy.entry('sell', long=strategy.short, qty=trade_size, comment='sell', when=sel_entry)
strategy.close('sell', when=sel_close)

Mais.