이중 이동 평균 크로스오버 MACD 양적 전략

저자:차오장, 날짜: 2024-02-22 15:32:42
태그:

img

전반적인 설명

이 전략은 빠른 이동 평균선과 느린 이동 평균선 사이의 차이를 계산하여 MACD 지표를 생성하고 신호선과 함께 금융 시장의 트렌드 및 과잉 구매 / 과잉 판매 영역을 판단합니다. 가격이 200 일 MA 이상인 동안 MACD 및 신호선이 황금 십자가를 형성 할 때 길게 이동하고 가격이 200 일 MA 이하인 동안 죽은 십자가를 형성 할 때 짧게됩니다. 이것은 전형적인 이중 이동 평균 크로스오버 브레이크오버 전략에 속합니다.

전략 논리

기본 논리는 시장 트렌드 방향을 결정하기 위해 빠르고 느린 MA 차이에서 생성된 MACD 지표를 사용하고, 과잉 구매 / 과잉 판매 수준을 판단하기 위해 신호 라인을 사용합니다. MACD와 신호 라인이 골든 크로스를 형성할 때, 그것은 긴 신호입니다. 죽은 크로스를 형성할 때, 그것은 짧은 신호입니다. 한편, 그것은 200 일 MA와 가격의 관계를 사용하여 신호를 필터링합니다.

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

  1. MACD를 얻기 위해 빠른 이동 평균 (12일 EMA) 미소 느린 이동 평균 (26일 EMA)
  2. 신호선을 얻기 위해 MACD의 9일 EMA
  3. MACD 신호선을 빼면 MACD 히스토그램을 얻을 수 있습니다.

MACD가 신호선을 넘어서면 둘 다 0보다 낮을 때, 그것은 골든 크로스 긴 신호입니다. MACD가 신호선을 넘어서면 둘 다 0보다 높을 때, 그것은 죽은 크로스 짧은 신호입니다. 한편, 가격이 200 일 MA 이상일 때만 길고 가격이 200 일 MA 이하일 때 짧습니다.

장점

  1. 이중 지표 시스템을 사용하면 단일 지표의 한계를 피하고 정확도를 향상시킵니다.
  2. 가격 액션과 MA 이중 필터를 결합하면 강한 트렌드 중에 위프사우를 피할 수 있습니다.
  3. 다양한 시장 환경에 적응하기 위해 큰 매개 변수 최적화 공간
  4. 보수적인 매개 변수 설정은 더 적은, 그러나 더 높은 품질의 신호로 이어집니다.
  5. 간단하고 쉽게 실행 가능한 전략 논리

위험성

  1. 시장의 변동성은 지표 판단에 오류를 일으킬 수 있습니다.
  2. 시장 재정이 늦어지는 것은 전략의 시기적절성에 영향을 미칩니다.
  3. 더 적은 신호가 트렌드 기회를 놓칠 수 있습니다.
  4. 매개 변수를 최적화 할 때 과도한 최적화 위험
  5. 유출 통제 및 손실 중지 메커니즘의 부재

MA 기간을 단축하고 다른 지표를 추가하고 스톱 로스를 추가함으로써 위험을 줄일 수 있습니다.

최적화 방향

1.15M에서 1D까지의 다양한 시간 프레임에서 테스트, 위험 조정 수익에서 4H에서 최적의 결과

2. 빠른 및 느린 MA를 최적화하여 MACD가 주기를 포착합니다. 7-21은 15m에 좋습니다.

3.MACD에 대한 Hull MA는 좋은 결과를 얻었습니다.

4.후속 손실 중단은 위험 관리에 도움이 됩니다

결론

이것은 전체적으로 매우 간단하고 실용적인 전략이며, 이중 지표 시스템과 가격 필터링을 통해 높은 확률의 거래 신호를 생성합니다. 비교적 높은 이익 마진을 가지고 있으며, 과도한 최적화를 피하기 위해 고전적인 MACD 매개 변수 조합을 사용합니다. 여전히 MA 매개 변수를 조정하여 최적화 할 수있는 많은 공간이 있으며, 성능을 더 향상시키기 위해 다른 지표와 스톱 로스 메커니즘을 추가합니다. 전반적으로 기본에 기반한 전형적인 양적 전략입니다.


/*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)

더 많은