
La stratégie est un système de trading complet combinant plusieurs indicateurs techniques, principalement basé sur le score Z pour mesurer le volume de transactions et les valeurs anormales de la taille de l’entité de ligne K, et utilisant l’ATR pour définir un stop loss dynamique. Le système intègre également le ratio de risque/revenu (RR) pour optimiser les objectifs de profit, fournissant des signaux de trading fiables grâce à une analyse technique multidimensionnelle.
La logique fondamentale de la stratégie repose sur les éléments clés suivants :
La stratégie construit un système de négociation complet en combinant l’analyse du Z-score, l’optimisation du rapport stop-loss ATR et risque-bénéfice. L’avantage du système réside dans la reconnaissance de signaux multidimensionnels et la gestion flexible des risques, mais il faut toujours tenir compte de l’impact des paramètres de réglage et de l’environnement du marché. La stratégie peut encore améliorer sa stabilité et son adaptabilité par l’orientation d’optimisation recommandée.
/*backtest
start: 2024-10-01 00:00:00
end: 2025-02-18 08:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("admbrk | Candle Color & Price Alarm with ATR Stop", overlay=true, initial_capital=50, default_qty_type=strategy.cash, default_qty_value=200, commission_type=strategy.commission.percent, commission_value=0.05, pyramiding=3)
// **Risk/Reward ratio (RR) as input**
rr = input.float(2.0, title="Risk/Reward Ratio (RR)", step=0.1)
// **Z-score calculation function**
f_zscore(src, len) =>
mean = ta.sma(src, len)
std = ta.stdev(src, len)
(src - mean) / std
// **Z-score calculations**
len = input(20, "Z-Score MA Length")
z1 = input.float(1.5, "Threshold z1", step=0.1)
z2 = input.float(2.5, "Threshold z2", step=0.1)
z_volume = f_zscore(volume, len)
z_body = f_zscore(math.abs(close - open), len)
i_src = input.string("Volume", title="Source", options=["Volume", "Body size", "Any", "All"])
float z = na
if i_src == "Volume"
z := z_volume
else if i_src == "Body size"
z := z_body
else if i_src == "Any"
z := math.max(z_volume, z_body)
else if i_src == "All"
z := math.min(z_volume, z_body)
// **Determine trend direction**
green = close >= open
red = close < open
// **Long and Short signals**
longSignal = barstate.isconfirmed and red[1] and low < low[1] and green
shortSignal = barstate.isconfirmed and green[1] and high > high[1] and red
long = longSignal and (z >= z1)
short = shortSignal and (z >= z1)
// **ATR calculation (for ATR Stop)**
atrLength = input.int(14, title="ATR Length")
atrMultiplier = input.float(1.5, title="ATR Stop Multiplier")
atrValue = ta.atr(atrLength)
// **ATR-based stop-loss calculation**
long_atr_stop = close - atrValue * atrMultiplier
short_atr_stop = close + atrValue * atrMultiplier
// **Stop-loss setting (set to the lowest/highest wick of the last two bars)**
long_sl = ta.lowest(low, 2) // Long stop-loss (lowest of the last 2 bars)
short_sl = ta.highest(high, 2) // Short stop-loss (highest of the last 2 bars)
// **Take-profit calculation (with RR)**
long_tp = close + (close - long_sl) * rr
short_tp = close - (short_sl - close) * rr
triggerAlarm(symbol)=>
status = close
var string message = na
alarmMessageJSON = syminfo.ticker + message +"\\n" + "Price: " + str.tostring(status)
if long
// Open Long position
strategy.entry("Long", strategy.long)
strategy.exit("Long Exit", from_entry="Long", stop=math.max(long_sl, long_atr_stop), limit=long_tp)
if short
// Open Short position
strategy.entry("Short", strategy.short)
strategy.exit("Short Exit", from_entry="Short", stop=math.min(short_sl, short_atr_stop), limit=short_tp)
// **Coloring the candles (BUY = Green, SELL = Red)**
barcolor(long ? color.green : short ? color.red : na)
// **Add entry/exit markers on the chart**
plotshape(long, title="BUY Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small, text="BUY")
plotshape(short, title="SELL Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small, text="SELL")
// **Plot TP and SL markers on exits**
exitLong = strategy.position_size < strategy.position_size[1] and strategy.position_size[1] > 0
exitShort = strategy.position_size > strategy.position_size[1] and strategy.position_size[1] < 0
plotshape(exitLong, title="Long Exit", location=location.abovebar, color=color.blue, style=shape.labeldown, size=size.tiny, text="TP/SL")
plotshape(exitShort, title="Short Exit", location=location.belowbar, color=color.orange, style=shape.labelup, size=size.tiny, text="TP/SL")
// **Add alerts**
alertcondition(long, title="Long Signal", message="Long signal triggered!")
alertcondition(short, title="Short Signal", message="Short signal triggered!")