리소스 로딩... 로딩...

이중 크로스오버 트렌드 다음 전략: EMA와 MACD 시너지 거래 시스템

저자:차오장, 날짜: 2025-01-17 16:06:16
태그:EMAMACDDIFDEATPSLRR

 Dual Crossover Trend Following Strategy: EMA and MACD Synergistic Trading System

전반적인 설명

이 전략은 EMA와 MACD 이중 기술 지표를 결합한 트렌드 다음 거래 시스템이다. 이 전략은 가격과 EMA9의 크로스오버와 슬로우 라인 (DEA) 과 MACD 빠른 라인 (DIF) 의 크로스오버를 통해 시장 트렌드를 포착한다. 이 전략은 지난 5 개의 촛불에 기반한 적응 스톱 로스를 고용하고 수익 목표에 대한 3.5:1 보상-위험 비율을 사용하여 완전한 거래 시스템을 형성한다.

전략 원칙

핵심 논리는 긴 방향과 짧은 방향으로 나뉘어 있습니다. 1. 긴 조건: 닫기 가격이 아래로부터 EMA9를 넘어서고 MACD의 DIF 라인이 DEA 라인을 넘을 때 시스템은 긴 신호를 생성합니다. 2. 쇼트 조건: 닫기 가격이 위로부터 EMA9 아래로 돌파하고 MACD의 DIF 라인이 DEA 라인 아래로 넘어가면 시스템이 쇼트 신호를 생성합니다. 3. 위험 관리: - 긴 포지션의 스톱 로스는 이전 5개의 촛불의 최저점 아래로 설정됩니다. - 짧은 포지션 스톱 로스는 이전 5개의 촛불의 가장 높은 지점 위에 설정됩니다. - 수익 목표가 스톱-러스 거리의 3.5배로 설정됩니다

전략적 장점

  1. 이중 확인 메커니즘: EMA와 MACD의 시너지를 통해 잘못된 신호를 효과적으로 필터링하고 거래 정확도를 향상시킵니다.
  2. 적응식 스톱 로스: 최근 가격 변동에 기반한 스톱 로스 포지션은 시장 변동에 따라 자동으로 조정됩니다.
  3. 명확한 위험/이익 비율: 고정된 3.5:1 위험/이익 설정은 장기적으로 안정적인 수익을 달성하는 데 도움이 됩니다.
  4. 명확한 전략 논리: 출입 및 출입 조건은 명시적이고 이해하기 쉽고 실행이 쉽습니다.
  5. 높은 적응력: 다른 시장 조건에 따라 매개 변수를 조정할 수 있습니다.

전략 위험

  1. 은 시장 위험: 옆 시장에서 빈번한 잘못된 파업이 발생할 수 있으며, 연속적인 스톱 로스로 이어질 수 있습니다.
  2. 미끄러짐 위험: 빠르게 변화하는 시장에서 실제 스톱 로스 및 이익 가격은 예상보다 벗어날 수 있습니다.
  3. 매개 변수 민감성: EMA와 MACD 기간 설정은 전략 성과에 상당한 영향을 미칩니다.
  4. 트렌드 의존성: 전략은 명확한 트렌드가 없는 시장에서 잘 작동하지 않을 수 있습니다.

전략 최적화 방향

  1. 트렌드 필터를 추가합니다. 주요 트렌드 방향으로만 거래하기 위해 더 긴 기간 트렌드 지표를 도입합니다.
  2. 동적 리스크 멀티플리커: 시장 변동성에 따라 리스크/이익 비율을 자동으로 조정합니다.
  3. 시간 필터링: 낮은 유동성 기간을 피하기 위해 거래 시간 필터를 추가합니다.
  4. 위치 관리 최적화: 신호 강도에 따라 위치 크기를 동적으로 조정합니다.
  5. 변동성 지표를 도입합니다. 스톱 로스 거리의 동적 조정을 위해

요약

이 전략은 기술 지표의 이중 확인과 엄격한 위험 관리를 통해 전체 트렌드 다음 거래 시스템을 구축합니다. 시장 환경 의존도가 있지만 합리적인 매개 변수 최적화 및 위험 관리로 좋은 적응력과 안정성을 보여줍니다. 미래 최적화 방향은 주로 전반적인 전략 성능을 향상시키기 위해 트렌드 식별 정확성과 위험 관리 역학을 개선하는 데 중점을두고 있습니다.


/*backtest
start: 2024-01-17 00:00:00
end: 2025-01-16 00:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

// =======================
// @version=6
strategy(title="MACD + EMA9 3 h",
     shorttitle="MACD+EMA9+StopTP_5candles",
     overlay=true,
     initial_capital=100000,    // Ajuste conforme desejar
     default_qty_type=strategy.percent_of_equity,
     default_qty_value=200)      // Ajuste % de risco ou quantidade

// ----- Entradas (Inputs) -----
emaLen          = input.int(9,     "Período da EMA 9", minval=1)
macdFastLen     = input.int(12,    "Período MACD Rápido", minval=1)
macdSlowLen     = input.int(26,    "Período MACD Lento",  minval=1)
macdSignalLen   = input.int(9,     "Período MACD Signal", minval=1)
riskMultiplier  = input.float(3.5, "Fator de Multiplicação do Risco (TP)")
lookbackCandles = input.int(5,     "Quantidade de candles p/ Stop", minval=1)

// ----- Cálculo da EMA -----
ema9 = ta.ema(close, emaLen)

// ----- Cálculo do MACD -----
[macdLine, signalLine, histLine] = ta.macd(close, macdFastLen, macdSlowLen, macdSignalLen)
// DIF cruza DEA para cima ou para baixo
macdCrossover   = ta.crossover(macdLine, signalLine)   // DIF cruza DEA p/ cima
macdCrossunder  = ta.crossunder(macdLine, signalLine)  // DIF cruza DEA p/ baixo

// ----- Condições de Compra/Venda -----

// Compra quando:
// 1) Preço cruza EMA9 de baixo pra cima
// 2) MACD cruza a linha de sinal para cima
buySignal = ta.crossover(close, ema9) and macdCrossover

// Venda quando:
// 1) Preço cruza EMA9 de cima pra baixo
// 2) MACD cruza a linha de sinal para baixo
sellSignal = ta.crossunder(close, ema9) and macdCrossunder

// ----- Execução das ordens -----

// Identifica o menor e o maior preço dos últimos 'lookbackCandles' candles.
// A função ta.lowest() e ta.highest() consideram, por padrão, a barra atual também.
// Se você quiser EXCLUIR a barra atual, use low[1] / high[1] dentro do ta.lowest() / ta.highest().
lowestLow5  = ta.lowest(low, lookbackCandles)
highestHigh5= ta.highest(high, lookbackCandles)

// >>> Quando há sinal de COMPRA <<<
if (buySignal)
    // Fecha posição vendida, se existir
    strategy.close("Sell")
    // Entra comprado
    strategy.entry("Buy", strategy.long)
    
    // STOP: abaixo do menor preço dos últimos 5 candles
    stopPrice = lowestLow5
    // Risco = (preço de entrada) - (stop)
    // Note que strategy.position_avg_price só fica disponível a partir da barra seguinte.
    // Por isso, o exit costuma funcionar corretamente apenas na barra seguinte.
    // Para fins de teste, podemos usar 'close' como proxy do "entry" (ou aceitar essa limitação).
    // A forma "correta" de usar strategy.position_avg_price seria via calc_on_order_fills = true,
    // mas isso pode exigir algumas configurações adicionais.
    risk = strategy.position_avg_price - stopPrice
    
    // Take Profit = entrada + 2,5 * risco
    takeProfitPrice = strategy.position_avg_price + riskMultiplier * risk

    // Registra a saída (stop e alvo) vinculada à posição "Buy"
    strategy.exit("Exit Buy", "Buy", stop=stopPrice, limit=takeProfitPrice)

// >>> Quando há sinal de VENDA <<<
if (sellSignal)
    // Fecha posição comprada, se existir
    strategy.close("Buy")
    // Entra vendido
    strategy.entry("Sell", strategy.short)
    
    // STOP: acima do maior preço dos últimos 5 candles
    stopPrice = highestHigh5
    // Risco = (stop) - (preço de entrada)
    risk = stopPrice - strategy.position_avg_price
    
    // Take Profit = entrada - 2,5 * risco
    takeProfitPrice = strategy.position_avg_price - riskMultiplier * risk

    // Registra a saída (stop e alvo) vinculada à posição "Sell"
    strategy.exit("Exit Sell", "Sell", stop=stopPrice, limit=takeProfitPrice)

// ----- Plotagens visuais -----
plot(ema9, color=color.orange, linewidth=2, title="EMA 9")

plot(macdLine,       color=color.new(color.blue, 0),   title="MACD")
plot(signalLine,     color=color.new(color.red, 0),    title="Signal")
plot(histLine,       color=color.new(color.purple, 0), style=plot.style_histogram, title="Histogram")

// Só para auxiliar na visualização, vamos plotar a linha do lowestLow5 e highestHigh5
plot(lowestLow5,    color=color.new(color.lime, 70),  style=plot.style_line, title="Lowest 5 bars")
plot(highestHigh5,  color=color.new(color.fuchsia,70),style=plot.style_line, title="Highest 5 bars")

관련

더 많은