Ide inti dari strategi ini adalah untuk menggabungkan rata-rata bergerak ganda dan indikator MACD untuk menentukan arah tren untuk tren setelah perdagangan. Ketika MA cepat melintasi di atas MA lambat, itu menandakan peluang uptrend. Ketika MA cepat melintasi di bawah MA lambat, itu menandakan peluang downtrend. Histogram MACD digunakan untuk menentukan titik masuk dan keluar tertentu dengan pergi panjang ketika melintasi di atas 0 dan pergi pendek ketika melintasi di bawah 0.
Menghitung EMA cepat (12 hari), EMA lambat (26 hari), dan EMA sinyal (9 hari) dari MACD.
Menghitung histogram MACD (EMA cepat - EMA lambat) dan garis sinyal MACD (EMA histogram MACD 9 hari).
Menghitung MAs 50 hari dan 200 hari sebagai tren.
Histogram MACD yang melintasi di atas 0 adalah sinyal bullish dan melintasi di bawah 0 adalah sinyal bearish.
EMA yang cepat melintasi EMA yang lambat dikombinasikan dengan MA pendek melintasi MA panjang memberikan sinyal bullish.
Penembusan EMA cepat di bawah EMA lambat dikombinasikan dengan penembusan MA pendek di bawah MA panjang memberikan sinyal bearish.
Jumlah perdagangan batas setelah setiap penyeberangan MA menggunakan perdagangan Max setelah parameter silang EMA.
Gunakan stop loss dan take profit untuk keluar dari perdagangan.
MAs ganda menentukan tren keseluruhan untuk menghindari perdagangan yang bertentangan dengan tren.
MACD mengidentifikasi titik masuk dan keluar untuk menangkap pergeseran tren.
Kombinasi memberikan waktu yang baik untuk entri ke arah tren.
Batasi jumlah perdagangan setelah crossover untuk menghindari mengejar tren.
Hentikan kerugian dan ambil risiko pengendalian keuntungan.
Parameter dapat dioptimalkan untuk kinerja yang lebih baik.
Penentuan tren yang salah mengarah pada kerugian kontra-tren.
Sinyal MACD menunda tindakan harga yang mengakibatkan entri dini atau terlambat.
Stop loss dan take profit yang tidak tepat menyebabkan stop yang berlebihan atau keuntungan yang tidak cukup.
Optimasi parameter sulit. Kombinasi parameter yang berbeda diperlukan untuk produk dan kerangka waktu yang berbeda. Membutuhkan pengujian awal yang luas.
Uji indikator lain seperti KD untuk menentukan tren.
Tambahkan indikator lain untuk menyaring sinyal MACD, seperti Bollinger Bands, ATR stop.
Optimalkan stop loss dan ambil keuntungan untuk setiap produk.
Gunakan optimasi berjalan dan acak untuk menemukan parameter yang lebih baik.
Tambahkan mekanisme untuk mengurangi frekuensi perdagangan, seperti zona MACD di sekitar 0.
Mengotomatiskan parameter dan kombinasi optimasi di berbagai produk.
Strategi ini menggabungkan kekuatan MAs ganda untuk arah tren dan MACD untuk waktu masuk untuk menciptakan sistem trend berikut yang kuat. Peningkatan kinerja tambahan dimungkinkan melalui optimasi parameter dan penggabungan indikator. Secara keseluruhan, ia memiliki manajemen risiko yang kuat dan potensi keuntungan yang harus dipertimbangkan untuk perdagangan langsung.
/*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')