
Cette stratégie est différente de la stratégie traditionnelle d’arrêt des pertes de l’axe central. Lorsqu’il y a des pertes multiples, le système est immédiatement renversé; Lorsqu’il y a des pertes à vide, le système est immédiatement renversé.
Ne regardez pas les chiffres, les pourcentages basés sur la moyenne des 30 cycles sont plus scientifiques que les nombres de points fixes. Un stop loss de 0,45% correspond à une fluctuation de l’or d’environ 8-10 dollars, un stop loss de 0,60% à environ 12-15 dollars.
Lorsque l’ATR est inférieur à la barre de 0,2, la stratégie entre dans une période de refroidissement de 10 minutes et rejette tous les nouveaux signaux. Cette conception est trop critique. En cas de faible volatilité, forcer la transaction revient à envoyer de l’argent plutôt qu’à attendre.
Le réglage de l’axe cardinal de 4 lignes K à gauche et de 2 lignes K à droite est plus radical que les paramètres classiques de 5 à 5. Cela signifie que la stratégie identifie les points de basculement plus tôt, mais prend également plus de risques de fausses ruptures.
Il y a 50% de probabilité de reprise de la position après un arrêt, et 50% de probabilité de reprise. Cette conception est intéressante, mais aussi dangereuse. L’avantage est de pouvoir se régler rapidement au début d’un renversement de tendance, l’inconvénient est qu’il est possible de revenir en arrière lors d’une fausse rupture.
Les stratégies redoutent deux situations: un marché horizontal très bas et un marché unilatéral très haut. Le premier déclenche des arrêts fréquents de négociation par le mécanisme de refroidissement, tandis que le second est facilement intercepté par un filtre à grande K. Le meilleur environnement est celui où les fluctuations de 15 à 30 dollars par jour sont normales. D’un point de vue paramétrique, il s’agit plutôt d’une stratégie conçue sur mesure pour le volume d’or en espèces ou à terme.
Bien qu’il existe un mécanisme de retournement, la stratégie peut faire face à des pertes continues en cas de signal de fausse rupture persistant. En particulier, les fluctuations de l’humeur du marché peuvent entraîner l’échec du signal pivot avant la publication de données économiques importantes. Il est recommandé de contrôler strictement les positions individuelles et de suspendre manuellement la stratégie avant les événements importants.
/*backtest
start: 2024-09-24 00:00:00
end: 2025-09-22 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/
//@version=6
strategy("Gold By Ann v.2", overlay=true)
// --- Inputs ---
leftBars = input.int(4, "Pivot Lookback Left")
rightBars = input.int(2, "Pivot Lookback Right")
atrLength = input.int(14, "ATR Length")
atrMult = input.float(2.0, "ATR Multiplier")
atrThreshold = input.float(0.2, "ATR Threshold")
cooldownMinutes = input.int(10, "Cooldown Minutes")
// --- Pivot Calculation ---
ph = ta.pivothigh(leftBars, rightBars)
pl = ta.pivotlow(leftBars, rightBars)
ma = ta.sma(close, 50)
bullishTrend = close > ma
bearishTrend = close < ma
// --- Volatility (ATR) and Cooldown ---
atrValue = ta.atr(atrLength)
var float cooldownEnd = na
if atrValue < atrThreshold and na(cooldownEnd)
cooldownEnd := timenow + cooldownMinutes * 60 * 1000 // ms
if not na(cooldownEnd) and timenow > cooldownEnd
cooldownEnd := na
inCooldown = not na(cooldownEnd)
// --- Tall candle filter ---
rangeBar = high - low
isTall = rangeBar > ta.atr(5) * atrMult
// --- SL & TP based on % of 30-bar close ---
baseClose = ta.sma(close, 30) // 30-bar average close
slPercent = 0.0045 // 0.45%
tpPercent = 0.0060 // 0.60%
tpReEntryPercent = 0.006 // 0.30% (smaller TP after re-entry)
stopReEntryPercent = 0.005 // -0.20%
stopReEntryValue = baseClose * stopReEntryPercent
slValue = baseClose * slPercent
tpValue = baseClose * tpPercent
tpReValue = baseClose * tpReEntryPercent
// --- Re-entry state flag ---
var bool isReEntry = false
// --- Trade Logic (Only if NOT in cooldown) ---
if not inCooldown and not isTall
if strategy.position_size == 0
if not na(pl)
strategy.entry("PivExtLE", strategy.long, comment="Long")
isReEntry := false
if not na(ph)
strategy.entry("PivExtSE", strategy.short, comment="Short")
isReEntry := false
// =====================================================
// --- Take Profit / Stop Loss with auto-flip ---
// =====================================================
// LONG
if strategy.position_size > 0 and not isTall
entryPrice = strategy.position_avg_price
tpLevel = entryPrice + (isReEntry ? tpReValue : tpValue)
// Re-entry extra stop condition
if isReEntry and close <= entryPrice - stopReEntryValue
strategy.close("PivExtLE", comment="Stop Re-Entry Long (-0.20%)")
isReEntry := false
else if close >= tpLevel
strategy.close("PivExtLE", comment=isReEntry ? "TP Long (Re-Entry)" : "TP Long")
randChoice = (bar_index * 9301 + 49297) % 2
if randChoice == 0
strategy.entry("PivExtSE", strategy.short, comment="Flip to Short (TP)")
isReEntry := false
else
strategy.entry("PivExtLE", strategy.long, comment="Re-Enter Long (TP)")
isReEntry := true
else if close <= entryPrice - slValue
strategy.close("PivExtLE", comment="SL Long")
strategy.entry("PivExtSE", strategy.short, comment="Flip to Short (SL)")
isReEntry := false
// SHORT
if strategy.position_size < 0 and not isTall
entryPrice = strategy.position_avg_price
tpLevel = entryPrice - (isReEntry ? tpReValue : tpValue)
// Re-entry extra stop condition
if isReEntry and close >= entryPrice + stopReEntryValue
strategy.close("PivExtSE", comment="Stop Re-Entry Short (-0.20%)")
isReEntry := false
else if close <= tpLevel
strategy.close("PivExtSE", comment=isReEntry ? "TP Short (Re-Entry)" : "TP Short")
strategy.entry("PivExtLE", strategy.long, comment="Flip to Long (TP)")
isReEntry := true
else if close >= entryPrice + slValue
strategy.close("PivExtSE", comment="SL Short")
strategy.entry("PivExtLE", strategy.long, comment="Flip to Long (SL)")
isReEntry := false
// --- Plot reference ---
plot(slValue, title="SL Value (0.45% of 30-bar Close)", color=color.red)
plot(tpValue, title="TP Value (0.60% of 30-bar Close)", color=color.green)
plot(tpReValue, title="TP Value (Re-Entry 0.30%)", color=color.orange)