Idea utama strategi ini adalah untuk menggabungkan purata bergerak berganda dan penunjuk MACD untuk menentukan arah trend untuk trend selepas perdagangan. Apabila MA pantas melintasi di atas MA perlahan, ia menandakan peluang trend menaik. Apabila MA pantas melintasi di bawah MA perlahan, ia menandakan peluang downtrend. Histogram MACD digunakan untuk menentukan titik masuk dan keluar tertentu dengan pergi lama apabila melintasi di atas 0 dan pergi pendek apabila melintasi di bawah 0.
Mengira EMA pantas (12 hari), EMA perlahan (26 hari), dan EMA isyarat (9 hari) MACD.
Mengira histogram MACD (EMA pantas - EMA perlahan) dan garis isyarat MACD (EMA histogram MACD 9 hari).
Mengira MA 50 hari dan 200 hari sebagai trend.
Histogram MACD melintasi di atas 0 adalah isyarat kenaikan dan melintasi di bawah 0 adalah isyarat penurunan.
Pembebasan EMA yang cepat di atas EMA yang perlahan digabungkan dengan pemindahan MA pendek di atas MA panjang memberikan isyarat menaik.
Perpindahan EMA yang cepat di bawah EMA yang perlahan digabungkan dengan pemindahan MA pendek di bawah MA panjang memberikan isyarat penurunan.
Jumlah perdagangan terhad selepas setiap persilangan MA menggunakan perdagangan Max selepas parameter silang EMA.
Gunakan stop loss dan mengambil keuntungan untuk keluar perdagangan.
MAs berganda menentukan trend keseluruhan untuk mengelakkan perdagangan yang bertentangan dengan trend.
MACD mengenal pasti titik masuk dan keluar untuk menangkap perubahan trend.
Gabungan menyediakan masa yang baik untuk kemasukan ke arah trend.
Mengehadkan bilangan perdagangan selepas persilangan untuk mengelakkan mengejar trend.
Hentikan kerugian dan ambil risiko kawalan keuntungan.
Parameter boleh dioptimumkan untuk prestasi yang lebih baik.
Penentuan trend yang salah membawa kepada kerugian trend yang bertentangan.
Isyarat MACD kelewatan tindakan harga yang mengakibatkan entri awal atau lewat.
Stop loss yang tidak betul dan mengambil tahap keuntungan membawa kepada berhenti yang berlebihan atau keuntungan yang tidak mencukupi.
Pengoptimuman parameter adalah sukar. Kombinasi parameter yang berbeza diperlukan untuk produk dan jangka masa yang berbeza. Memerlukan ujian awal yang luas.
Uji penunjuk lain seperti KD untuk menentukan trend.
Tambah penunjuk lain untuk menapis isyarat MACD, seperti Bollinger Bands, ATR berhenti.
Mengoptimumkan stop loss dan mengambil keuntungan untuk setiap produk.
Menggunakan optimasi berjalan maju dan rawak untuk mencari parameter yang lebih baik.
Tambah mekanisme untuk mengurangkan kekerapan perdagangan, seperti zon MACD di sekitar 0.
Mengotomatiskan parameter dan pengoptimuman gabungan di pelbagai produk.
Strategi ini menggabungkan kekuatan MAs berganda untuk arah trend dan MACD untuk masa kemasukan untuk mewujudkan sistem trend berikut yang kukuh. Peningkatan prestasi tambahan mungkin melalui pengoptimuman parameter dan menggabungkan penunjuk. Secara keseluruhan, ia mempunyai pengurusan risiko dan potensi keuntungan yang kuat untuk dipertimbangkan untuk perdagangan langsung. Tetapi ujian parameter masih diperlukan untuk setiap produk untuk memastikan ketahanan.
/*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')