デュアル移動平均とMACD指標に基づくトレンドフォロー戦略


作成日: 2023-11-02 16:09:08 最終変更日: 2023-11-02 16:09:08
コピー: 2 クリック数: 479
1
フォロー
1182
フォロワー

デュアル移動平均と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. ブリン帯,ATR停止など,MACDフィルタリングを補助する他の指標と組み合わせてみてください.

  3. ストップダメージストップパラメータを最適化し,異なる品種に対してそれぞれテストして最適なパラメータの組み合わせを見つけます.

  4. ステップ・最適化とランダム・最適化により,より優良なパラメータの組み合わせを探します.

  5. MACDのゼロ軸の近くで交差禁止区域を設定するなど,取引頻度を減らすためのメカニズムを追加する.

  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')