Estratégia de ruptura multi-tempo do MACD+EMA

Autora:ChaoZhang, Data: 2024-03-22 11:13:12
Tags:

img

Resumo

Esta estratégia combina o indicador MACD e várias linhas EMA para capturar fortes tendências de mercado de dois prazos - semanal e intradiário. Ele usa o indicador MACD no gráfico semanal para determinar a direção geral da tendência e três linhas EMA (5 dias, 15 dias, 30 dias) no gráfico intradiário para confirmar a tendência e fazer negociações em pontos de ruptura. A ideia principal é seguir tendências fortes e andar nas grandes ondas, entrando em negociações quando a EMA de curto prazo quebra acima da EMA de longo prazo e saindo quando as EMAs são desencadeadas.

Princípio da estratégia

  1. O MACD semanal determina a tendência geral: Calcule o indicador MACD semanal e compare a diferença entre os valores do histograma MACD das semanas atuais e das semanas anteriores. Uma diferença positiva indica uma tendência de alta, enquanto uma diferença negativa indica uma tendência de queda. Atualize a direção da tendência todas as segundas-feiras no mercado aberto.

  2. Múltiplas linhas EMA confirmam a tendência: trace as linhas EMA de 5 dias, 15 dias e 30 dias no gráfico intradiário.

  3. Negociação nos pontos de cruzamento da EMA:

    • Entrada longa: Quando a tendência semanal do MACD estiver em alta e o fechamento intradiário cruzar acima da EMA de 15 dias, vá longo.
    • Entrada curta: Quando a tendência semanal do MACD está em baixa e a EMA de 5 dias cruza abaixo da EMA de 30 dias, vá curto.
  4. Adição de posições: não foram estabelecidas condições adicionais de entrada.

Análise das vantagens

  1. A combinação de dois prazos torna a determinação da tendência mais confiável. O MACD semanal evita ficar preso em mercados de faixa, enquanto os crossovers da EMA intradiária capturam cada onda dentro da tendência.

  2. A escolha de EMAs de 5/15/30 dias no gráfico intradiário filtra efetivamente o ruído e capta tendências claras.

  3. As configurações de stop-loss são razoáveis, controlando o risco em negociações individuais.

  4. O design do código modular, com componentes-chave como cálculos MACD e EMA, é altamente reutilizável e extensivel.

Análise de riscos

  1. A seleção incorreta do limiar de diferença do histograma do MACD pode levar a critérios de tendência excessivamente soltos ou rigorosos, causando julgamentos errôneos.

  2. Seleção inadequada dos parâmetros da EMA intradiária - muito curto pode levar ao excesso de negociação, enquanto muito longo pode perder oportunidades.

  3. Pontos de stop-loss fixos inadequados - configurá-lo muito apertado pode levar a stop-outs frequentes, enquanto muito largo pode levar a perdas excessivas por negociação.

  4. As EMA podem atrasar-se nos pontos de virada da tendência, perdendo potencialmente os melhores pontos de entrada/saída.

Orientações de otimização

  1. Considere adicionar outros indicadores como o RSI em cima do MACD semanal para confirmar a força da tendência e melhorar a precisão.

  2. Considerar a adição de outros indicadores, como o CCI, como filtros adicionais para os sinais cruzados da EMA intradiária, a fim de reduzir a frequência e o risco das negociações.

  3. Definir pontos de stop-loss personalizados com base na volatilidade histórica de cada ação para melhor se adequar às suas características.

  4. Considerar a adição de regras de estratégia para a ampliação das posições - adicionando gradualmente tendências fortes e reduzindo tendências de enfraquecimento para melhorar a eficiência do capital.

Resumo

A estratégia MACD + EMA Multi-Timeframe Breakout é uma estratégia de tendência com base científica para determinação e confirmação de tendências. Ela pode efetivamente capturar as principais tendências do mercado e gerar retornos estáveis. Enquanto isso, a estratégia é bastante completa no controle de riscos, limitando efetivamente os drawdowns através de regras razoáveis de stop-loss e saída. No entanto, também há algumas deficiências, como sinais de tendência atrasados e falta de regras de escala, que podem ser otimizadas e melhoradas.


/*backtest
start: 2023-03-16 00:00:00
end: 2024-03-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


// 1) 전주와 전전주의 히스토그램의 차이를 계산하여, 매주 월요일에 매매 방향을 표시하고, 
// 2) 5일, 15일, 30일 선을 호출하여 평행하게 그리고, 매매 방향에 따라 
// 3) 분봉기준의 이동평균선 매매전략  
// 4) 수익 실현은 미설정 해둠 


//@version=5
strategy('Last week MACD+ 15day, 30day break through, by Ho.J', overlay=true, initial_capital=30000, commission_value = 7.5, commission_type=strategy.commission.cash_per_order, slippage = 0)

// 백테스팅 기간 설정
start_time = input(timestamp("Jan 19 2024 00:00:01"), confirm = true)
end_time = input(timestamp("MAR 19 2024 23:59:59"), confirm = true)
is_in_time = true
stopLoss = input.int(100, title="손절 수준")


// 지난주 값 불러오기 입력 매개변수, 1은 5일, 3은 15일, 6은 30일 이동평균선을 구하는 변수임
emaLength1 = input(1, title="EMA Length")
emaLength2 = input(3, title="EMA Length")
emaLength3 = input(6, title="EMA Length")
timeframePeriod = "W" // 'D'는 일간 데이터를 의미


// 분봉기준 EMA 계산
shortEMA = ta.ema(close, 50)
mediumEMA = ta.ema(close, 60)
longEMA = ta.ema(close, 150)


// 분봉기준 EMA 그리기
plot(shortEMA, color=color.blue, title="5일 EMA")
plot(mediumEMA, color=color.orange, title="15일 EMA")
plot(longEMA, color=color.red, title="30일 EMA")



// 주간 MACD 계산, 전주와 전전주 히스토그램을 계산하여 상대적인 상승, 하락을 계산 
[macdLine, signalLine, _] = ta.macd(close, 12, 26, 9)
histogram = macdLine - signalLine
histLastWeek = request.security(syminfo.tickerid, timeframePeriod, histogram[1], lookahead=barmerge.lookahead_on)
histWeekBeforeLast = request.security(syminfo.tickerid, timeframePeriod, histogram[2], lookahead=barmerge.lookahead_on)
histDiff = histLastWeek - histWeekBeforeLast


// 현재 주의 월요일 첫 봉인지 확인
isMondayFirstBar = (dayofweek == dayofweek.monday) and (hour == 09) and (minute == 00) // 여기서 시간은 시장 개장 시간에 따라 조정해야 함


// 월요일 첫봉에, 주간 MACD 히스토그램이 상승하면 '매수', 하락하면 '매도' 표시
var label myLabel = na
if (isMondayFirstBar)
    if (histDiff > 0)
        myLabel := label.new(bar_index, high, "이번주는 매수만", color=color.green, textcolor=color.white, style=label.style_label_down, size=size.large)
    else if (histDiff < 0)
        myLabel := label.new(bar_index, low, "이번주는 매도만", color=color.red, textcolor=color.white, style=label.style_label_up, size=size.large)


// 지난주 EMA 값 요청
// 'lookahead'를 사용하여 지난 데이터를 기준으로 계산
lastWeekEMA1 = request.security(syminfo.tickerid, timeframePeriod, ta.ema(close[1], emaLength1), lookahead=barmerge.lookahead_on)
lastWeekEMA2 = request.security(syminfo.tickerid, timeframePeriod, ta.ema(close[1], emaLength2), lookahead=barmerge.lookahead_on)
lastWeekEMA3 = request.security(syminfo.tickerid, timeframePeriod, ta.ema(close[1], emaLength3), lookahead=barmerge.lookahead_on)

// 지난주 EMA 그리기
plot(lastWeekEMA1, color=color.red, title="Last Week EMA1")
plot(lastWeekEMA2, color=color.rgb(157, 126, 126), title="Last Week EMA2")
plot(lastWeekEMA3, color=color.rgb(199, 192, 192), title="Last Week EMA3")


// 매수/매도 조건
buySignal = ta.crossover(close, lastWeekEMA2) and histDiff > 0
// addbuySignal = ta.crossover(close, lastWeekEMA3) and histDiff > 0

sellSignal = ta.crossunder(shortEMA, longEMA) and histDiff < 0
// addSellSignal = ta.crossunder(close, lastWeekEMA3) and histDiff < 0


// 매수 조건
if (buySignal)
    strategy.entry('Buy', strategy.long)
    alert('Buy Signal', alert.freq_once_per_bar_close)
	
// if (addbuySignal)
   // strategy.entry('Buy', strategy.long)
   // alert('add Buy Signal', alert.freq_once_per_bar_close)

if (strategy.position_size > 0 and ((strategy.position_avg_price - close) >= stopLoss) or ta.crossunder(close, mediumEMA))
    strategy.close('Buy')
    alert('Close Buy Signal', alert.freq_once_per_bar_close)

// 매도 조건
if (sellSignal)
    strategy.entry('Sell', strategy.short)
    alert('Sell Signal', alert.freq_once_per_bar_close)
	
//if (addSellSignal)
   // strategy.entry('Sell', strategy.short)
   // alert('add Sell Signal', alert.freq_once_per_bar_close)

if (strategy.position_size < 0 and ((close - strategy.position_avg_price) >= stopLoss) or ta.crossover(shortEMA, mediumEMA))
    strategy.close('Sell')
    alert('Close Sell Signal', alert.freq_once_per_bar_close)

Mais.