MACD Moving Average Crossover Trend Mengikut strategi dengan Stop Loss Trailing

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

img

Ringkasan

Strategi ini menggunakan MACD untuk menentukan arah trend, digabungkan dengan EMA dan SMA crossover sebagai pengesahan. Isyarat kemasukan adalah apabila histogram MACD melintasi di atas garis isyarat dan trendnya naik. Stop loss ditetapkan pada tahap harga di bawah stop trailing ATR terapung. Strategi ini juga keluar sebahagiannya untuk mengambil keuntungan, keluar lebih banyak pada lonjakan harga yang lebih besar, dan memegang beberapa kedudukan dengan stop trailing sehingga stop loss dipukul.

Logik

Isyarat kemasukan

Apabila EMA yang lebih cepat melintasi di atas EMA yang lebih perlahan, ia menunjukkan trend jangka pendek lebih baik daripada trend jangka panjang, menandakan pembelian. Sementara itu, SMA yang lebih cepat melintasi di atas SMA yang lebih perlahan juga menunjukkan momentum menaik yang lebih kuat dalam jangka pendek.

Hentikan Kerugian

ATR digunakan untuk mengira tahap stop loss. ATR boleh mengukur julat turun naik harga dengan berkesan. Apabila harga pecah di bawah julat ini, stop loss dicetuskan. Tempoh ATR boleh diselaraskan - tempoh yang lebih kecil membolehkan berhenti yang lebih tepat tetapi lebih mudah dihentikan, sementara tempoh yang lebih besar memberikan berhenti yang lebih luas tetapi lebih kuat.

Isyarat Keluar

Keluar sebahagiannya pada lonjakan harga kecil untuk mengambil keuntungan. Keluar lebih banyak pada lonjakan harga yang besar untuk mengunci keuntungan. Mengekalkan beberapa kedudukan dengan hentian penunggang sehingga stop loss dipukul. Ini membantu mengunci keuntungan, sementara masih dapat memegang kedudukan untuk beberapa tempoh.

Kelebihan

  • Trend penilaian MACD digabungkan dengan persilangan EMA/SMA mengesahkan masa kemasukan
  • Hentian trailing ATR membolehkan stop loss yang berkesan semasa mengikuti trend
  • Penarikan separa membantu mengambil keuntungan, mengunci keuntungan dan memegang untuk tempoh

Risiko & Penyelesaian

  • Risiko isyarat yang salah dari MACD dan penunjuk trend.

  • Risiko ATR stop loss yang dipukul. Boleh meningkatkan tempoh ATR atau stop loss pengganda.

  • Risiko kedudukan belakang terperangkap. mengurangkan saiz kedudukan belakang dan memotong kerugian dalam masa.

Peluang Peningkatan

  • Mengoptimumkan parameter MACD untuk penilaian trend yang lebih baik

  • Mengoptimumkan tempoh ATR untuk tahap stop loss yang lebih baik

  • Mengoptimumkan nisbah keluar dan saiz kedudukan untuk mengurangkan risiko terperangkap

  • Pertimbangkan untuk menambah bergerak mengambil keuntungan atau indeks turun naik untuk meningkatkan stop loss

Ringkasan

Strategi ini menggabungkan MACD, EMA/SMA dan penunjuk lain untuk menentukan trend dan masa kemasukan dengan tepat. Stop loss ATR terapung membantu mengunci keuntungan sambil mengikuti trend. Keluarannya disusun untuk mengambil keuntungan, memastikan keuntungan dan memegang kedudukan untuk tempoh. Secara keseluruhan ia stabil dengan hasil yang baik. Tetapi parameter dan keluar dapat dioptimumkan lagi untuk pulangan 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 lanjut