MACD Moving Average Crossover Trend Mengikuti strategi dengan Trailing Stop Loss

Penulis:ChaoZhang, Tanggal: 2023-11-06 11:56:14
Tag:

img

Gambaran umum

Strategi ini menggunakan MACD untuk menentukan arah tren, dikombinasikan dengan EMA dan SMA crossover sebagai konfirmasi. Sinyal masuk adalah ketika histogram MACD melintasi di atas garis sinyal dan tren naik. Stop loss ditetapkan pada tingkat harga di bawah stop trailing ATR yang mengambang. Strategi ini juga keluar sebagian untuk mengambil keuntungan, keluar lebih banyak pada lonjakan harga yang lebih besar, dan memegang beberapa posisi dengan stop trailing sampai stop loss dipukul.

Logika

Sinyal masuk

Ketika EMA yang lebih cepat melintasi di atas EMA yang lebih lambat, itu menunjukkan tren jangka pendek lebih baik daripada tren jangka panjang, menandakan pembelian. Sementara itu, SMA yang lebih cepat melintasi di atas SMA yang lebih lambat juga menunjukkan momentum kenaikan yang lebih kuat dalam jangka pendek. Jadi kombinasi garis MACD melintasi di atas sinyal dan tren naik berdasarkan silang EMA&SMA membantu mengidentifikasi sinyal masuk yang lebih kuat.

Hentikan Kerugian

ATR digunakan untuk menghitung tingkat stop loss. ATR dapat secara efektif mengukur rentang fluktuasi harga. Ketika harga pecah di bawah rentang ini, stop loss dipicu. Periode ATR dapat disesuaikan - periode yang lebih kecil memungkinkan stop yang lebih tepat tetapi lebih mudah dihentikan, sementara periode yang lebih besar memberikan stop yang lebih luas tetapi lebih kuat.

Sinyal Keluar

Keluar sebagian pada lonjakan harga kecil untuk mengambil keuntungan. Keluar lebih banyak pada lonjakan harga besar untuk mengunci keuntungan. Menjaga beberapa posisi dengan trailing stop sampai stop loss dipukul. Ini membantu mengunci keuntungan, sementara masih dapat memegang posisi untuk beberapa periode.

Keuntungan

  • Tren penilaian MACD dikombinasikan dengan silang EMA/SMA mengkonfirmasi waktu masuk
  • ATR trailing stop memungkinkan stop loss yang efektif saat mengikuti tren
  • Keluar sebagian membantu mengambil keuntungan, mengunci keuntungan dan memegang untuk durasi

Risiko & Solusi

  • Risiko sinyal yang salah dari indikator MACD dan trend.

  • Risiko ATR stop loss terkena. dapat meningkatkan periode ATR atau stop loss multiplier.

  • Mengurangi ukuran posisi yang tertinggal dan memotong kerugian dalam waktu.

Peluang Peningkatan

  • Mengoptimalkan parameter MACD untuk penilaian tren yang lebih baik

  • Optimalkan periode ATR untuk tingkat stop loss yang lebih baik

  • Mengoptimalkan rasio keluar dan ukuran posisi untuk mengurangi risiko terperangkap

  • Pertimbangkan untuk menambahkan bergerak mengambil keuntungan atau indeks volatilitas untuk meningkatkan stop loss

Ringkasan

Strategi ini menggabungkan MACD, EMA/SMA dan indikator lain untuk menentukan tren dan waktu masuk dengan akurat. Stop loss ATR yang mengambang membantu mengunci keuntungan sambil mengikuti tren. Keluarannya terhambat untuk mengambil keuntungan, memastikan keuntungan dan memegang posisi untuk durasi. Secara keseluruhan stabil dengan hasil yang layak. Tetapi parameter dan keluar dapat lebih dioptimalkan untuk pengembalian yang lebih baik.


/*backtest
start: 2022-10-30 00:00:00
end: 2023-11-05 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Deobald

//@version=4
strategy("MACD Strategy", overlay=true)

// FUNCTIONS

Ema(src,p) =>
    ema = 0.
    sf = 2/(p+1)
    ema := nz(ema[1] + sf*(src - ema[1]),src)

Sma(src,p) => a = cum(src), (a - a[max(p,0)])/max(p,0)

Atr(p) =>
    atr = 0.
    Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1])))
    atr := nz(atr[1] + (Tr - atr[1])/p,Tr)

/// TREND
ribbon_period = input(34, "Period", step=1)

leadLine1 = ema(close, ribbon_period)
leadLine2 = sma(close, ribbon_period)

p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)


// MACD
fast_length = input(title="Fast Length", type=input.integer, defval=3)
slow_length = input(title="Slow Length", type=input.integer, defval=5)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 2)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? Sma(src, fast_length) : Ema(src, fast_length)
slow_ma = sma_source ? Sma(src, slow_length) : Ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? Sma(macd, signal_length) : Ema(macd, signal_length)
hist = macd - signal

//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
// plot(macd, title="MACD", color=col_macd, transp=0)
// plot(signal, title="Signal", color=col_signal, transp=0)



// TAKE PROFIT AND STOP LOSS
long_tp1_inp = input(1, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(10, title="Long Take Profit 1 Qty", step=1)

long_tp2_inp = input(5, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(50, title="Long Take Profit 2 Qty", step=1)

long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)




// Stop Loss
multiplier = input(2.2, "SL Mutiplier", minval=1, step=0.1)
ATR_period=input(17,"ATR period", minval=1, step=1)

// Strategy
entry_long=crossover(macd,signal) and leadLine2 < leadLine1
entry_price_long=valuewhen(entry_long,close,0)
SL_floating_long = entry_price_long - multiplier*Atr(ATR_period)
exit_long= close < SL_floating_long 

///// BACKTEST PERIOD ///////
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod() => true

if testPeriod()
    strategy.entry("long", strategy.long, comment="Long", when=entry_long)
    strategy.exit("TP1","long", qty_percent=long_tp1_qty, limit=long_take_level_1)//, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
    strategy.exit("TP2", qty_percent=long_tp2_qty, limit=long_take_level_2) //, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
    strategy.close_all("long", when=exit_long, comment="exit long" )


// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? SL_floating_long : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")


Lebih banyak