더블 MACD 트렌드 신호 포착 및 필터링 정량적 전략

MACD EMA SMA 趋势跟踪 信号过滤 双重确认
생성 날짜: 2025-03-25 14:34:44 마지막으로 수정됨: 2025-03-25 14:34:44
복사: 0 클릭수: 619
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

더블 MACD 트렌드 신호 포착 및 필터링 정량적 전략 더블 MACD 트렌드 신호 포착 및 필터링 정량적 전략

개요

이중 MACD 트렌드 신호 캡처 및 필터화 전략은 두 개의 다른 시간 프레임의 이동 평균 집약 지표 (MACD) 를 기반으로 한 양적 거래 전략이다. 이 전략은 단기 및 장기 트렌드 신호를 결합하여 시장 거래 기회를 포착하고, 시장 소음을 효과적으로 필터링하여 거래 신호의 정확성을 향상시킵니다. 이 전략은 TradingView 플랫폼에서 구현되며, 가격 차트 중첩과는 독립되어 있으며, 주식, 선물 및 외환을 포함한 다양한 금융 시장에 적용됩니다.

이 전략의 핵심은 두 개의 MACD 지표: MACD1 (단기) 와 MACD2 (장기) 를 이용하는 것이다. MACD1의 기본 빠른 길이는 34이고, 느린 길이는 144이며, 신호 평면은 9이며, 이는 단기 트렌드 변화를 감지하기 위한 것이다. MACD2의 기본 빠른 길이는 100이고, 느린 길이는 200이며, 신호 평면은 50이다.

전략 원칙

이중 MACD 전략의 핵심 원칙은 두 개의 다른 시간 프레임의 MACD 지표를 통해 시장 추세를 식별하고 거래 신호를 생성하는 것입니다. 전략 코드는 먼저 두 개의 MACD 지표와 관련 변수를 계산합니다.

  1. MACD1 (단기적인 지표):

    • 빠른 길이는 기본적으로 34
    • 느린 길이 기본 144
    • 신호가 평평하다 9
  2. MACD2 (장기 지표):

    • 빠른 길이 기본 100
    • 느린 길이 기본 200
    • 신호가 평평하다 50

거래 논리는 명확하고 엄격하게 설계되었습니다.

  • 더 많은 조건이 있습니다.

    • MACD1 기둥형 도표에 0선을 뚫고 (단기 시점)
    • MACD2 기둥 그래프는正值 (장기 투기)
    • MACD2 기둥은 0선을 통과하고 초록색이 깊어집니다 (트렌드 확인)
  • 공백 조건:

    • MACD1 기둥형 도표 아래로 0선을 통과 (단기 하락)
    • MACD2 기둥은 마이너스 (장기 하락)
    • MACD2 기둥은 0선을 통과하고 빨간색이 깊어집니다 (트렌드 확인)

전략은 또한 위험 관리 조치를 포함하고 있으며, 조정 가능한 중지 및 중지 파라미터를 설정하고 있으며, 기본 중지 값은 1% (최소한 0.1%) 이며, 중지 값은 1.5% (최소한 0.1%) 이며, 입시 가격 동력에 따라 계산됩니다. 거래는 신호 안정성을 보장하기 위해 K 라인 종료 시 처리됩니다.

전략적 이점

코드에 대한 심층적인 분석을 통해 이 쌍 MACD 전략은 여러 가지 장점을 보여준다:

  1. 이중 트렌드 확인 메커니즘: 단기 MACD와 장기 MACD를 결합하여 전략은 시장 소음을 효과적으로 필터링하여 가짜 신호를 줄이고 거래의 정확성을 향상시킬 수 있습니다. 전략은 단기 및 장기 신호가 일치 할 때만 거래 신호를 생성합니다.

  2. 유연한 변수 설정: 정책은 사용자가 사용자 정의 MACD 변수 (빠른 길, 느린 길, 신호 부드러움) 과 계산 방법 (SMA 또는 EMA) 을 사용할 수 있도록 허용하여 정책이 다른 시장 환경과 사용자 취향에 적응할 수 있습니다.

  3. 직관적인 시각적 피드백: 전략은 동적인 색상 변화를 통해 ((상향 경향은 어두운 녹색, 하향 경향은 어두운 빨간색) 트렌드 강도를 직관적으로 표시하여 거래자가 시장 상황을 더 잘 이해할 수 있도록 도와줍니다.

  4. 완벽한 위험 관리: 내장된 조절 가능한 중지 및 중지 매개 변수, 자금의 안전을 보호하고 수익을 잠금 둡니다. 이러한 매개 변수는 시장의 변동성과 개인의 위험 수용 능력에 따라 조정할 수 있습니다.

  5. 실시간 경보 기능: 전략은 상장과 하락의 신호 경보를 제공하여 거래의 실시간 모니터링과 자동화를 가능하게 하며, 거래자가 시장 기회를 제때 파악할 수 있도록 한다.

  6. 적용 범위: 전략은 주식, 선물 및 외환을 포함한 다양한 금융 시장에 적용되며, 여러 거래 시나리오에 대한 실용적인 도구가 됩니다.

전략적 위험

이중 MACD 전략은 합리적으로 설계되었지만, 몇 가지 잠재적인 위험이 있습니다.

  1. 트렌드 역전 위험: 급격한 변동이 있는 시장에서 트렌드가 빠르게 역전될 수 있어 전략이 손실을 초래할 수 있다. 스톱 손실 설정이 있더라도 극단적인 시장 조건에서 실제 스톱 손실 가격은 크게 미끄러질 수 있다.

  2. 매개 변수 민감성: 전략 성능은 MACD 매개 변수 설정에 크게 의존한다. 부적절한 매개 변수는 너무 많은 가짜 신호를 유발하거나 중요한 거래 기회를 놓칠 수 있다. 사용자는 특정 시장과 시간 프레임에 따라 매개 변수를 신중하게 최적화해야 한다.

  3. 지연성 문제: MACD는 본질적으로 지연 지표이며, 역사적 가격 데이터에 기반하여 계산된다. 빠르게 변화하는 시장에서 신호는 너무 늦게 와서 최적의 입구 지점을 놓치거나 불필요한 손실을 초래할 수 있다.

  4. 수평 시장의 부실성: 이 전략은 강한 추세 시장에서 가장 잘 작동하지만 수평 조정 또는 방향없는 시장에서 빈번한 거짓 신호를 발생시켜 연속적으로 작은 손실을 초래할 수 있습니다.

  5. 자금 관리 위험: 계좌의 자금 100%를 거래에 사용하도록 기본 설정하여 과도한 레버리지와 부적절한 자금 관리로 이어질 수 있습니다. 거래자는 위험을 더 잘 관리하기 위해 거래당 자금 비율을 줄이는 것을 고려해야합니다.

이러한 위험을 줄이기 위해, 거래자는 다음을 고려해야 합니다: 다른 기술 지표와 함께 상호 검증; 정기적으로 전략 변수를 재검토하고 최적화; 시장 조건에 따라 자금 분배를 조정; 극단적 인 시장 조건에서 수동 개입; 합리적인 위험 / 수익 비율을 설정하십시오.

전략 최적화 방향

코드에 대한 깊은 분석을 통해 다음과 같은 최적화 방향이 제시되었습니다.

  1. 필터 조건을 추가합니다: 가짜 신호를 줄이기 위해 필터로 추가된 기술 지표 (대비적으로 약한 지수 RSI 또는 브린 밴드와 같은) 를 추가할 수 있습니다. 예를 들어, RSI가 시장이 과매매 / 과매매 상태가 아니라는 것을 표시하는 경우에만 거래하십시오.

  2. 자기 적응 파라미터: 시장의 변동성에 따라 자동으로 조정되는 MACD 파라미터의 자기 적응 조정을 구현합니다. 높은 변동성이있는 시장에서 노이즈를 줄이기 위해 빠른 속도와 느린 속도의 길이를 증가시킬 수 있습니다. 낮은 변동성이있는 시장에서 감수성을 높이기 위해 파라미터를 줄일 수 있습니다.

  3. 개선된 스톱 전략: ATR (진실 변동의 평균) 에 기반한 스톱 세팅과 같은 변동성에 기반한 다이내믹 스톱을 구현합니다. 고정된 퍼센트보다 스톱을 더 적합하게 만듭니다.

  4. 부분 적립 메커니즘을 추가: 특정 수익 목표를 달성했을 때 부분 적립을 허용하고, 수익의 일부를 잠금하는 동시에 나머지 포지션이 수익을 계속하도록 한다.

  5. 거래 시간 필터: 거래 시간 필터를 추가하여 시장 개시/폐쇄와 같은 높은 변동 시간 또는 낮은 유동성 시간에 거래하는 것을 피하십시오.

  6. 자금 관리 최적화: 케일리 가이드라인이나 고정 비율 위험 모델에 기반한 자금 관리를 구현하고, 승률과 위험/이익 비율에 따라 역동적으로 포지션 크기를 조정한다.

  7. 여러 시기를 조합: 현재 두 개의 MACD 외에도 더 광범위한 시장 관점을 제공하기 위해 세 번째 더 긴 MACD를 추가하는 것을 고려하십시오.

  8. 시장 상태 분류: 시장 상태 분류 로직을 추가하고, 다른 시장 상태에 따라 거래 전략과 매개 변수를 조정한다.

이러한 최적화는 전략의 안정성과 적응성을 높여서 다양한 시장 조건에서 좋은 성능을 유지할 수 있게 해준다.

요약하다

이중 MACD 트렌드 신호 캡처 및 필터링 전략은 단기 및 장기 MACD 지표를 능숙하게 결합하여 강력한 트렌드 추적 시스템을 만듭니다. 이 전략의 핵심 장점은 가짜 신호를 효과적으로 줄이고 거래의 정확성을 향상시키는 엄격한 이중 확인 메커니즘에 있습니다. 동시에, 유연한 매개 변수 설정과 직관적인 시각적 피드백은 모든 유형의 시장 참가자에게 실용적인 도구가됩니다.

트렌드 반전, 변수 민감성 및 가로수지 시장의 부실성 등의 위험이 있음에도 불구하고, 적절한 위험 관리 조치 및 전략 최적화를 통해 이러한 위험을 효과적으로 제어 할 수 있습니다. 미래 최적화 방향은 추가적인 필터링 조건을 추가하고, 적응 변수를 구현하고, 손해 방지 전략을 개선하고, 자본 관리를 최적화하는 등의 측면을 포함 할 수 있습니다.

전체적으로, 이중 MACD 전략은 양적 거래자에게 견고한 프레임 워크를 제공하며, 특히 중·단기 경향 거래자에게 적합합니다. 이 전략은 고전적인 기술적 분석 도구와 유연한 거래 규칙을 결합하여 일관된 수익을 추구하는 거래자에게 견고한 거래 시스템을 제공합니다.

전략 소스 코드
/*backtest
start: 2024-03-25 00:00:00
end: 2025-03-24 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy(title="Dual MACD Strategy [Jason Kasei]", shorttitle="DualMACD", overlay=false, margin_long=0, margin_short=0, default_qty_type=strategy.percent_of_equity, 
 default_qty_value=100, process_orders_on_close=true, initial_capital=10000)

// --- 输入参数 ---
// MACD1 参数
macd1_fast_length = input.int(title="MACD1 Fast Length", defval=34)
macd1_slow_length = input.int(title="MACD1 Slow Length", defval=144)
macd1_signal_length = input.int(title="MACD1 Signal Smoothing", minval=1, maxval=50, defval=9)
macd1_sma_source = input.string(title="MACD1 Oscillator MA Type", defval="EMA", options=["SMA", "EMA"])
macd1_sma_signal = input.string(title="MACD1 Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])

// MACD2 参数
macd2_fast_length = input.int(title="MACD2 Fast Length", defval=100)
macd2_slow_length = input.int(title="MACD2 Slow Length", defval=200)
macd2_signal_length = input.int(title="MACD2 Signal Smoothing", minval=1, maxval=50, defval=50)
macd2_sma_source = input.string(title="MACD2 Oscillator MA Type", defval="EMA", options=["SMA", "EMA"])
macd2_sma_signal = input.string(title="MACD2 Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])

// 止损止盈参数
stop_loss_pct = input.float(title="Stop Loss %", defval=1.0, minval=0.1, step=0.1)
take_profit_pct = input.float(title="Take Profit %", defval=1.5, minval=0.1, step=0.1)

// --- 计算 MACD1 ---
src = close
macd1_fast_ma = macd1_sma_source == "SMA" ? ta.sma(src, macd1_fast_length) : ta.ema(src, macd1_fast_length)
macd1_slow_ma = macd1_sma_source == "SMA" ? ta.sma(src, macd1_slow_length) : ta.ema(src, macd1_slow_length)
macd1 = macd1_fast_ma - macd1_slow_ma
macd1_signal = macd1_sma_signal == "SMA" ? ta.sma(macd1, macd1_signal_length) : ta.ema(macd1, macd1_signal_length)
macd1_hist = macd1 - macd1_signal

// --- 计算 MACD2 ---
macd2_fast_ma = macd2_sma_source == "SMA" ? ta.sma(src, macd2_fast_length) : ta.ema(src, macd2_fast_length)
macd2_slow_ma = macd2_sma_source == "SMA" ? ta.sma(src, macd2_slow_length) : ta.ema(src, macd2_slow_length)
macd2 = macd2_fast_ma - macd2_slow_ma
macd2_signal = macd2_sma_signal == "SMA" ? ta.sma(macd2, macd2_signal_length) : ta.ema(macd2, macd2_signal_length)
macd2_hist = macd2 - macd2_signal

// --- 绘制 MACD1 和 MACD2 
hline(0, "Zero Line", color=color.new(#787B86, 50))
plot(macd1_hist, title="MACD1 Histogram", style=plot.style_line, color=(macd1_hist >= 0 ? (macd1_hist[1] < macd1_hist ? #26A69A : #B2DFDB) : (macd1_hist[1] < macd1_hist ? #FFCDD2 : #FF5252)))
plot(macd2_hist, title="MACD2 Histogram", style=plot.style_histogram, color=(macd2_hist >= 0 ? (macd2_hist[1] < macd2_hist ? #26A69A : #B2DFDB) : (macd2_hist[1] < macd2_hist ? #FFCDD2 : #FF5252)))

// --- 交易条件 ---
is_deep_green_macd2 = ta.cross(macd2_hist, 0) and macd2_hist > 0 and macd2_hist[1] < macd2_hist
is_deep_red_macd2 = ta.cross(macd2_hist, 0) and macd2_hist < 0 and macd2_hist[1] > macd2_hist

// 检测 MACD1 hist 穿越零轴
macd1_cross_up = macd1_hist > 0
macd1_cross_down = macd1_hist < 0

// 做多条件
long_condition = macd1_cross_up and macd2_hist > 0 and is_deep_green_macd2

// 做空条件
short_condition = macd1_cross_down and macd2_hist < 0 and is_deep_red_macd2

// --- 交易逻辑 ---
if long_condition
    strategy.entry("Long", strategy.long)
    stop_loss_long = strategy.position_avg_price * (1 - stop_loss_pct / 100)
    take_profit_long = strategy.position_avg_price * (1 + take_profit_pct / 100)
    strategy.exit("Long Exit", "Long", stop=stop_loss_long, limit=take_profit_long)

if short_condition
    strategy.entry("Short", strategy.short)
    stop_loss_short = strategy.position_avg_price * (1 + stop_loss_pct / 100)
    take_profit_short = strategy.position_avg_price * (1 - take_profit_pct / 100)
    strategy.exit("Short Exit", "Short", stop=stop_loss_short, limit=take_profit_short)

// --- 警报条件 ---
alertcondition(long_condition, title="Long Entry", message="Dual MACD Strategy: Long Entry Signal")
alertcondition(short_condition, title="Short Entry", message="Dual MACD Strategy: Short Entry Signal")