
La stratégie est un système de stratégie hybride combinant le suivi de la tendance et les transactions de choc, permettant des transactions solides grâce à la sélection de multiples indicateurs techniques et à une gestion rigoureuse des fonds. La stratégie utilise un arrêt par étapes pour bloquer les bénéfices, tout en réglant le contrôle de retrait maximal et en contrôlant les risques tout en garantissant les gains. Le système utilise l’indicateur de dynamique RSI et l’indicateur de force de tendance ADX comme principaux conditions de déclenchement de signaux de négociation, et en combinaison avec le volume de transactions, les filtres multiples tels que ATR et EMA pour assurer l’efficacité des transactions.
La logique fondamentale de la stratégie comprend les éléments clés suivants :
La stratégie est un système de négociation complet qui permet des transactions solides grâce à de multiples indicateurs techniques et à une gestion rigoureuse des fonds. Le principal avantage de la stratégie réside dans son système de contrôle des risques et son mécanisme de freinage par étapes, mais il faut également faire attention à l’ajustement des paramètres en fonction de la situation du marché dans les applications réelles. La possibilité d’optimiser davantage la stratégie réside principalement dans l’adaptation dynamique des paramètres et l’amélioration du mécanisme de filtrage des signaux.
/*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)