
Strategi ini menggunakan indikator MACD untuk menentukan arah tren, digabungkan dengan EMA rata-rata dan SMA rata-rata silang sebagai penilaian tambahan. Sinyal masuk melewati garis sinyal pada garis lurus MACD dan tren ke atas, stop loss adalah harga jatuh dari stop loss yang dihitung oleh ATR. Strategi ini juga mengatur keluar dalam kelompok, pertama-tama meratakan sebagian posisi untuk mendapatkan keuntungan, kemudian meratakan sebagian posisi untuk memastikan keuntungan besar ketika harga mencapai kenaikan yang lebih besar, dan bagian terakhir untuk melacak posisi sampai ada stop loss.
Ketika garis cepat EMA melintasi garis lambat EMA, menunjukkan tren perubahan harga jangka pendek lebih baik dari tren jangka panjang, dan dinilai sebagai sinyal beli. Sementara itu, SMA yang melintasi SMA cepat juga menunjukkan momentum kenaikan harga jangka pendek lebih baik dari jangka panjang. Oleh karena itu, kombinasi antara garis MACD yang melintasi jalur sinyal dan EMA & SMA yang berorientasi pada tren, dapat menentukan waktu masuk yang lebih kuat.
ATR digunakan untuk menghitung stop loss. ATR dapat secara efektif mencerminkan kisaran fluktuasi harga. Ketika harga jatuh ke dalam kisaran fluktuasi, maka keluar dari stop loss. ATR dapat disesuaikan dengan siklus, mengurangi siklus dapat membuat stop loss lebih akurat tetapi juga lebih mudah ditembus, dan memperbesar stop loss secara berkala akan lebih lebar tetapi tidak mudah ditembus.
Berangkat dalam kelompok, pertama-tama setelah kenaikan kecil, maka akan dipadamkan sebagian dari uang kembalian posisi. Kemudian, ketika harga naik secara signifikan, maka akan dipadamkan sebagian dari keuntungan posisi. Akhirnya, sebagian dari posisi akan dilacak dan dipegang sampai stop loss memicu stop loss.
Mengoptimalkan parameter MACD untuk menilai tren dengan lebih akurat
Optimalkan parameter siklus ATR agar stop loss lebih sesuai
Mengoptimalkan rasio keluar dan kontrol posisi, mengurangi risiko underwriting
Meningkatkan stop loss mobile atau mempertimbangkan indikator volatilitas untuk mengoptimalkan stop loss
Strategi ini menggabungkan penggunaan berbagai indikator seperti MACD, EMA / SMA untuk menentukan arah tren, untuk mendapatkan waktu masuk yang akurat. Pada saat yang sama, ATR stop loss yang mengambang digunakan untuk mengunci keuntungan dan melacak tren untuk mencapai efek 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")