Joanne on Crypto - Rata-rata Bergerak Ganda dengan Strategi Scalping MACD

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

img

Gambaran umum

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.

Logika Strategi

  1. Menghitung EMA cepat (12 hari), EMA lambat (26 hari), dan EMA sinyal (9 hari) dari MACD.

  2. Menghitung histogram MACD (EMA cepat - EMA lambat) dan garis sinyal MACD (EMA histogram MACD 9 hari).

  3. Menghitung MAs 50 hari dan 200 hari sebagai tren.

  4. Histogram MACD yang melintasi di atas 0 adalah sinyal bullish dan melintasi di bawah 0 adalah sinyal bearish.

  5. EMA yang cepat melintasi EMA yang lambat dikombinasikan dengan MA pendek melintasi MA panjang memberikan sinyal bullish.

  6. Penembusan EMA cepat di bawah EMA lambat dikombinasikan dengan penembusan MA pendek di bawah MA panjang memberikan sinyal bearish.

  7. Jumlah perdagangan batas setelah setiap penyeberangan MA menggunakan perdagangan Max setelah parameter silang EMA.

  8. Gunakan stop loss dan take profit untuk keluar dari perdagangan.

Keuntungan

  1. MAs ganda menentukan tren keseluruhan untuk menghindari perdagangan yang bertentangan dengan tren.

  2. MACD mengidentifikasi titik masuk dan keluar untuk menangkap pergeseran tren.

  3. Kombinasi memberikan waktu yang baik untuk entri ke arah tren.

  4. Batasi jumlah perdagangan setelah crossover untuk menghindari mengejar tren.

  5. Hentikan kerugian dan ambil risiko pengendalian keuntungan.

  6. Parameter dapat dioptimalkan untuk kinerja yang lebih baik.

Risiko

  1. Penentuan tren yang salah mengarah pada kerugian kontra-tren.

  2. Sinyal MACD menunda tindakan harga yang mengakibatkan entri dini atau terlambat.

  3. Stop loss dan take profit yang tidak tepat menyebabkan stop yang berlebihan atau keuntungan yang tidak cukup.

  4. Optimasi parameter sulit. Kombinasi parameter yang berbeda diperlukan untuk produk dan kerangka waktu yang berbeda. Membutuhkan pengujian awal yang luas.

Peluang Peningkatan

  1. Uji indikator lain seperti KD untuk menentukan tren.

  2. Tambahkan indikator lain untuk menyaring sinyal MACD, seperti Bollinger Bands, ATR stop.

  3. Optimalkan stop loss dan ambil keuntungan untuk setiap produk.

  4. Gunakan optimasi berjalan dan acak untuk menemukan parameter yang lebih baik.

  5. Tambahkan mekanisme untuk mengurangi frekuensi perdagangan, seperti zona MACD di sekitar 0.

  6. Mengotomatiskan parameter dan kombinasi optimasi di berbagai produk.

Ringkasan

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



Lebih banyak