
Setelah melihat ribuan kode Pine Script, Master Trading Bot ini memang memiliki dua sikat. Penulis memainkan DCA ke tingkat yang lebih tinggi: bukan taruhan tanpa pikiran, tetapi sistem penambahan saham cerdas berdasarkan indikator teknis.
Kuncinya adalah kondisi pemicu DCA: harga harus jatuh di bawah harga biaya rata-rata, dan penurunan harus mencapai 2% + langkah × 4% dari penurunan dinamis. Pertama kali DCA perlu turun 2%, kedua perlu turun 6%, ketiga perlu turun 10%.
Strategi ini menggunakan 3 / 7 / 18 siklus EMA untuk membangun kerangka tren, dengan 20 siklus Brin band untuk menentukan posisi harga, 52/200/3 MACD parameter untuk mengatur sinyal jangka panjang menengah, dan 14 siklus RSI untuk menilai overbought dan oversold. Kombinasi ini mencakup tiga dimensi tren, momentum, dan volatilitas, yang lebih dapat diandalkan daripada strategi indikator tunggal.
Kondisi pembelian yang ketat: EMA cepat> EMA lambat + MACD Gold Forks + harga di atas rel tengah Bollinger + RSI < 65. Empat kondisi ini memenuhi posisi untuk membuka posisi, memfilter sebagian besar sinyal palsu. Kondisi penjualan yang sama ketat: Anda harus memiliki setidaknya 2% keuntungan + penurunan tren + MACD Dead Forks.
100% stop loss dalam kode tampak berlebihan, tetapi komentarnya sangat jelas: “Harga harus turun ke 0 untuk memicu”. Ini sebenarnya menutup stop loss tradisional dan sepenuhnya bergantung pada indikator teknis dan target laba untuk mengelola risiko.
Kontrol risiko yang sebenarnya adalah: 2% sinyal penurunan harga + penurunan nilai DCA dinamis + pengunduran diri keuntungan paksa. Strategi ini melacak harga tertinggi dalam 500 siklus dan akan memicu sinyal jual jika harga turun lebih dari 2% dari titik tertinggi saat ini. Ini lebih fleksibel daripada stop loss tetap dan dapat beradaptasi dengan lingkungan pasar yang berbeda.
Setiap kali Anda membeli, jumlah = ekuitas saat ini × persentase DCA ÷ harga saat ini. Desain ini berdasarkan proporsi ekuitas, bukan jumlah tetap, memungkinkan strategi untuk memperluas posisi seiring pertumbuhan akun. Posisi awal 5% mengontrol risiko satu kali, sementara kenaikan posisi bertahap memastikan bahwa ada cukup api di depan peluang nyata.
Manajemen status “just_sold” adalah yang paling canggih: tidak segera membeli kembali setelah dijual kecuali ada sinyal bullish yang kuat. Ini menghindari perdagangan yang sering terjadi di pasar yang bergoyang, mengurangi biaya biaya dan risiko manipulasi emosional.
Strategi ini paling cocok untuk membeli kembali dalam tren bullish jangka menengah dan panjang, dan biasanya terjadi pada bear market atau short term. Pengaturan parameter MACD sebesar 52⁄200 memutuskan bahwa strategi ini lebih cocok untuk penilaian tren tingkat yang lebih besar daripada untuk perdagangan garis pendek.
RSI oversold yang ditetapkan pada 25 bukan 30, menunjukkan kecenderungan strategi untuk membeli dalam penarikan yang lebih dalam. Desain ini dapat memperoleh titik beli yang lebih baik di pasar bullish, tetapi mungkin “mengambil alih pisau” di pasar bearish. Disarankan untuk digunakan dalam tren naik yang jelas dan menghindari memulai di puncak pasar atau tren turun.
Logika teoritis dari strategi ini sangat baik, tetapi kinerja sebenarnya juga tergantung pada data retesting spesifik. Perhatian utama perlu diperhatikan: apakah penarikan maksimum dalam kisaran yang dapat diterima, apakah terlalu banyak kerugian berturut-turut, perbedaan kinerja dalam berbagai lingkungan pasar.
Strategi DCA secara alami akan terus berlanjut selama penurunan, yang berarti bahwa nilai bersih akun akan turun dan naik. Investor perlu memiliki kemampuan mental dan cadangan dana yang cukup. Disarankan untuk menguji dengan modal kecil terlebih dahulu, dan setelah mengkonfirmasi karakteristik strategi, meningkatkan skala investasi secara bertahap.
Tip Risiko: Ada risiko kerugian dalam strategi kuantitatif apa pun, retrospeksi sejarah tidak mewakili keuntungan masa depan, dan manajemen risiko yang ketat dan alokasi dana yang tepat diperlukan.
/*backtest
start: 2024-10-20 00:00:00
end: 2025-10-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":500000}]
*/
// This Pine Script™ code is subject to the terms of the MPL 2.0 at https://mozilla.org/MPL/2.0/
// © MTB by Neurodoc
// By Nicolás Astorga
//@version=5
strategy("Master Trading Bot by Neurodoc",
shorttitle="MTB Adaptation",
overlay=true,
initial_capital=10000,
pyramiding=100,
commission_value=0.1,
commission_type=strategy.commission.percent,
default_qty_type = strategy.cash)
// —————— CONFIGURATION (Based on ve.env) ——————
// Purchase and DCA Percentages
var GRP_DCA = "DCA Configuration"
start_percentage = input.float(5.0, "Initial Buy Percentage (%)", group=GRP_DCA)
increment_percentage = input.float(2.5, "Increment per DCA Buy (%)", group=GRP_DCA)
max_percentage = input.float(100.0, "Maximum Buy Percentage (%)", group=GRP_DCA)
min_profit_percent = input.float(2.0, "Minimum Profit for Sell (%)", group=GRP_DCA)
// Stop Loss and Drop Signal
var GRP_RISK = "Risk Management"
stop_loss_percent = input.float(100.0, "Stop Loss (%)", group=GRP_RISK, tooltip="A value of 100 means there’s no real stop loss, as price would have to go to 0.")
drop_percent_signal = input.float(2.0, "Price Drop for Sell Signal (%)", group=GRP_RISK)
// Indicator Parameters
var GRP_INDICATORS = "Indicator Parameters"
ema_fast_period = input.int(3, "Fast EMA", group=GRP_INDICATORS)
ema_mid_period = input.int(7, "Medium EMA", group=GRP_INDICATORS)
ema_slow_period = input.int(18, "Slow EMA", group=GRP_INDICATORS)
bb_length = input.int(20, "Bollinger Bands Length", group=GRP_INDICATORS)
bb_stddev = input.float(2.0, "BB Standard Deviation", group=GRP_INDICATORS)
macd_fast = input.int(52, "MACD Fast", group=GRP_INDICATORS)
macd_slow = input.int(200, "MACD Slow", group=GRP_INDICATORS)
macd_signal = input.int(3, "MACD Signal", group=GRP_INDICATORS)
rsi_length = input.int(14, "RSI Length", group=GRP_INDICATORS)
rsi_oversold_threshold = input.int(25, "RSI Oversold (for divergence)", group=GRP_INDICATORS)
// —————— INDICATOR CALCULATIONS ——————
// EMAs
ema_fast = ta.ema(open, ema_fast_period)
ema_mid = ta.ema(open, ema_mid_period)
ema_slow = ta.ema(open, ema_slow_period)
// Bollinger Bands
[bb_middle, bb_upper, bb_lower] = ta.bb(close, bb_length, bb_stddev)
bb_width = (bb_upper - bb_lower) / bb_middle * 100
is_bb_expanding = bb_width > bb_width[1]
// MACD
[macd_line, signal_line, _] = ta.macd(close, macd_fast, macd_slow, macd_signal)
// RSI
rsi = ta.rsi(close, rsi_length)
// Price drop signal from highest price (similar to `cummax` in Python)
highest_price = ta.highest(high, 500) // Using 500-bar lookback to approximate the high
price_drop_percent = ((highest_price - close) / highest_price) * 100
is_price_drop_signal = price_drop_percent >= drop_percent_signal
// —————— TRADING LOGIC ——————
// Trend Conditions
is_bullish = ema_fast > ema_slow and macd_line > signal_line and close > bb_middle
is_bearish = ema_fast < ema_slow and macd_line < signal_line and close < bb_middle
is_weakening = rsi < rsi[1]
// Variables to manage strategy state
var bool just_sold = false
var int dca_step = 0
// Determine next buy percentage of capital
dca_buy_percentage = start_percentage + (dca_step * increment_percentage)
if dca_buy_percentage > max_percentage
dca_buy_percentage := max_percentage
avg_buy_price = strategy.position_avg_price
// Initial Long Condition
long_signal_initial = strategy.position_size == 0 and is_bullish and macd_line > signal_line and rsi < 65
// DCA Condition
price_drop_from_avg = ((avg_buy_price - close) / avg_buy_price) * 100
dca_required_drop = 2.0 + (dca_step * 4.0) // DCA price drop start and increment logic
long_signal_dca = strategy.position_size > 0 and is_bearish and close < avg_buy_price and price_drop_from_avg >= dca_required_drop
// Manage `just_sold` state
if strategy.position_size > 0
just_sold := false
if strategy.position_size == 0 and strategy.position_size[1] > 0
just_sold := true
// Avoid immediate repurchase after sell unless bullish condition is strong
long_signal = (just_sold and is_bullish) ? long_signal_initial : (not just_sold ? (long_signal_initial or long_signal_dca) : false)
// Sell (Close) Condition
current_profit_percent = ((close - avg_buy_price) / avg_buy_price) * 100
has_min_profit = current_profit_percent >= min_profit_percent
stop_loss_price = avg_buy_price * (1 - stop_loss_percent / 100)
is_stoploss_triggered = close <= stop_loss_price
short_signal = strategy.position_size > 0 and has_min_profit and ((is_bearish and is_weakening) or is_price_drop_signal or is_stoploss_triggered or (macd_line < signal_line))
// —————— ORDER EXECUTION ——————
if (long_signal)
// Calculate how much MONEY (USDT) to invest in this trade
cash_to_invest = (strategy.equity * dca_buy_percentage / 100) / close
strategy.entry("Buy", strategy.long, qty=cash_to_invest)
dca_step := dca_step + 1
if (short_signal)
strategy.close_all(comment="Sell")
dca_step := 0 // Reset DCA counter after selling
// —————— VISUALIZATION ——————
// Background color by trend
bgcolor(is_bullish ? color.new(color.green, 90) : is_bearish ? color.new(color.red, 90) : na)
// Plot EMAs and Bollinger Bands
plot(ema_fast, "Fast EMA", color.blue)
plot(ema_slow, "Slow EMA", color.orange)
p1 = plot(bb_upper, "Upper BB", color=color.gray)
p2 = plot(bb_lower, "Lower BB", color=color.gray)
fill(p1, p2, color=color.new(color.gray, 90))
// Plot average buy price when in position
plot(strategy.position_size > 0 ? avg_buy_price : na, "Average Buy Price", color.yellow, style=plot.style_linebr, linewidth=2)
// Plot Take Profit target
plot(strategy.position_size > 0 ? avg_buy_price * (1 + min_profit_percent / 100) : na, "Sell Price (TP)", color.aqua, style=plot.style_linebr, linewidth=2)
// Plot Stop Loss level
plot(strategy.position_size > 0 ? stop_loss_price : na, "Stop Loss", color.fuchsia, style=plot.style_linebr, linewidth=2)