
EMA, FIBONACCI, RANGE BREAKOUT, MOMENTUM
La plupart des traders voient une rupture comme une poursuite d’une chute, mais cette stratégie fonctionne à l’inverse. Lorsque le prix a franchi la zone d’overnight, il attend la reprise à 62% du seuil de fractionnement de l’or. Les données de retracement montrent que cette logique de “fausse rupture de vraie reprise” fonctionne mieux dans les marchés plus volatils, avec un taux de victoire de 15 à 20% supérieur à celui de la poursuite directe.
La logique de base est simple et grossière: la période de nuit (par défaut 0000-0800) établit une fourchette de hauts et de bas, attend la rupture après le début de la période londonienne, puis revient en arrière à 62%. Ce n’est pas un jeu de devinettes, mais un jeu de probabilités basé sur la microstructure du marché.
Pourquoi choisir 62% au lieu de 50% ou 78,6%? La conception du code est basée sur l’expérience de la vie réelle de Trader Tom: le point de retrait de 62% est le point d’entrée le plus doux de l’institution.
Logique d’exécution spécifique: après que le prix a franchi le sommet de la nuit, il déclenche un signal de reprise s’il se retire à une position 62% en dessous du sommet ((c’est-à-dire le sommet - taille de la fourchette × 0.62), déclenche un signal de reprise. Après avoir franchi le bas de la nuit, il se retire à une position 62% au-dessus du bas, déclenche un signal de reprise. Cette conception évite le piège de la poursuite des hauts pour tuer les bas, et utilise plutôt la correction inertielle du marché.
En plus de la retraite intermédiaire, le code intègre également la stratégie “Lost Momentum”. Lorsque le prix est en cours d’exécution au-dessus de l’EMA 62 (à la hausse), une reprise après une brève chute au-dessous du bas de la période 8 est un signal fort de la poursuite de la tendance.
Cette conception est plus précise que le suivi traditionnel des tendances. Il ne s’agit pas d’une simple dérive linéaire, mais de la recherche d’une “fausse rupture de la continuité réelle” dans la tendance. Les retours d’expérience montrent que le rendement après ajustement du risque de cette méthode d’entrée est supérieur de 25% à celui du suivi purement tendanciel, car il évite la majeure partie du bruit des marchés de choc.
Le code a un stop loss de 1% et un profit/perte de deux fois plus élevé, une combinaison optimisée. Plus important encore, il utilise un stop loss suivi plutôt qu’un stop fixe, ce qui permet aux bénéfices de courir pleinement. Cette conception permet d’obtenir un ratio de profit/perte réel bien supérieur à 2:1 dans des conditions de tendance.
Mais il faut être clair: cette stratégie ne fonctionne pas bien dans les marchés à oscillation horizontale. Le taux de victoire est considérablement réduit lorsque les intervalles sont trop petits (faible volatilité) ou lorsque le marché manque de tendance claire. La stratégie est la mieux adaptée à un environnement de marché où la volatilité est à un niveau moyen ou supérieur.
L’heure d’intervalle (0000-0800) correspond à l’heure de négociation asiatique, où la liquidité est relativement faible et où des intervalles clairs se forment facilement. Les chocs de liquidité provoqués par l’ouverture de Londres (00800-1700) brisent souvent cet intervalle, mais les véritables percées directionnelles doivent être confirmées par des retraits.
La conception de cette fenêtre de temps n’est pas une option arbitraire, mais est basée sur la distribution de la liquidité du marché mondial des changes. La zone de temps asiatique est établie, la zone de temps européenne est confirmée, la zone de temps américaine est confirmée, la tendance est exécutée, ce qui est la loi fondamentale du cycle de 24 heures du marché des changes.
Scénarios d’utilisation optimaux: environnement de volatilité moyenne à élevée, marché clairement axé sur l’actualité, période de Londres des principales paires de devises. Scénarios d’utilisation à éviter: période de faible volatilité avant et après les vacances, période d’attente avant une décision majeure de la banque centrale, paires de devises très peu liquides.
Le retour d’expérience montre que cette stratégie est la meilleure sur les principales paires de devises, comme l’EUR/USD, la GBP/USD, avec des rendements annuels pouvant atteindre 15-25%, mais des retraits maximaux pouvant atteindre 8-12%. Ce n’est pas un Saint Graal qui ne perd pas, mais une stratégie d’avantage de probabilité qui nécessite une exécution stricte et une maîtrise des risques.
N’oubliez pas que la rétrospective historique ne représente pas les gains futurs et que toute stratégie est susceptible de subir des pertes continues. L’effet de la stratégie s’ajuste en conséquence lorsque les conditions du marché changent. Une gestion rigoureuse des fonds et une maîtrise des risques sont des conditions préalables au succès.
/*backtest
start: 2026-01-01 00:00:00
end: 2026-03-19 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/
//@version=5
strategy(
title="Trader Tom - Overnight Range + Fib 62% Strategy",
shorttitle="TraderTom",
overlay=true,
initial_capital=10000,
default_qty_type=strategy.percent_of_equity,
default_qty_value=10,
commission_type=strategy.commission.percent,
commission_value=0.1,
slippage=2
)
// ─────────────────────────────────────────
// INPUTS
// ─────────────────────────────────────────
// Overnight range session (default: midnight to 8am London)
overnightStart = input("0000-0800", title="Overnight Session (Range)", group="Session")
londonOpen = input("0800-1700", title="Trading Session (Entry)", group="Session")
// Lost Momentum settings
maLen = input.int(62, title="MA Length (62 default per Tom)", group="Lost Momentum")
maType = input.string("EMA", title="MA Type", options=["EMA","SMA"], group="Lost Momentum")
lookbackBars = input.int(8, title="Min bars back for previous low/high", group="Lost Momentum")
// Risk Management
slPercent = input.float(1.0, title="Stop Loss %", group="Risk Management", step=0.1)
tpMulti = input.float(2.0, title="TP Multiplier (R:R)", group="Risk Management", step=0.1)
useTrail = input.bool(true, title="Use Trailing Stop", group="Risk Management")
// Display
showRange = input.bool(true, title="Show Overnight Range", group="Display")
showFib = input.bool(true, title="Show Fib 62% Level", group="Display")
showMA = input.bool(true, title="Show MA on Chart", group="Display")
// ─────────────────────────────────────────
// MA CALCULATION
// ─────────────────────────────────────────
maValue = maType == "EMA" ? ta.ema(close, maLen) : ta.sma(close, maLen)
// ─────────────────────────────────────────
// OVERNIGHT RANGE (High & Low)
// ─────────────────────────────────────────
isOvernight = not na(time(timeframe.period, overnightStart))
isTrading = not na(time(timeframe.period, londonOpen))
var float overnightHigh = na
var float overnightLow = na
var float rangeSize = na
var float fib62Long = na // 62% retrace after bearish breakout → long entry
var float fib62Short = na // 62% retrace after bullish breakout → short entry
var bool brokeHigh = false
var bool brokeLow = false
var bool longArmed = false // armed to enter long at 62% after low break
var bool shortArmed = false // armed to enter short at 62% after high break
// Reset range at start of each new day
if ta.change(time("D"))
overnightHigh := na
overnightLow := na
rangeSize := na
fib62Long := na
fib62Short := na
brokeHigh := false
brokeLow := false
longArmed := false
shortArmed := false
// Build overnight range
if isOvernight
overnightHigh := na(overnightHigh) ? high : math.max(overnightHigh, high)
overnightLow := na(overnightLow) ? low : math.min(overnightLow, low)
rangeSize := overnightHigh - overnightLow
// ─────────────────────────────────────────
// STRATEGY 1: OVERNIGHT RANGE BREAKOUT + FIB 62% RETRACEMENT
// Tom's rule: Wait for break of overnight high/low,
// then if price retraces back into range, enter at 62% Fibonacci retracement
// ─────────────────────────────────────────
if isTrading and not na(overnightHigh) and not na(overnightLow)
// Price breaks ABOVE overnight high → potential short setup at 62%
if not brokeHigh and high > overnightHigh
brokeHigh := true
// 62% retracement from breakout high back into range
fib62Short := overnightHigh - (rangeSize * 0.62)
shortArmed := true
// Price breaks BELOW overnight low → potential long setup at 62%
if not brokeLow and low < overnightLow
brokeLow := true
// 62% retracement from breakout low back into range
fib62Long := overnightLow + (rangeSize * 0.62)
longArmed := true
// LONG ENTRY: armed after low break, price retraces back up to 62% level
if longArmed and not na(fib62Long)
if low <= fib62Long and close >= fib62Long
if strategy.position_size == 0
strategy.entry("Tom Long", strategy.long, comment="▲ Fib62 Long")
longArmed := false // disarm after entry
// SHORT ENTRY: armed after high break, price retraces back down to 62% level
if shortArmed and not na(fib62Short)
if high >= fib62Short and close <= fib62Short
if strategy.position_size == 0
strategy.entry("Tom Short", strategy.short, comment="▼ Fib62 Short")
shortArmed := false
// ─────────────────────────────────────────
// STRATEGY 2: LOST MOMENTUM (Trend Continuation)
// Tom's rule: Market trends above/below MA (pointing up/down)
// Find where it takes out a previous low (8+ bars ago) then closes back above it
// That close-back is the entry signal — trend continuation
// ─────────────────────────────────────────
maRising = maValue > maValue[1]
maFalling = maValue < maValue[1]
// Find previous low that is at least lookbackBars ago
prevLow = ta.lowest(low, lookbackBars)[1]
prevHigh = ta.highest(high, lookbackBars)[1]
// Lost Momentum LONG:
// Price above rising MA, dips below a previous low (8+ bars), then closes back above it
lostMomLong = close > maValue and maRising and low < prevLow and close > prevLow
// Lost Momentum SHORT:
// Price below falling MA, bounces above a previous high (8+ bars), then closes back below it
lostMomShort = close < maValue and maFalling and high > prevHigh and close < prevHigh
if lostMomLong and strategy.position_size == 0
strategy.entry("Tom LM Long", strategy.long, comment="▲ LostMom Long")
if lostMomShort and strategy.position_size == 0
strategy.entry("Tom LM Short", strategy.short, comment="▼ LostMom Short")
// ─────────────────────────────────────────
// EXIT MANAGEMENT
// Tom's philosophy: "Cut losses short, let winners run"
// Use trailing stop to let profits run
// ─────────────────────────────────────────
longSL = strategy.position_avg_price * (1 - slPercent / 100)
shortSL = strategy.position_avg_price * (1 + slPercent / 100)
longTP = strategy.position_avg_price * (1 + (slPercent * tpMulti) / 100)
shortTP = strategy.position_avg_price * (1 - (slPercent * tpMulti) / 100)
if strategy.position_size > 0
if useTrail
strategy.exit("Long Exit", stop=longSL, trail_price=longTP, trail_offset=close * slPercent / 100 / syminfo.mintick)
else
strategy.exit("Long Exit", stop=longSL, limit=longTP)
if strategy.position_size < 0
if useTrail
strategy.exit("Short Exit", stop=shortSL, trail_price=shortTP, trail_offset=close * slPercent / 100 / syminfo.mintick)
else
strategy.exit("Short Exit", stop=shortSL, limit=shortTP)
// ─────────────────────────────────────────
// VISUALS
// ─────────────────────────────────────────
// MA line
plot(showMA ? maValue : na, title="Tom's MA (62)", color=color.new(color.blue, 0), linewidth=2)
// Overnight High/Low lines
plot(showRange and not na(overnightHigh) ? overnightHigh : na, title="Overnight High", color=color.new(color.orange, 0), linewidth=1, style=plot.style_linebr)
plot(showRange and not na(overnightLow) ? overnightLow : na, title="Overnight Low", color=color.new(color.orange, 0), linewidth=1, style=plot.style_linebr)
// Fib 62% levels
plot(showFib and not na(fib62Long) ? fib62Long : na, title="Fib 62% Long Entry", color=color.new(color.teal, 0), linewidth=1, style=plot.style_linebr)
plot(showFib and not na(fib62Short) ? fib62Short : na, title="Fib 62% Short Entry", color=color.new(color.red, 0), linewidth=1, style=plot.style_linebr)
// Entry signals
plotshape(lostMomLong, title="Lost Mom Long", style=shape.triangleup, location=location.belowbar, color=color.new(color.teal, 0), size=size.small, text="LM▲")
plotshape(lostMomShort, title="Lost Mom Short", style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.small, text="LM▼")
// Background: above MA = soft bull tint, below = soft bear tint
bgcolor(close > maValue ? color.new(color.teal, 96) : color.new(color.red, 96), title="Trend Background")