Chiến lược này là một hệ thống lai kết hợp theo xu hướng và giao dịch dao động, đạt được giao dịch ổn định thông qua sàng lọc nhiều chỉ số kỹ thuật và quản lý vốn nghiêm ngặt. Chiến lược này áp dụng cách tiếp cận lấy lợi nhuận theo từng bước để khóa lợi nhuận trong khi thiết lập kiểm soát rút tối đa để quản lý rủi ro trong khi đảm bảo lợi nhuận. Hệ thống sử dụng chỉ số động lực RSI và chỉ số sức mạnh xu hướng ADX như là các kích hoạt tín hiệu giao dịch chính, kết hợp với các bộ lọc khối lượng, ATR và EMA để đảm bảo hiệu quả giao dịch.
Logic cốt lõi của chiến lược bao gồm các yếu tố chính sau:
Chiến lược này là một hệ thống giao dịch toàn diện đạt được giao dịch ổn định thông qua nhiều chỉ số kỹ thuật và quản lý vốn nghiêm ngặt. Những lợi thế cốt lõi của chiến lược nằm trong hệ thống kiểm soát rủi ro hoàn chỉnh và cơ chế lấy lợi nhuận theo từng bước, nhưng cần phải chú ý đến việc điều chỉnh các tham số kịp thời dựa trên điều kiện thị trường trong ứng dụng thực tế. Không gian tối ưu hóa hơn nữa của chiến lược chủ yếu nằm trong việc thích nghi năng động tham số và cải thiện cơ chế lọc tín hiệu.
/*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)