Joanne on Crypto - Purata Bergerak Berganda dengan Strategi Scalping MACD

Penulis:ChaoZhang, Tarikh: 2023-11-02 16:09:08
Tag:

img

Ringkasan

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.

Logika Strategi

  1. Mengira EMA pantas (12 hari), EMA perlahan (26 hari), dan EMA isyarat (9 hari) MACD.

  2. Mengira histogram MACD (EMA pantas - EMA perlahan) dan garis isyarat MACD (EMA histogram MACD 9 hari).

  3. Mengira MA 50 hari dan 200 hari sebagai trend.

  4. Histogram MACD melintasi di atas 0 adalah isyarat kenaikan dan melintasi di bawah 0 adalah isyarat penurunan.

  5. Pembebasan EMA yang cepat di atas EMA yang perlahan digabungkan dengan pemindahan MA pendek di atas MA panjang memberikan isyarat menaik.

  6. Perpindahan EMA yang cepat di bawah EMA yang perlahan digabungkan dengan pemindahan MA pendek di bawah MA panjang memberikan isyarat penurunan.

  7. Jumlah perdagangan terhad selepas setiap persilangan MA menggunakan perdagangan Max selepas parameter silang EMA.

  8. Gunakan stop loss dan mengambil keuntungan untuk keluar perdagangan.

Kelebihan

  1. MAs berganda menentukan trend keseluruhan untuk mengelakkan perdagangan yang bertentangan dengan trend.

  2. MACD mengenal pasti titik masuk dan keluar untuk menangkap perubahan trend.

  3. Gabungan menyediakan masa yang baik untuk kemasukan ke arah trend.

  4. Mengehadkan bilangan perdagangan selepas persilangan untuk mengelakkan mengejar trend.

  5. Hentikan kerugian dan ambil risiko kawalan keuntungan.

  6. Parameter boleh dioptimumkan untuk prestasi yang lebih baik.

Risiko

  1. Penentuan trend yang salah membawa kepada kerugian trend yang bertentangan.

  2. Isyarat MACD kelewatan tindakan harga yang mengakibatkan entri awal atau lewat.

  3. Stop loss yang tidak betul dan mengambil tahap keuntungan membawa kepada berhenti yang berlebihan atau keuntungan yang tidak mencukupi.

  4. Pengoptimuman parameter adalah sukar. Kombinasi parameter yang berbeza diperlukan untuk produk dan jangka masa yang berbeza. Memerlukan ujian awal yang luas.

Peluang Peningkatan

  1. Uji penunjuk lain seperti KD untuk menentukan trend.

  2. Tambah penunjuk lain untuk menapis isyarat MACD, seperti Bollinger Bands, ATR berhenti.

  3. Mengoptimumkan stop loss dan mengambil keuntungan untuk setiap produk.

  4. Menggunakan optimasi berjalan maju dan rawak untuk mencari parameter yang lebih baik.

  5. Tambah mekanisme untuk mengurangkan kekerapan perdagangan, seperti zon MACD di sekitar 0.

  6. Mengotomatiskan parameter dan pengoptimuman gabungan di pelbagai produk.

Ringkasan

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



Lebih lanjut