
Strategi ini adalah sistem strategi campuran yang menggabungkan pelacakan tren dan perdagangan getaran, untuk mencapai perdagangan yang stabil melalui pemfilteran indikator teknis dan manajemen dana yang ketat. Strategi ini menggunakan metode stop-loss bertahap untuk mengunci keuntungan, sambil mengatur kontrol penarikan maksimum, dan mengendalikan risiko sambil menjamin keuntungan. Sistem ini menggunakan indikator momentum RSI dan indikator kekuatan tren ADX sebagai pemicu sinyal perdagangan utama, dan menggabungkan volume perdagangan, ATR dan beberapa filter seperti EMA untuk memastikan efektivitas perdagangan.
Logika inti dari strategi ini mencakup elemen-elemen kunci berikut:
Strategi ini adalah sistem perdagangan yang komprehensif, yang memungkinkan perdagangan yang stabil melalui banyak indikator teknis dan manajemen dana yang ketat. Keunggulan inti dari strategi ini adalah sistem kontrol risiko dan mekanisme penghentian bertahap yang lengkap, tetapi juga perlu memperhatikan pengaturan parameter yang disesuaikan sesuai dengan situasi pasar dalam aplikasi nyata. Ruang untuk pengoptimalan lebih lanjut dari strategi ini terutama terletak pada penyesuaian dinamis parameter dan perbaikan mekanisme penyaringan sinyal.
/*backtest
start: 2023-12-20 00:00:00
end: 2024-12-18 08:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy(title="Swing Strategy (<30% DD)", shorttitle="SwingStratDD", overlay=true)
//-----------------------------------------------------
// Example Indicators and Logic
//-----------------------------------------------------
emaLen = input.int(200, "EMA Length", minval=1)
emaValue = ta.ema(close, emaLen)
plot(emaValue, color=color.yellow, linewidth=2, title="EMA 200")
//-----------------------------------------------------
// User Inputs
//-----------------------------------------------------
adxLen = input.int(14, "ADX Length", minval=1)
rsiLen = input.int(14, "RSI Length", minval=1)
atrLen = input.int(14, "ATR Length", minval=1)
rsiBuyThresh = input.float(60, "RSI Buy Threshold", minval=1, maxval=100)
adxThresh = input.float(25, "ADX Threshold (Trend)", minval=1, maxval=100)
minVolume = input.float(1e6,"Minimum Volume", minval=1)
minATR = input.float(2, "Minimum ATR(14)", minval=0.1, step=0.1)
stopLossPerc = input.float(15, "Stop-Loss %", minval=0.1, step=0.1)
// We’ll do two partial take-profit levels to aim for consistent cashflow:
takeProfit1Perc = input.float(15, "Take-Profit1 %", minval=0.1, step=0.1)
takeProfit2Perc = input.float(30, "Take-Profit2 %", minval=0.1, step=0.1)
ddLimit = input.float(30, "Max Drawdown %", minval=0.1, step=0.1)
//-----------------------------------------------------
// Indicators
//-----------------------------------------------------
rsiValue = ta.rsi(close, rsiLen)
atrValue = ta.atr(atrLen)
//--- Fully Manual ADX Calculation ---
upMove = high - high[1]
downMove = low[1] - low
plusDM = (upMove > downMove and upMove > 0) ? upMove : 0.0
minusDM = (downMove > upMove and downMove > 0) ? downMove : 0.0
smPlusDM = ta.rma(plusDM, adxLen)
smMinusDM = ta.rma(minusDM, adxLen)
smTR = ta.rma(ta.tr, adxLen)
plusDI = (smPlusDM / smTR) * 100
minusDI = (smMinusDM / smTR) * 100
dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100
adxValue = ta.rma(dx, adxLen)
//-----------------------------------------------------
// Screener-Like Conditions (Technical Only)
//-----------------------------------------------------
volumeCondition = volume > minVolume
adxCondition = adxValue > adxThresh
rsiCondition = rsiValue > rsiBuyThresh
atrCondition = atrValue > minATR
aboveEmaCondition = close > emaValue
longCondition = volumeCondition and adxCondition and rsiCondition and atrCondition and aboveEmaCondition
//-----------------------------------------------------
// Strategy Entry / Exit Logic
//-----------------------------------------------------
var bool inTrade = false
// Entry
if longCondition and not inTrade
strategy.entry("Long", strategy.long)
// Basic Exit Condition: RSI < 50 or Price < EMA
exitCondition = (rsiValue < 50) or (close < emaValue)
if inTrade and exitCondition
strategy.close("Long")
// Update inTrade status
inTrade := strategy.position_size > 0
//-----------------------------------------------------
// Multi-Level Stop-Loss & Partial Profits
//-----------------------------------------------------
if inTrade
float entryPrice = strategy.position_avg_price
// Stop-Loss
float stopPrice = entryPrice * (1 - stopLossPerc / 100)
// Two partial take-profit levels
float tp1Price = entryPrice * (1 + takeProfit1Perc / 100)
float tp2Price = entryPrice * (1 + takeProfit2Perc / 100)
// Example approach: exit half at TP1, half at TP2
strategy.exit("TP1/SL", from_entry="Long", stop=stopPrice, limit=tp1Price, qty_percent=50)
strategy.exit("TP2", from_entry="Long", limit=tp2Price, qty_percent=50)
//-----------------------------------------------------
// Dynamic Drawdown Handling
//-----------------------------------------------------
var float peakEquity = strategy.equity
peakEquity := math.max(peakEquity, strategy.equity)
currentDrawdownPerc = (peakEquity - strategy.equity) / peakEquity * 100
if currentDrawdownPerc > ddLimit
strategy.close_all("Max Drawdown Exceeded")
//-----------------------------------------------------
// Plotting
//-----------------------------------------------------
plot(emaValue, title="EMA 200", color=color.yellow, linewidth=2)
plotchar(rsiValue, title="RSI", char='●', location=location.bottom, color=color.new(color.teal, 50))
plot(adxValue, title="Manual ADX", color=color.orange)