MACD 정량 전략 - 더블 크로스 이동 평균 돌파 전략


생성 날짜: 2024-02-22 15:32:42 마지막으로 수정됨: 2024-02-22 15:32:42
복사: 0 클릭수: 679
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

MACD 정량 전략 - 더블 크로스 이동 평균 돌파 전략

개요

이 전략은 빠른 이동 평균선과 느린 이동 평균선의 차이를 계산하여 MACD 지표를 형성하고, 신호선을 결합하여 금융 시장의 추세와 과매매 영역을 판단합니다. MACD와 신호선은 다중 포크 포크를 형성하고 동시에 가격이 200 일 평균선보다 높을 때 더 많이 할 수 있으며, 공백 포크 포크를 형성하고 동시에 가격이 200 일 평균선보다 낮을 때 공백 할 수 있습니다. 전형적인 쌍 포크 포크 평균선 돌파 전략에 속합니다.

전략 원칙

기본 원칙은 빠른 이동 평균선과 느린 이동 평균선의 차이를 계산하여 MACD 지표를 형성하여 시장의 경향 방향을 판단하고, 신호선을 사용하여 초매매 지역을 판단한다. MACD와 신호선이 금포크를 형성할 때 다중 신호로 더하고, 사다리 포크를 형성할 때 공백 신호로 공백한다. 또한 가격과 200 일 평균선과의 관계를 결합하여 교차 신호를, 200 일 평균선 이상의 가격에서만 금포크를 더하고, 200 일 평균선 이하의 가격에서는 사다리 포크를 공백하게 하여 강도 트렌드 중 잘못된 신호를 피한다.

계산 방법은 다음과 같습니다.

  1. 빠르게 움직이는 평균선 ((12일 EMA) 을 빼고 천천히 움직이는 평균선 ((26일 EMA) 을 얻어 MACD
  2. MACD의 9일 EMA가 신호선을 얻었습니다.
  3. MACD 빼기 신호선은 MACD 직사각형이 됩니다.

MACD 상에서 신호선을 통과하고 MACD와 신호선이 동시에 0보다 낮으면 황금 포크에 더 많은 신호를, MACD 아래에서 신호선을 통과하고 MACD와 신호선이 동시에 0보다 높으면 죽은 포크에 공백 신호를 낸다. 또한 가격이 200 일 평균선보다 높으면 황금 포크에 더 많은 신호를, 200 일 평균선보다 낮은 가격이 죽은 포크에 공백 신호를 낸다.

전략적 이점

  1. 이중 지표 판단을 사용하여 단일 지표 판단의 한계를 피하고 신호의 정확도를 향상시킵니다.
  2. 가격과 평행 관계의 듀얼 필터링을 결합하여 강세 트렌드에서 잘못된 신호를 피합니다.
  3. 변수 최적화 공간이 넓고, 평균선 변수를 조정하여 다른 시장 환경에 적응할 수 있다.
  4. 보수적인 파라미터 설정으로 신호가 적지만 정확도가 높습니다.
  5. 이해하기 쉽고 실행할 수 있는 전략

전략적 위험

  1. 시장이 급격하게 변동할 때 지표 판단이 영향을 받아 잘못된 신호가 발생합니다.
  2. 일차 시스템 자체의 지연은 전략의 시기적절성에 영향을 미칩니다.
  3. 신호가 적고, 트렌드 기회를 놓치는 것이 쉽습니다.
  4. PARAMETERS 최적화 과잉 최적화 위험
  5. 철수 통제 및 상쇄 철수 메커니즘을 개선해야 합니다.

적당한 평균주기를 줄이고, 다른 지표 판단을 더하고, 손해 방지 조치를 더함으로써 위험을 줄일 수 있다.

전략 최적화 방향

1.tested on different timeframes from 15m upto 1D, where optimal results where on 4H timeframe in terms of risk adjusted returns

2.optimize fast ma and slow ma so that macd represents cycle, I found 7-21 performs good for 15m chart

3.also tested hull moving average for MACD which gave good results

4.stoploss can also be trailed for better risk management

요약하다

이 전략은 전체적으로 매우 간단하고 실용적이며, 이중 지표 판단과 가격 필터링을 통해 높은 확률의 거래 신호를 생성하고, 마진 수익률이 높으며, MACD의 고전적인 파라미터 포메이션을 사용하며, 지나치게 최적화되지 않습니다. 최적화 공간은 매우 넓으며, 평균선 파라미터 포메이션을 조정하고, 다른 지표 판단과 손해 방지 조치를 추가하는 등의 방법으로 전략 성능을 더욱 향상시킬 수 있습니다. 전체적으로 기본에 기초한 전형적인 정량화 전략입니다.

전략 소스 코드
/*backtest
start: 2024-02-14 00:00:00
end: 2024-02-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Hurmun

//@version=4
strategy("Simple MACD strategy ", overlay=true, margin_long=100, margin_short=100)


fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
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, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal


movinga2 = input(title="movinga 2", type=input.integer, defval=200)

movinga200 = sma(close, movinga2)

plot(movinga200, "MA", color.orange)
longCondition = crossover(macd, signal) and macd < 0 and signal < 0 and close > movinga200
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = crossunder(macd, signal) and macd > 0 and signal > 0 and close < movinga200
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)
    
shortProfitPerc = input(title="Short Take Profit (%)", minval=0.0, step=0.1, defval=2) / 100
longProfitPerc = input(title="Long Take Profit (%)", minval=0.0, step=0.1, defval=2) / 100
    
stoploss = input(title="stoploss in %", minval = 0.0, step=1, defval=2) /100

longStoploss = strategy.position_avg_price * (1 - stoploss)
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)

shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)
shortStoploss = strategy.position_avg_price * (1 + stoploss)
    
if (strategy.position_size > 0 )
    strategy.exit(id="XL TP", limit=longExitPrice, stop=longStoploss)






if (strategy.position_size < 0 )
    strategy.exit(id="XS TP", limit=shortExitPrice, stop=shortStoploss)