この戦略の主なアイデアは,トレンドのトレンド方向を決定するために,デュアル・ムービング・平均値とMACD指標を組み合わせることです.速いMAがスローMAを超えると,上向きの機会をシグナルします.速いMAがスローMAを下回ると,ダウントレンドの機会をシグナルします.MACDヒストグラムは,特定のエントリー&エグジットポイントを決定するために,0を超えるとロングになり,0を下回るとショートします.
MACDの高速EMA (12日),遅いEMA (26日),シグナルEMA (9日) を計算する.
MACDヒストグラム (高速EMA - 遅いEMA) とMACD信号線 (MACDヒストグラムの9日間のEMA) を計算する.
50日および200日MAsを傾向として計算する.
MACDヒストグラムが0を超えると上昇信号で,0を下回ると下落信号です.
緩やかなEMAを突破した速いEMAと,長いMAを突破した短いMAは,上昇シグナルを示します.
低速EMAを下回る高速EMAと,低速EMAを下回る短いEMAは下降シグナルを示します.
EMAクロスパラメータの後に最大取引を使用した各MAクロスオーバー後の取引の制限数
ストップ・ロスを使って 取引を終了します
二重MAsは,反トレンド取引を避けるため,全体的なトレンドを決定します.
MACDは,トレンドシフトを把握するためのエントリーとアウトプット点を識別します.
組み合わせは,トレンド方向へのエントリに良いタイミングを提供します.
クロスオーバー後の取引数を制限し,トレンドを追うのを避ける.
損失を止め 利益をコントロールするリスクをとる
パラメータは最適化して性能が向上できます
間違ったトレンド決定は逆トレンド損失につながります. 確固としたトレンドを確立するためにMA差の要件を拡大します.
MACD信号は価格の動きを遅らせ,早期または遅刻入場を起こす.MACDパラメータを調整するかフィルターを追加します.
不適切なストップ・ロストとテイク・プロフィートレベルは,過剰なストップまたは不十分なプロフィートにつながります.各インstrumentのパラメータ最適化が必要です.
パラメータ最適化は困難である.異なる製品とタイムフレームに異なるパラメータの組み合わせが必要である.広範な初期テストを必要とする.
KDのような他の指標をテストして 傾向を特定します
ボリンジャー帯やATRストップなどMACD信号をフィルターする他の指標を追加します
ストップ・ロスを最適化し 各商品の利益を取ります
より良いパラメータを見つけるために ウォークフォワードとランダム最適化を使用します
取引頻度を減らすメカニズムを追加します 例えばMACDゾーンが0の周りに
パラメータと組み合わせの最適化を複数の製品で自動化します
この戦略は,トレンド指向と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')