Estratégia de negociação de curto prazo de combinação de média móvel dupla e MACD

Autora:ChaoZhang, Data: 2023-10-09 16: 47:42
Tags:

Resumo

Esta estratégia combina médias móveis duplas, indicador estocástico e MACD para identificar oportunidades de negociação de curto prazo, que é uma estratégia de negociação de curto prazo relativamente clássica.

Princípio

A estratégia baseia-se principalmente nos seguintes princípios:

  1. A EMA com um período mais curto pode responder rapidamente às mudanças de preço. A passagem da EMA de 50 períodos acima da EMA de 100 períodos representa o estabelecimento de uma posição longa; a passagem para baixo representa o estabelecimento de uma posição curta.

  2. Use a diferença entre o MACD para determinar os pontos de entrada e saída. Quando a diferença cruza acima de 0, ela mostra fortalecimento da força do touro e leva a entrada longa; quando cruza abaixo de 0, ela mostra fortalecimento da força do urso e leva a entrada curta.

  3. Combine o indicador de RSI estocástico para julgar a situação de sobrecompra e sobrevenda. Este indicador combina as vantagens do KDJ e do RSI e pode mostrar bem as condições de sobrecompra e sobrevenda. Quando é inferior a 20, o mercado é sobrevendido e a entrada longa pode ser considerada combinando outros indicadores; quando é superior a 80, o mercado é sobrecomprado e a entrada curta pode ser considerada.

  4. Após determinar a direção de entrada, se 4 dos 5 candelabros mais recentes tiverem preços de fechamento que toquem as médias móveis, isso mostra que há suporte/resistência em torno das médias móveis e as posições podem ser abertas.

  5. Use stop loss e take profit para gerir riscos.

Vantagens

As vantagens desta estratégia incluem:

  1. A combinação de múltiplos indicadores melhora a taxa de ganho, utilizando as médias móveis, o indicador de sobrecompra/supervenda e o indicador de impulso juntos.

  2. Os parâmetros MACD são otimizados para gerar sinais de entrada precisos.

  3. Os parâmetros estocásticos do RSI são otimizados para identificar bem as condições de sobrecompra/supervenda.

  4. Usando suporte/resistência em torno de médias móveis para controle de tempo evita ser preso por falhas.

  5. Um stop loss e take profit razoáveis controlam efetivamente os riscos para cada negociação.

Riscos

Há também alguns riscos desta estratégia:

  1. Falhar em evitar completamente as perdas causadas por fuga falsas.

  2. Pode ocorrer divergência entre indicadores, causando sinais comerciais inconsistentes.

  3. O stop loss e o take profit fixos podem não se adaptar às alterações do mercado.

  4. O código complexo com muitos parâmetros é difícil de otimizar.

As soluções são:

  1. Otimizar os parâmetros para melhorar a qualidade do sinal e reduzir as probabilidades de fuga falsa.

  2. Estabelecer prioridades entre os indicadores para evitar conflitos.

  3. Adotar stop loss dinâmico e tirar lucro com base nos intervalos ATR.

  4. Simplificar a lógica e extrair parâmetros essenciais para testes e otimização.

Orientações de otimização

A estratégia pode ser otimizada nos seguintes aspectos:

  1. Teste e encontre as combinações ideais de períodos de média móvel e parâmetros MACD.

  2. Teste diferentes indicadores de sobrecompra/supervenda para substituir o RSI estocástico.

  3. Tente stop loss dinâmico e tirar lucro, trailing stop para tornar a gestão de risco mais inteligente.

  4. Adicionar condições de filtragem como aumentar o volume para melhorar a qualidade do sinal.

  5. Otimizar a lógica de entrada para evitar rupturas ineficazes, utilizando mais indicadores para determinar a tendência.

  6. Definir limites de stop loss de acordo com o tamanho da conta, número de negociações por dia para controlar os riscos globais.

Resumo

Esta estratégia integra as vantagens de múltiplos indicadores e é muito prática para negociação de curto prazo. Ao continuar a otimização de parâmetros, a lógica de entrada rigorosa e a melhoria do gerenciamento de riscos, a estabilidade e a lucratividade podem ser melhoradas.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-10-08 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title="Forex scalper 2xEMA + SRSI + MACD", shorttitle="Forex scalper 5-15min", overlay=true)
src = input(title="Source", type=input.source, defval=close)

src_0 = src[0]
src_1 = src[1]
src_2 = src[2]
src_3 = src[3]
src_4 = src[4]

len50 = input(50, minval=1, title="Length")
src50 = input(close, title="Source")
out50 = ema(src50, len50)
len100 = input(100)
src100 = input(close, title="Source")
out100 = ema(src100, len100)

len1 = input(1, minval=1, title="Length")
src1 = input(close, title="Source")
out1 = sma(src1, len1)

length = input(4, minval=1)
OverBought = input(80)
OverSold = input(20)
smoothK = 3
smoothD = 3

k = sma(stoch(close, high, low, length), smoothK)
d = sma(k, smoothD)
cu = crossover(k,OverSold)
co = crossunder(k,OverBought)

sma_down = crossunder(out1, out50)
sma_up = crossover(out1,out50)

//if (not na(k) and not na(d))
  //  if (co and k < OverSold)
    //    strategy.entry("StochLE", strategy.long, comment="StochLE")
    //if (cu and k > OverBought)
     //   strategy.entry("StochSE", strategy.short, comment="StochSE")

crossCandle_4 = crossover(src[4],out50)
crossCandleUnder_4= cross(src[4],out50)
crossCandle_3 = crossover(src[3],out50)
crossCandleUnder_3= crossunder(src[3],out50)
crossCandle_2 = crossover(src[2],out50)
crossCandleUnder_2= crossunder(src[2],out50)
crossCandle_1 = crossover(src[1],out50)
crossCandleUnder_1= crossunder(src[1],out50)
crossCandle_0 = crossover(src[0],out50)
crossCandleUnder_0= crossunder(src[0],out50)

conditionOver = (crossCandle_4 or crossCandle_3 or crossCandle_2 or crossCandle_1 or crossCandle_0)
conditionUnder =(crossCandleUnder_4 or crossCandleUnder_3 or crossCandleUnder_2 or crossCandleUnder_1 or crossCandleUnder_0)

touch4 = (cross(low[4],out50) or cross(high[4],out50))
touch3 = (cross(low[3],out50) or cross(high[3],out50))
touch2 = (cross(low[2],out50) or cross(high[2],out50))
touch1 = (cross(low[1],out50) or cross(high[1],out50))

touch = touch1 or touch2 or touch3 or touch4

//and sma_up
//and sma_down

// Getting inputs
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src_macd = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 10)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? sma(src_macd, fast_length) : ema(src_macd, fast_length)
slow_ma = sma_source ? sma(src_macd, slow_length) : ema(src_macd, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal

//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
//plot(macd, title="MACD", color=col_macd, transp=0)
//plot(signal, title="Signal", color=col_signal, transp=0)


// plot((conditionOver or conditionUnder or touch)  and src[0] >= out50 and close >= out50 and  (cu) and out50 > out100 and hist>=0 , title="Buy", style=columns, color=lime)
// plot((conditionOver or conditionUnder or touch)  and src[0] <= out50 and close <= out50 and  (co) and out50< out100 and hist<=0 , title="sell", style=columns, color=red)


long_cond = ((conditionOver or conditionUnder or touch)  and src[0] >= out50 and close > out50 and  (cu) and out50 > out100 and hist>=0)
short_cond = ((conditionOver or conditionUnder or touch)  and src[0] <= out50 and close < out50 and  (co) and out50< out100 and hist<=0)

tp=input(200)
sl=input(200)

strategy.entry("long",strategy.long, when=long_cond)
strategy.entry("short",strategy.short, when=short_cond)

strategy.exit("X_long", "long", profit=tp,  loss=sl, when=touch  )
strategy.exit("x_short", "short",profit=tp, loss=sl,when = touch )

Mais.