더블 이동 평균 교차 MACD 추세 추종 전략


생성 날짜: 2024-01-23 11:22:02 마지막으로 수정됨: 2024-01-23 11:22:02
복사: 1 클릭수: 594
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

더블 이동 평균 교차 MACD 추세 추종 전략

개요

이 전략은 두 개의 이동 평균을 교차하는 MACD 기술 지표를 기반으로 구현하는 자동 거래 전략이다. MACD 지표의 빠른 느린 선 교차 신호를 사용하여 트렌드 방향을 판단하고 트렌드 추적을 구현한다.

전략 원칙

이 전략은 먼저 MACD 지표의 세 개의 곡선을 계산한다: 빠른 선, 느린 선, 그리고 오차 선. 빠른 선은 일정한 주기 내의 더 빠른 이동 평균이며, 느린 선은 더 긴 주기 내의 이동 평균이다. 오차 선은 빠른 선과 느린 선의 차이다. 빠른 선에서 느린 선을 통과하면 금 포크 신호가 있고, 구매 신호를 나타냅니다. 빠른 선 아래에서 느린 선을 통과하면 사다 신호가 있으며, 판매 신호를 나타냅니다.

이 전략은 이 원리를 활용하여, 골드 포크 때 더 많이 하고, 데드 포크 때 평소; 또는 데드 포크 때 공백하고, 골드 포크 때 평소, 자동으로 트렌드를 추적한다. 동시에, 전략은 MACD 선의 절대값을 긍정 부정으로 판단하고, 가짜 신호를 피하고, 트렌드 전환점을 진정으로 잡는 것을 보장한다.

전략적 이점

  • 트렌드 방향을 판단하기 위해 이중 이동 평균을 교차하여 트렌드 전환을 정확하게 캡처합니다.
  • MACD 기술 지표는 가짜 신호를 줄이고 신호 품질을 향상시킵니다.
  • 더 많은 공백을 선택하거나 더 많은/공백을 선택할 수 있는 유연성
  • 다른 시장 환경에 적응할 수 있는 변수

전략적 위험

  • 이중 이동 평균의 교차가 지연되어 전환이 시작되는 일부 수익을 놓칠 수 있습니다.
  • MACD 지표는 흔들리는 시장에서 가짜 신호를 발생시킬 수 있습니다.
  • 너무 민감하거나 느린 것을 피하기 위해 매개 변수를 적절하게 조정해야 합니다.

위험 해결 방법:

  • 다른 지표와 결합하여 필터링 신호
  • 변수 조정, 거래 빈도를 낮추기
  • 트렌드가 뚜렷할 때만 이 전략을 씁니다.

전략 최적화 방향

이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.

  1. 다른 지표 확인 신호와 결합하여, 예를 들어, KDJ 지표, 브린 밴드 지표 등, 가짜 신호를 필터링

  2. 출전 메커니즘의 변경, 예를 들어, 예상보다 일찍 또는 늦게 출전을 방지하기 위해 돌파구 필터를 추가합니다.

  3. 최적화 매개 변수 설정, 다른 주기 및 시장 환경에 따라 빠른 라인 느린 라인 주기를 조정, 시장에 적응

  4. 단독 손실을 통제하기 위한 HAL 전략에 참여하세요.

  5. 외환, 디지털 화폐 등으로 확장할 수 있습니다.

요약하다

이 이중 이동 평균 교차 MACD 트렌드 추적 전략은 MACD 지표를 사용하여 트렌드 방향을 판단하고, 느리고 느린 선 교차 필터 신호와 함께, 트렌드 전환을 효과적으로 포착하고, 트렌드를 자동으로 추적할 수 있습니다. 전략의 장점은 트렌드를 정확하게 판단하고, 매개 변수를 조정할 수 있으며, 시장 환경에 따라 최적화 할 수 있습니다.

전략 소스 코드
/*backtest
start: 2023-01-16 00:00:00
end: 2024-01-22 00:00:00
period: 1d
basePeriod: 1h
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/
// © DeMindSET

//@version=4
strategy("MACD Trend Follow Strategy", overlay=false)
// Getting inputs
LSB = input(title="Long/Short", defval="Long only", options=["Long only", "Short only" , "Both"]) 
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

plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
plot(macd, title="MACD", color=col_macd, transp=0)
plot(signal, title="Signal", color=col_signal, transp=0)
//
Bull= macd > signal
Bear= macd < signal
ConBull=macd>0
ConBear=macd<0
//
Green= Bull and ConBull
Red= Bear and ConBear
Yellow= Bull and ConBear
Blue= Bear and ConBull
//
bcolor = Green ? color.green : Red ? color.red : Yellow ? color.yellow : Blue ? color.blue : na
barcolor(color=bcolor)
// === INPUT BACKTEST RANGE ===
FromYear  = input(defval = 2019, title = "From Year", minval = 1920)
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2009)
ToMonth   = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 31, title = "To Day", minval = 1, maxval = 31)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true // create function "within window of time"

if LSB == "Long only" and Green
    strategy.entry("L",true)
if LSB == "Long only" and Red
    strategy.close("L",qty_percent=100,comment="TP Long")
if LSB == "Both" and Green
    strategy.entry("L",true)
if LSB == "Both" and Red
    strategy.entry("S",false)
if LSB == "Short only" and Red
    strategy.entry("S",false)
if LSB == "Short only" and Green
    strategy.close("S",qty_percent=100,comment="TP Short")