
Strategi perdagangan multi-target berindeks ganda adalah sistem perdagangan kuantitatif yang didasarkan pada sinyal silang antara rata-rata bergerak indeks jangka pendek dan jangka panjang (EMA). Strategi ini menggunakan silang antara 9 siklus dan 21 siklus EMA sebagai sinyal masuk, sambil mengatur hingga 10 target keuntungan dan satu titik stop loss untuk manajemen risiko dan pemaksimalkan keuntungan. Strategi ini mendukung perdagangan dua arah multi-posisi, dengan posisi terbuka saat EMA jangka pendek melewati EMA jangka panjang, kosong saat EMA jangka pendek melewati EMA jangka panjang, dan keluar saat silang terbalik.
Prinsip-prinsip inti dari strategi ini didasarkan pada sistem crossover rata-rata bergerak indeks, yang diimplementasikan sebagai berikut:
Strategi ini mengadopsi metode manajemen risiko yang sistematis, dengan 10% dana akun digunakan secara default untuk setiap transaksi, dengan dana awal 100.000, dan melarang operasi overage.
Untuk mengurangi risiko ini, disarankan untuk memperkenalkan kondisi penyaringan tambahan, seperti indikator kekuatan tren, dan pertimbangkan untuk menyesuaikan stop loss dan target posisi sesuai dengan dinamika pasar yang berfluktuasi.
Dengan optimasi ini, strategi dapat secara signifikan meningkatkan stabilitas dan profitabilitas, mengurangi frekuensi penarikan dan kerugian transaksi.
Strategi perdagangan multi-target moving average adalah sistem perdagangan kuantitatif dengan struktur yang jelas, logika yang sederhana, yang didasarkan pada sinyal silang EMA klasik, dan dilengkapi dengan manajemen keuntungan dan pengaturan stop loss multi-target. Strategi ini cocok untuk perdagangan tren jangka pendek dan menengah, dan lebih baik dalam pasar tren yang jelas.
Meskipun desain strategi relatif sederhana, namun mengandung elemen-elemen inti dari strategi perdagangan: sinyal masuk, kondisi keluar, manajemen stop loss dan target keuntungan. Keuntungan utama dari strategi adalah operasi yang jelas, mudah dipahami dan dilaksanakan, serta dukungan visual yang baik.
Namun, ada juga keterbatasan dari strategi tersebut, seperti ketergantungan pada satu indikator, kurangnya identifikasi lingkungan pasar, dan kurangnya fleksibilitas dalam pengelolaan dana. Strategi ini memiliki ruang yang lebih besar untuk dioptimalkan dengan menambahkan filter tren, mengoptimalkan mekanisme stop loss, dan mencapai keuntungan batch yang nyata dan meningkatkan metode pengelolaan dana.
Bagi trader, strategi ini dapat digunakan sebagai kerangka dasar untuk menyesuaikan dan mengoptimalkan secara individual sesuai dengan preferensi risiko pribadi dan karakteristik varietas perdagangan, untuk mencapai efek perdagangan yang lebih baik.
/*backtest
start: 2024-08-21 00:00:00
end: 2025-08-20 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_OKX","currency":"BNB_USDT","balance":5000}]
*/
//@version=5
strategy("9/21 EMA with 10 Targets + Stoploss",
overlay = true,
initial_capital = 100000,
default_qty_type = strategy.percent_of_equity,
default_qty_value = 10,
pyramiding = 0)
// === Inputs ===
emaFastLen = input.int(9, "Fast EMA Length")
emaSlowLen = input.int(21, "Slow EMA Length")
slPercent = input.float(0.5, "Stoploss %", step=0.1)
// 10 Targets
tp1Percent = input.float(0.5, "Target 1 %", step=0.1)
tp2Percent = input.float(1.0, "Target 2 %", step=0.1)
tp3Percent = input.float(1.5, "Target 3 %", step=0.1)
tp4Percent = input.float(2.0, "Target 4 %", step=0.1)
tp5Percent = input.float(2.5, "Target 5 %", step=0.1)
tp6Percent = input.float(3.0, "Target 6 %", step=0.1)
tp7Percent = input.float(3.5, "Target 7 %", step=0.1)
tp8Percent = input.float(4.0, "Target 8 %", step=0.1)
tp9Percent = input.float(4.5, "Target 9 %", step=0.1)
tp10Percent = input.float(5.0, "Target 10 %", step=0.1)
// === EMA Calculation ===
emaFast = ta.ema(close, emaFastLen)
emaSlow = ta.ema(close, emaSlowLen)
// === Entry Conditions ===
longCond = ta.crossover(emaFast, emaSlow)
shortCond = ta.crossunder(emaFast, emaSlow)
// === Entry ===
if (longCond and strategy.position_size <= 0)
strategy.entry("BUY", strategy.long)
if (shortCond and strategy.position_size >= 0)
strategy.entry("SELL", strategy.short)
// === Series Variables for Targets ===
var float tp1 = na
var float tp2 = na
var float tp3 = na
var float tp4 = na
var float tp5 = na
var float tp6 = na
var float tp7 = na
var float tp8 = na
var float tp9 = na
var float tp10 = na
var float stopLevel = na
// === Long Positions ===
if strategy.position_size > 0
stopLevel := strategy.position_avg_price * (1 - slPercent/100)
tp1 := strategy.position_avg_price * (1 + tp1Percent/100)
tp2 := strategy.position_avg_price * (1 + tp2Percent/100)
tp3 := strategy.position_avg_price * (1 + tp3Percent/100)
tp4 := strategy.position_avg_price * (1 + tp4Percent/100)
tp5 := strategy.position_avg_price * (1 + tp5Percent/100)
tp6 := strategy.position_avg_price * (1 + tp6Percent/100)
tp7 := strategy.position_avg_price * (1 + tp7Percent/100)
tp8 := strategy.position_avg_price * (1 + tp8Percent/100)
tp9 := strategy.position_avg_price * (1 + tp9Percent/100)
tp10 := strategy.position_avg_price * (1 + tp10Percent/100)
strategy.exit("Exit Long", "BUY", stop=stopLevel, limit=tp1)
// === Short Positions ===
if strategy.position_size < 0
stopLevel := strategy.position_avg_price * (1 + slPercent/100)
tp1 := strategy.position_avg_price * (1 - tp1Percent/100)
tp2 := strategy.position_avg_price * (1 - tp2Percent/100)
tp3 := strategy.position_avg_price * (1 - tp3Percent/100)
tp4 := strategy.position_avg_price * (1 - tp4Percent/100)
tp5 := strategy.position_avg_price * (1 - tp5Percent/100)
tp6 := strategy.position_avg_price * (1 - tp6Percent/100)
tp7 := strategy.position_avg_price * (1 - tp7Percent/100)
tp8 := strategy.position_avg_price * (1 - tp8Percent/100)
tp9 := strategy.position_avg_price * (1 - tp9Percent/100)
tp10 := strategy.position_avg_price * (1 - tp10Percent/100)
strategy.exit("Exit Short", "SELL", stop=stopLevel, limit=tp1)
// === Plotting ===
plot(emaFast, "EMA 9", color=color.yellow, linewidth=2)
plot(emaSlow, "EMA 21", color=color.orange, linewidth=2)
// Global plots (avoid local scope error)
plot(tp1, "TP1", color=color.new(color.green, 0))
plot(tp2, "TP2", color=color.new(color.green, 10))
plot(tp3, "TP3", color=color.new(color.green, 20))
plot(tp4, "TP4", color=color.new(color.green, 30))
plot(tp5, "TP5", color=color.new(color.green, 40))
plot(tp6, "TP6", color=color.new(color.green, 50))
plot(tp7, "TP7", color=color.new(color.green, 60))
plot(tp8, "TP8", color=color.new(color.green, 70))
plot(tp9, "TP9", color=color.new(color.green, 80))
plot(tp10, "TP10", color=color.new(color.green, 90))
plot(stopLevel, "Stoploss", color=color.red, linewidth=2)
// Entry Signals
plotshape(longCond, title="BUY Signal", style=shape.labelup, color=color.green, text="BUY")
plotshape(shortCond, title="SELL Signal", style=shape.labeldown, color=color.red, text="SELL")