이중 이동 평균선과 MACD 지표를 기반으로 한 추세 추종 전략


생성 날짜: 2023-11-02 16:09:08 마지막으로 수정됨: 2023-11-02 16:09:08
복사: 2 클릭수: 820
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

이중 이동 평균선과 MACD 지표를 기반으로 한 추세 추종 전략

개요

이 전략의 핵심 아이디어는 쌍평균선과 MACD 지표를 결합하여 트렌드 방향을 판단하여 트렌드 추적 거래를 구현하는 것입니다. 단기평균선 상에서 장기평균선을 통과하면 낙점 기회로 판단하고, 단기평균선 아래에서 장기평균선을 통과하면 낙점 기회로 판단합니다. MACD 지표는 매수점을 판단하고, MACD 기둥에서 0 축을 통과하면 낙점하고, 아래로 통과하면 낙점합니다.

전략 원칙

  1. 고속선 EMA (일일 12호선), 느린선 EMA (일일 26호선) 및 신호선 EMA (일일 9호선) 을 계산한다.

  2. MACD 기둥선 ((고속선 - 느린선) 과 MACD 신호선 ((MACD의 9일선) 을 계산한다.

  3. 50일선과 200일선을 계산하여 큰 경향을 판단하는 평균선으로

  4. MACD 기둥선 상에서 0축을 통과하여 시향 신호를, 아래로 0축을 통과하여 시향 신호를 니다.

  5. 빠른 선에서 느린 선을 통과하고 단기 평균 선에서 장기 평균 선을 통과하여 포지션 신호로 사용한다.

  6. 빠른 선이 느린 선을 통과하고 단기 평균 선이 긴 평균 선을 통과하여 하향 신호로 사용한다.

  7. 매번 평균선 방향이 바뀌면, Max trades after EMA cross 파라미터 컨트롤을 통해 몇 번의 거래가 허용된다.

  8. 진입 후 스톱로스 스톱 플레인 포지션

전략적 이점

  1. 이중평등선으로 큰 트렌드를 판단하고, 역동적인 거래를 피한다.

  2. MACD는 매매 지점을 판단하여 동향 전환을 파악할 수 있다.

  3. 이중 평행선과 MACD 지표가 결합되어 트렌드에서 더 좋은 입시 시기를 잡을 수 있다.

  4. 최대 거래 횟수를 설정하고, 추격하는 것을 피하십시오.

  5. 손해 방지 장치 제어 위험

  6. 더 나은 파라미터 조합을 얻을 수 있습니다.

전략적 위험

  1. 큰 트렌드 판단 오류로 인해 역동 거래 손실이 발생한다. 큰 트렌드를 포착하기 위해 평균 경차 요구 사항을 적절히 완화 할 수 있습니다.

  2. MACD 매매 신호가 지연되어 있기 때문에 초과 또는 늦은 진입이 발생할 수 있습니다. MACD 파라미터를 조정할 수 있으며 다른 지표 필터 신호와 결합 할 수도 있습니다.

  3. 상쇄막 설정이 잘못되어 너무 느슨하거나 너무 단단하여 상쇄막이 너무 많거나 충분하지 않습니다. 다양한 품종에 대한 변수 최적화 테스트가 필요합니다.

  4. 매개 변수 최적화는 어렵고, 다양한 품종과 시간 주기에는 다양한 매개 변수 조합이 필요하며, 많은 사전 테스트 작업이 필요합니다.

전략 최적화 방향

  1. KD 지표와 같은 다른 평형 지표로 큰 흐름을 판단해 보세요.

  2. 다른 지표와 결합하여 MACD 필터링 신호를 보조하는 것을 시도하십시오.

  3. 정지파수 최적화, 다양한 품종에 대한 개별 테스트에서 최적의 파라미터 조합을 찾는다.

  4. 점진적 최적화와 무작위적 최적화 방법을 사용하여 더 우수한 변수 조합을 찾습니다.

  5. MACD 0축 근처에 교차 금지 구역을 설정하는 것과 같은 거래 빈도를 낮추는 메커니즘을 추가하십시오.

  6. 여러 품종에 대해 자동으로 매개 변수 최적화 및 조합 최적화를 수행한다.

요약하다

이 전략은 쌍평평선을 사용하여 큰 트렌드를 판단하고 MACD를 판단하여 매매점을 판단하여 강력한 트렌드 추적 전략을 형성한다. 변수 최적화 및 지표 조합을 통해 전략의 성능을 더욱 향상시킬 수 있다. 전반적으로 이 전략은 강력한 위험 저항 능력과 수익 공간을 가지고 있으며 실장에서 고려할 가치가 있다. 그러나 전략의 안정성을 보장하기 위해 서로 다른 품목에 대해 개별적으로 변수 최적화 테스트를 수행해야합니다.

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

//@version=5
strategy(title="ComiCo - Joel on Crypto - MACD Scalping", shorttitle="ComiCo - Joel on Crypto - MACD Scalping")
// Getting inputs
slow_length1 = input(title="EMA Trend 1", defval=50)
slow_length2 = input(title="EMA Trend 2 ", defval=200)
fast_length = input(title="MACD Fast Length", defval=12)
slow_length = input(title="MACD Slow Length", defval=26)
signal_length = input.int(title="MACD Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
src = input(title="MACD Source", defval=close)

i_switch = input.string(title="Tick Highlight", defval="Moving average" ,options=["Moving average","Fixed value" ])
i_switch2 = input.string(title="Tick Source", defval="Highest bar" ,options=["Highest bar","Average","Last bar"])

signal_lengthup = input.int(title="Upticks Avg. Length",  minval = 1, maxval = 5000, defval = 72)
signal_lengthdown = input.int(title="Downticks Avg. Length",  minval = 1, maxval = 5000, defval = 72)

signal_lengthMA = input.float(title="Ticks Avg. Multiplier",  minval = 0, maxval = 5000, defval = 2, step = 0.1)

sma_source = "EMA"
sma_signal = "EMA"
// Plot colors

col_grow_above = #26A69A
col_fall_above =#B2DFDB
col_grow_below = #FFCDD2
col_fall_below = #FF5252
// Calculating

fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)

time_macd=timeframe.period=="1"?"1": timeframe.period=="3"?"1": timeframe.period=="5"?"1": timeframe.period=="15"?"3":timeframe.period=="30"?"5":timeframe.period=="60"?"15":timeframe.period=="120"?"30":timeframe.period=="240"?"60":timeframe.period=="D"?"240":timeframe.period=="W"?"D":timeframe.period=="M"?"W":timeframe.period=="12M"?"M":timeframe.period



macd = fast_ma - slow_ma
macd1=request.security(syminfo.tickerid, time_macd, macd)
signal = sma_signal == "SMA" ? ta.sma(macd1, signal_length) : ta.ema(macd1, signal_length)

ema50=ta.ema(close,slow_length1)
ema200=ta.ema(close ,slow_length2)

var TradeCounter = 0
MaxCount = input.int(title = "Max trades after EMA cross", minval = 0, maxval = 1000, defval = 3)
bull = ema50>ema200
if bull != bull[1]
    TradeCounter := 0


hist = request.security(syminfo.tickerid, time_macd, macd1 - signal)


f() => [hist[4],hist[3],hist[2],hist[1], hist]
ss=request.security(syminfo.tickerid, time_macd, hist, barmerge.gaps_on,barmerge.lookahead_off)



[ss5,ss4,ss3,ss2,ss1]=request.security(syminfo.tickerid, time_macd, f(), barmerge.gaps_on,barmerge.lookahead_off)



a = array.from(ss5,ss4,ss3,ss2,ss1)

s3=i_switch2=="Highest bar"?(ss>0? array.max(a, 0) : array.min(a, 0)):i_switch2=="Average"?array.avg(a):i_switch2=="Last bar"?ss1:0

saa=timeframe.period == '1'? ss:s3

saa2=timeframe.period == '1'? ss:s3*signal_lengthMA


colorss=(s3>=0 ? (s3[1] < s3 ? col_grow_above : col_fall_above) : (s3[1] < s3 ? col_grow_below : col_fall_below))


saadown = saa2
saaup = saa2

saadown:=saa>=0? saa2:saadown[1]

saaup:=saa<0? saa2:saaup[1]



verr=ta.ema(saadown,signal_lengthup)
dowww=ta.ema(saaup,signal_lengthdown)

ss22=plot(verr, title="Avg. Cloud Upper 1", color=color.new(color.white, 100))
ss33=plot(dowww, title="Avg. Cloud Lower 1", color=color.new(color.white, 100))

fill(ss22, ss33, color.new(color.white, 93), title="Avg. Cloud Background")

fixeduptick = input(title="Fixed Uptick Value", defval=30)
fixeddowntick = input(title="Fixed Downtick Value", defval=-30)
minl = i_switch=="Fixed value"? fixeduptick  :  verr
maxl = i_switch=="Fixed value"? fixeddowntick : dowww 

plot(minl, title="Avg. Cloud Upper 2", color=color.new(color.white, 81))
plot(maxl, title="Avg. Cloud Lower 2", color=color.new(color.white, 81))


colors2= s3<=minl and s3>=maxl ? #2a2e39 : colorss

coro2=s3>0? ema50>ema200 ? #2a2e39 :  colors2 : ema50<ema200 ? #2a2e39: colors2
plot(saa, title="Histogram", style=plot.style_columns, color=coro2)

LimitDiff = input.float(title="Limit Price Difference",  minval = 0, maxval = 0.1, defval = 0.005, step = 0.0005)
TP = input.float(title="Take Profit",  minval = 0, maxval = 0.1, defval = 0.005, step = 0.0005)
SL = input.float(title="Stop Loss",  minval = 0, maxval = 0.1, defval = 0.004, step = 0.0005)

minEMAdiff = input.float(title = "Min EMA difference", defval = 100, step = 10)

if #2a2e39 != coro2
    a22 = 0
    if ema50<ema200 and TradeCounter < MaxCount and math.abs(ema50-ema200) > minEMAdiff
        LimitPrice = close * (1 + LimitDiff)
        strategy.entry("enter short", strategy.short, limit = LimitPrice)
        strategy.exit("exit short", "enter short", limit = LimitPrice * (1 - TP), stop = LimitPrice * (1 + SL))
        TradeCounter := TradeCounter + 1
    if ema50>ema200 and TradeCounter < MaxCount and math.abs(ema50-ema200) > minEMAdiff
        LimitPrice = close * (1 - LimitDiff)
        strategy.entry("enter long", strategy.long, limit = LimitPrice)
        strategy.exit("exit long", "enter long", limit = LimitPrice * (1 + TP), stop = LimitPrice * (1 - SL))
        TradeCounter := TradeCounter + 1

//alertcondition(#2a2e39 != coro2 , title='MACD Tick Alert', message='Joel on Crypto - MACD Tick Alert')