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.
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.
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.
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.
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.
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
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")