
Strategi ini menggunakan indikator moving average (EMA) untuk mengidentifikasi potensi tren naik, digabungkan dengan dollar cost averages (DCA) untuk melakukan penambahan taruhan yang cerdas, dan melindungi keuntungan melalui mekanisme penutupan taruhan ganda. Inti dari strategi ini adalah menggunakan persilangan EMA cepat dan EMA lambat untuk menentukan kapan masuk, secara otomatis mengerahkan hingga dua perintah keamanan (Safety Orders) ketika harga turun, meningkatkan posisi taruhan melalui rata-rata real range (ATR) atau perhitungan persentase tetap, dan menggunakan standar penutupan taruhan ganda (standar penutupan taruhan dan penutupan taruhan untuk penutupan taruhan) untuk melindungi dana.
Strategi ini didasarkan pada beberapa komponen utama:
Mekanisme Identifikasi Tren: Menggunakan persilangan EMA cepat (default 9 cycle) dan EMA lambat (default 21 cycle) untuk mengidentifikasi tren naik potensial. Ketika EMA cepat naik melewati EMA lambat, sistem akan menghasilkan sinyal beli.
Pesanan dasar dan amanStrategi ini menggunakan metode manajemen dana bertingkat, dimulai dengan pesanan dasar (default \( 1000) dan menambahkan dua pesanan keamanan tambahan ketika harga turun (default \) 1250 SO1, default $ 1750 SO2).
Perhitungan jarak dinamisHarga yang dipicu dari perintah keamanan dapat dihitung dengan dua cara:
Sistem Stop Loss Dual-Tracking:
Ketentuan KeluarStrategi ini berlaku untuk posisi terendah dalam situasi berikut:
Filter periode dan tanggal pendinginan: Strategi mencakup periode pendinginan setelah pesanan dasar (default 4 jam) dan filter tanggal yang dapat dipilih untuk membatasi pengukuran kembali atau melakukan periode waktu tertentu.
Dari analisis kode strategi ini, kita dapat menyimpulkan beberapa keuntungan utama:
Manajemen Dana AdaptifStrategi menggunakan rata-rata biaya dolar yang dikombinasikan dengan pesanan keamanan dinamis untuk secara otomatis menyesuaikan posisi sesuai dengan kondisi pasar. Metode ini sangat efektif di pasar yang bergejolak, dapat menurunkan harga masuk rata-rata dan meningkatkan potensi keuntungan.
Penyesuaian posisi berdasarkan volatilitasDengan ATR, strategi dapat secara otomatis menyesuaikan interval penambahan posisi sesuai dengan fluktuasi pasar saat ini, lebih fleksibel daripada metode persentase tetap.
Perlindungan laba gandaSistem Double Tracking Stop memberikan manajemen risiko yang inovatif, standar Tracking Stop melindungi sebagian besar dana, sedangkan mekanisme profit lock diaktifkan setelah mencapai target keuntungan tertentu, dengan persentase yang lebih ketat untuk melindungi keuntungan yang telah diperoleh.
Seluruhnya dapat disesuaikanSemua parameter penting (panjang EMA, ukuran pesanan, persentase stop loss, interval pesanan aman) dapat disesuaikan dengan preferensi risiko pedagang dan kondisi pasar.
Sistem peringatan dini terintegrasiStrategi ini berisi kondisi peringatan yang diformat dan dapat diintegrasikan dengan platform otomatisasi pihak ketiga (seperti 3Commas) untuk melakukan transaksi otomatis sepenuhnya.
Transparansi informasi pelantikan: berisi tabel debug terperinci yang menampilkan indikator dan status perdagangan utama untuk pemantauan dan optimasi strategi secara real-time.
Meskipun ada banyak keuntungan dari strategi ini, ada risiko potensial sebagai berikut:
Solusi: Mengatur persentase tracking stop loss dan interval order aman sesuai dengan jenis transaksi dan kerangka waktu tertentu; Pertimbangkan untuk menambahkan stop loss global sebagai lapisan perlindungan tambahan.
Solusi: Melakukan pengembalian dan pengoptimalan yang menyeluruh untuk varietas transaksi dan kondisi pasar tertentu; menerapkan mekanisme penyesuaian parameter adaptif.
*Solusi*Pertimbangkan untuk menerapkan mekanisme pemicu pesanan keamanan yang lebih fleksibel, seperti eksekusi wajib berdasarkan waktu atau interval yang disesuaikan dengan kondisi pasar tertentu.
Solusi: Menambahkan filter perdagangan, seperti penurunan volatilitas atau konfirmasi kekuatan tren; memperpanjang periode pendinginan untuk mengurangi frekuensi perdagangan.
*Solusi*Pertimbangkan untuk mengintegrasikan filter dasar atau indikator sentimen risiko; tambahkan pemeriksaan relevansi lintas pasar sebagai sinyal konfirmasi.
Berdasarkan analisis mendalam dari kode kebijakan, berikut adalah beberapa kemungkinan optimasi:
Penyesuaian parameter adaptasi: Mekanisme untuk menyesuaikan panjang EMA dan ATR secara otomatis berdasarkan volatilitas pasar atau volume transaksi. Misalnya, menggunakan EMA yang lebih panjang dan ATR yang lebih besar dalam lingkungan yang sangat volatile, menggunakan EMA yang lebih pendek dan ATR yang lebih kecil dalam lingkungan yang kurang volatile. Ini akan meningkatkan kemampuan adaptasi strategi dalam berbagai kondisi pasar.
Sinyal konfirmasi ganda: Tambahkan indikator konfirmasi tambahan, seperti RSI (Relative Strength Index), Transit Volume atau Brinks, untuk mengurangi sinyal palsu. Filter dapat diimplementasikan, yang memerlukan beberapa indikator teknis untuk mengkonfirmasi sinyal masuk secara bersamaan, sehingga meningkatkan kualitas sinyal.
Pendistribusian Dana Dinamis: Menyesuaikan ukuran pesanan dengan kondisi pasar dan volatilitas historis. Misalnya, meningkatkan ukuran pesanan dasar pada fase pasar yang lebih rendah volatilitas atau lebih mungkin naik dalam sejarah, dan mengurangi dalam lingkungan berisiko tinggi.
Strategi Keluar cerdasImplementasi mekanisme profit sharing yang memungkinkan pengunduran diri secara bertahap pada tingkat keuntungan yang berbeda, bukan posisi kosong satu kali. Hal ini dapat dicapai dengan menetapkan beberapa target keuntungan dan persentase pengunduran diri yang sesuai, mengoptimalkan rasio risiko-reward.
Integrasi indikator emosiTambahkan analisis sentimen pasar, seperti indeks Fear and Greed atau analisis volume transaksi, sebagai filter tambahan untuk masuk dan keluar. Ini akan membantu strategi untuk menghindari transaksi yang tidak perlu selama periode sentimen pasar yang ekstrem.
Manajemen eksposur risiko: Mempunyai fungsi untuk menghitung eksposur risiko maksimum secara dinamis (jumlah dari semua pesanan keamanan yang mungkin) dan menetapkan batas risiko maksimum yang dapat diterima. Ini akan memastikan bahwa strategi tidak terlalu banyak mengekspos dana pada satu transaksi kapan saja.
Sistem pelacakan stop loss berupa indeks mobile average crossover adalah strategi perdagangan kuantitatif yang dirancang dengan baik, yang menggabungkan deteksi tren, penanaman modal bertingkat, dan manajemen stop loss yang canggih. Keunggulan utamanya adalah kemampuan untuk beradaptasi dengan fluktuasi pasar, manajemen modal cerdas, dan sistem perlindungan keuntungan bertingkat dua. Strategi ini sangat cocok untuk lingkungan pasar yang cukup volatil, di mana tren memiliki konsistensi dan arah yang cukup.
Dengan optimasi parameter yang tepat dan penguatan rekomendasi, strategi ini dapat meningkatkan kinerja dan stabilitasnya lebih lanjut. Khususnya, penyesuaian parameter adaptif dan sinyal konfirmasi ganda dapat secara signifikan meningkatkan kualitas masuk, sementara alokasi dana dinamis dan strategi keluar cerdas dapat mengoptimalkan fitur pengembalian risiko.
Pada akhirnya, strategi ini mewakili pendekatan perdagangan kuantitatif yang seimbang, dengan fokus pada penghematan dana dan konsistensi, daripada mengejar keuntungan maksimal dari setiap perdagangan. Ini memberikan pedagang dengan kerangka kerja yang kuat yang dapat disesuaikan dengan preferensi risiko pribadi dan kondisi pasar, berpotensi untuk mencapai hasil perdagangan yang berkelanjutan dalam jangka panjang.
/*backtest
start: 2025-04-15 00:00:00
end: 2025-07-13 19:30:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":200000}]
*/
//@version=5
strategy(
title="DCA + Dual Trailing Strategy",
overlay=true
)
// --- Trend ---
fastMALen = input.int(9, title="Fast EMA Length")
slowMALen = input.int(21, title="Slow EMA Length")
// --- Trailing Stops ---
trailStopPerc = input.float(8.0, title="Standard Trailing Stop (%)", minval=0.1) / 100
lockInThreshold = input.float(2.5, title="Profit Lock-In Trigger (%)", minval=0.1) / 100
lockInTrailPct = input.float(1.5, title="Lock-In Trail (%) after Trigger", minval=0.1) / 100
// --- Safety Orders (SO) ---
useATRSpacing = input.bool(true, title="Use ATR-Based Spacing?")
atrLength = input.int(14, title="ATR Length", minval=1)
atrSo1Multiplier = input.float(1.2, title="ATR SO1 Multiplier", minval=0.1)
atrSo2Multiplier = input.float(2.5, title="ATR SO2 Multiplier", minval=0.1)
// --- Fallback SO Spacing (if not using ATR) ---
fallbackSo1Perc = input.float(4.0, title="Fallback SO1 Drop (%) ", minval=0.1) / 100
fallbackSo2Perc = input.float(8.0, title="Fallback SO2 Drop (%) ", minval=0.1) / 100
// --- Entry Cooldown ---
cooldownBars = input.int(4, "Cooldown Bars After Base Entry", minval=0)
// --- Order Sizes in USD ---
baseUsd = input.float(10000.0, title="Base Order Size (USD)", minval=1.0)
so1Usd = input.float(12500.0, title="Safety Order 1 Size (USD)", minval=1.0)
so2Usd = input.float(17500.0, title="Safety Order 2 Size (USD)", minval=1.0)
// 2) CALCULATIONS
// --- Trend & Reversal Detection ---
fastMA = ta.ema(close, fastMALen)
slowMA = ta.ema(close, slowMALen)
trendUp = ta.crossover(fastMA, slowMA)
trendDown = ta.crossunder(fastMA, slowMA)
// --- ATR Value ---
atrValue = ta.atr(atrLength)
// 3) BASE ENTRY LOGIC
// Base Buy Signal: EMA crossover
baseBuySignal = trendUp
var int lastBuyBar = na // Tracks the bar index of the last base entry
inCooldown = not na(lastBuyBar) and (bar_index - lastBuyBar < cooldownBars)
var float baseEntryPrice = na // Stores the price of the initial base entry for SO calculations
// --- Execute Base Entry ---
if baseBuySignal and strategy.position_size == 0 and not inCooldown
baseQty = baseUsd / close // Calculate quantity based on USD
strategy.order("Base Order", strategy.long, qty=baseQty, comment="Base Entry")
baseEntryPrice := close
lastBuyBar := bar_index
// 4) SAFETY ORDERS LOGIC
// --- Calculate SO Trigger Prices ---
float so1TriggerPrice = na
float so2TriggerPrice = na
if strategy.position_size > 0 // Only calculate if a base order has been placed
so1TriggerPrice := useATRSpacing ?
(baseEntryPrice - atrValue * atrSo1Multiplier) :
(baseEntryPrice * (1 - fallbackSo1Perc))
so2TriggerPrice := useATRSpacing ?
(baseEntryPrice - atrValue * atrSo2Multiplier) :
(baseEntryPrice * (1 - fallbackSo2Perc))
// --- Conditions for SO Execution ---
// Added 'inDateRange' check
// Ensure base order exists, price trigger hit, and the specific SO hasn't filled yet
bool so1Condition = strategy.position_size > 0 and close <= so1TriggerPrice and strategy.opentrades == 1
bool so2Condition = strategy.position_size > 0 and close <= so2TriggerPrice and strategy.opentrades == 2
// --- Execute SO1 ---
if so1Condition
so1Qty = so1Usd / close // Calculate quantity based on USD
strategy.order("Safety Order 1", strategy.long, qty=so1Qty, comment="SO1")
// --- Execute SO2 ---
if so2Condition
so2Qty = so2Usd / close // Calculate quantity based on USD
strategy.order("Safety Order 2", strategy.long, qty=so2Qty, comment="SO2")
// 5) AVERAGE ENTRY PRICE
// Use the built-in variable for the average price of the open position
avgEntryPrice = strategy.position_avg_price
// 6) DUAL TRAILING STOP LOGIC
// Variables to track trailing stop levels and states
var float highestSinceEntry = na
var float trailStopPrice = na
var bool stopHitNormal = false
var bool lockInTriggered = false
var float lockInPeak = na
var float lockInStopPrice = na
var bool stopHitLockIn = false
// --- Update Trailing Logic when in a Position ---
if strategy.position_size > 0
// --- Standard Trail ---
highestSinceEntry := na(highestSinceEntry) ? close : math.max(highestSinceEntry, close)
trailStopPrice := highestSinceEntry * (1 - trailStopPerc)
stopHitNormal := close < trailStopPrice
// --- Lock-In Trail ---
if not lockInTriggered and close >= avgEntryPrice * (1 + lockInThreshold)
lockInTriggered := true
lockInPeak := close
if lockInTriggered
lockInPeak := math.max(lockInPeak, close)
lockInStopPrice := lockInPeak * (1 - lockInTrailPct)
stopHitLockIn := close < lockInStopPrice
else
stopHitLockIn := false
lockInStopPrice := na
// --- Reset Variables when Flat ---
else
highestSinceEntry := na
trailStopPrice := na
stopHitNormal := false
lockInTriggered := false
lockInPeak := na
lockInStopPrice := na
stopHitLockIn := false
// lastBuyBar is intentionally NOT reset here, cooldown depends on it
// 7) EXIT CONDITIONS
// Added 'inDateRange' check
// Exit if either trailing stop is hit OR if the trend reverses downward
exitCondition = (stopHitNormal or stopHitLockIn or trendDown) and strategy.position_size > 0
if exitCondition
strategy.close_all(comment="Exit: SL / LockIn / TrendDown")
// 9) PLOTS & DEBUG TABLE
// --- Plot MAs ---
plot(fastMA, color=color.new(color.green, 0), title="Fast EMA", linewidth=2)
plot(slowMA, color=color.new(color.red, 0), title="Slow EMA", linewidth=2)
// --- Plot Trailing Stops ---
plot(strategy.position_size > 0 ? trailStopPrice : na, color=color.new(color.orange, 0), title="Standard Trailing Stop", style=plot.style_linebr, linewidth=2)
plot(lockInTriggered ? lockInStopPrice : na, color=color.new(color.fuchsia, 0), title="Lock-In Trailing Stop", style=plot.style_linebr, linewidth=2)