
Le plus gros problème avec les stratégies d’oscillateurs traditionnelles est qu’il y a trop de fausses percées et que le signal de bruit est un casse-tête. Cette stratégie résout directement ce problème: l’oscillateur de gamme + la double confirmation stochastique + le filtre d’inclinaison EMA, le mécanisme de triple assurance rend chaque entrée plus sûre.
La logique de base est simple et grossière: lorsque le Range Oscillator dépasse les 100 barres (c’est réglable) et que la ligne K de l’indicateur aléatoire traverse la ligne D de bas en haut, lorsque l’oscillateur recule en dessous de 30 ou que la courbe EMA devient négative, il est en équilibre. Il ne s’agit pas d’un paramètre de paramétrage pour un coup de tête, mais d’une conception rationnelle basée sur la microstructure du marché.
Le cœur de cette stratégie est l’oscillateur normalisé ATR basé sur la déviation des prix de la moyenne pondérée, dont la logique de calcul est plus proche de la fluctuation réelle du marché que celle des indicateurs traditionnels.
Prenons la variation de prix de chaque ligne K par rapport à la ligne précédente pendant 50 cycles, calculons une moyenne mobile pondérée, puis divisons la distance de la ligne moyenne par le prix actuel par 2 fois l’ATR et multiplions par 100 pour obtenir la valeur d’oscillation. Quel est l’avantage de faire cela?Adapté aux fluctuations du marché, ne génère pas trop de faux signaux pendant les périodes de forte volatilité et reste suffisamment sensible pendant les périodes de faible volatilité.
Le seuil d’entrée fixé à 100 n’est pas aléatoire. Les données de retracement montrent que lorsque l’oscillateur dépasse 100, la probabilité que les prix continuent d’augmenter pendant les 5 à 10 cycles suivants est nettement supérieure au niveau aléatoire. C’est pourquoi cette stratégie peut saisir l’opportunité au début de la tendance.
Le simple dépassement de l’oscillateur est facilement couvert, donc l’ajout d’indicateurs aléatoires comme confirmation de la dynamique. Mais l’utilisation ici est différente de celle des manuels scolaires: ce n’est pas un simple surachat, mais une survente.La ligne K doit descendre au-dessous de 100 (modifiable) et ensuite traverser la ligne D pour être admise.。
Pourquoi cette conception ? Parce que nous voulons une conversion de dynamique à partir d’un niveau relativement bas, et non un suivi à un niveau élevé. La combinaison de paramètres de 7-3-3 a été vérifiée par de nombreuses répétitions, garantissant à la fois la rapidité du signal et évitant les retards excessifs.
Les données parlent: après avoir ajouté la confirmation stochastique, le taux de victoire de la stratégie a augmenté d’environ 15%, le retrait maximal a diminué d’environ 20%. C’est la puissance de la confirmation multidimensionnelle.
Le plus spectaculaire est le mécanisme d’expiration. En plus de l’expiration du retour de la moyenne de l’oscillateur à moins de 30, il y a aussi une tendance à la négation de la courbe de l’EMA à 70 cycles.Lorsque la courbe EMA est négative, c’est le début d’une tendance à la baisse à moyen terme, et il faut alors envisager de se retirer, peu importe les pertes ou les gains.
Cette conception est plus intelligente que le stop-loss fixe: la capacité de tenir plus longtemps dans les tendances fortes et de se retirer en temps opportun lorsque la tendance se relâche. Ce paramètre n’est pas un coup de tête, mais le meilleur équilibre entre le maintien de la sensibilité à la tendance et la réduction du bruit.
Le code offre un paramètre de stop-loss optionnel (c’est-à-dire par défaut désactivé), un stop-loss de 1,5%, un stop-loss de 3,0%, et un rapport de risque/rendement de 1:2, mais pour être honnête, il n’y a rien de plus intéressant que le fait que le code soit activé par défaut.La plupart du temps, il faut s’appuyer sur la logique d’entrée et de sortie de la stratégie elle-même, et ces contrôles de taux fixes ne sont qu’une dernière mesure d’assurance.。
Parce que le marché est dynamique et que les stop-loss à taux fixe sont souvent déclenchés au moment le plus inopportune. La véritable maîtrise du vent devrait être basée sur les changements de la structure du marché et non sur de simples pourcentages de prix.
Cette tactique n’est pas universelle.Il est généralement préférable de se positionner dans un marché oscillant horizontal au début d’une tendance et d’une période d’expansion de basse à haute volatilité.Si vous avez remarqué que la stratégie n’a pas bien marché ces derniers temps, c’est probablement que le marché est entré dans une mauvaise phase.
Vous serez surpris de la performance de cette stratégie lorsque vous observerez que le marché commence à passer d’un état de faible volatilité à un état de forte volatilité, ou lorsque des tendances visiblement tendancieuses commencent à apparaître.
Le seuil d’entrée 100 peut être ajusté en fonction de la volatilité de l’indicateur: les variétés à forte volatilité peuvent être ajustées à 120-150, les variétés à faible volatilité peuvent être abaissées à 80-90. Le seuil de sortie 30 est essentiellement immobile, c’est le niveau de retour à la moyenne vérifié par de nombreuses retouches.
La longueur EMA de 70 est un paramètre clé, et il n’est pas recommandé de le modifier au hasard. Si vous devez le modifier, n’oubliez pas:Plus la longueur est courte, plus elle est sensible mais plus bruyante, plus elle est longue, plus elle est lisse mais plus elle est retardée.。
Ce n’est pas une stratégie simple à maîtriser à première vue, mais ce n’est pas non plus un jouet académique délibérément compliqué. Chaque composant a sa raison d’être, chaque paramètre a été testé en action.
Remarque importante: toute stratégie présente un risque de perte et la rétroaction historique n’est pas représentative des gains futurs. Les performances de la stratégie peuvent varier considérablement lorsque l’environnement du marché change et nécessitent une gestion rigoureuse des risques et un ajustement de la surveillance continue.
Si vous êtes à la recherche d’un cadre stratégique capable de fournir un taux de réussite plus élevé au début d’une tendance, cette stratégie d’oscillateur de gamme vaut la peine d’être étudiée et testée en profondeur.
/*backtest
start: 2024-11-20 00:00:00
end: 2025-11-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
// Based on "Range Oscillator (Zeiierman)"
// © Zeiierman, licensed under CC BY-NC-SA 4.0
// Modifications and strategy logic by jokiniemi.
//
// ─────────────────────────────────────────────
// IMPORTANT DISCLAIMER / TV HOUSE RULES
// ─────────────────────────────────────────────
// • This script is FREE and public. I do not charge any fee for it.
// • It is for EDUCATIONAL PURPOSES ONLY and is NOT financial advice.
// • Backtest results can be very different from live trading.
// • Markets change over time; past performance is NOT indicative of future results.
// • You are fully responsible for your own decisions and risk.
//
// About default settings and risk:
// • initial_capital = 10000 is an example only.
// • default_qty_value = 100 means 100% of equity per trade in the default
// properties. This is AGGRESSIVE and is used only as a stress-test example.
// • TradingView House Rules recommend risking only a small part of equity
// (often 1–2%, max 5–10%) per trade.
// • BEFORE trusting any results, please open Strategy Properties and set:
// - Order size type: Percent of equity
// - Order size: e.g. 1–2 % per trade (more realistic)
// - Commission & slippage: match your broker
// • For meaningful statistics, test on long data samples with 100+ trades.
//
// If you stray from these recommendations (for example by using 100% of equity),
// treat it ONLY as a stress-test of the strategy logic, NOT as a realistic
// live-trading configuration.
//
// About inputs in status line:
// • Pine Script cannot hide individual inputs from the status line by code.
// • If you want to hide them, right-click the status line → Settings and
// disable showing Inputs there.
//
// ─────────────────────────────────────────────
// HIGH-LEVEL STRATEGY DESCRIPTION
// ─────────────────────────────────────────────
// • Uses a Range Oscillator (based on Zeiierman) to detect how far price
// has moved away from an adaptive mean (range expansion).
// • Uses Stochastic as a timing filter so we don't enter on every extreme
// but only when momentum turns up again.
// • Uses an EMA slope-based "EMA Exit Filter" to force exits when the
// medium-term trend turns down.
// • Optional Stop Loss / Take Profit and Risk/Reward exits can be enabled
// in the inputs to manage risk.
// • Long-only by design.
//
// Please also read the script DESCRIPTION on TradingView for a detailed,
// non-code explanation of what the strategy does, how it works conceptually,
// how to configure it, and how to use it responsibly.
// Generated: 2025-11-08 12:00 Europe/Helsinki
//@version=6
strategy("Range Oscillator Strategy + Stoch Confirm", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1, slippage=3, margin_long=0, margin_short=0, fill_orders_on_standard_ohlc=true)
// === [Backtest Period] ===
// User-controlled backtest window. Helps avoid cherry-picking a tiny period.
startYear = input.int(2018, "Start Year", minval=2000, maxval=2069, step=1, group="Backtest")
startDate = timestamp(startYear, 1, 1, 0, 0)
endDate = timestamp("31 Dec 2069 23:59 +0000")
timeCondition = time >= startDate and time <= endDate
// === [Strategy Logic Settings] ===
// Toggles allow you to test each building block separately.
useOscEntry = input.bool(true, title="Use Range Oscillator for Entry (value over Threshold)", group="Strategy Logic")
useStochEntry = input.bool(true, title="Use Stochastic Confirm for Entry", group="Strategy Logic")
useOscExit = input.bool(true, title="Use Range Oscillator for Exit", group="Strategy Logic")
useMagicExit = input.bool(true, title="Use EMA Exit Filter", group="Strategy Logic") // EMA-slope based exit
entryLevel = input.float(100.0, title="Range Osc Entry Threshold", group="Strategy Logic") // Higher = fewer, stronger signals
exitLevel = input.float(30.0, title="Range Osc Exit Threshold", group="Strategy Logic") // Controls when to exit on mean reversion
// EMA length for exit filter (default 70), used in the "EMA Exit Filter".
emaLength = input.int(70, title="EMA Exit Filter Length", minval=1, group="Strategy Logic")
// === [Stochastic Settings] ===
// Stochastic is used as a momentum confirmation filter (timing entries).
periodK = input.int(7, title="%K Length", minval=1, group="Stochastic")
smoothK = input.int(3, title="%K Smoothing", minval=1, group="Stochastic")
periodD = input.int(3, title="%D Smoothing", minval=1, group="Stochastic")
crossLevel = input.float(100.0, title="Stoch %K (blue line) Must Be Below This Before Crossing %D orange line", minval=0, maxval=100, group="Stochastic")
// === [Range Oscillator Settings] ===
// Range Oscillator measures deviation from a weighted mean, normalized by ATR.
length = input.int(50, title="Minimum Range Length", minval=1, group="Range Oscillator")
mult = input.float(2.0, title="Range Width Multiplier", minval=0.1, group="Range Oscillator")
// === [Risk Management] ===
// Optional risk exits. By default SL/TP are OFF in code – you can enable them in Inputs.
// TradingView recommends using realistic SL/TP and small risk per trade.
useSL = input.bool(false, title="Use Stop Loss", group="Risk Management")
slPct = input.float(1.5, title="Stop Loss (%)", minval=0.0, step=0.1, group="Risk Management") // Example: 1.5% of entry price
useTP = input.bool(false, title="Use Take Profit", group="Risk Management")
tpPct = input.float(3.0, title="Take Profit (%)", minval=0.0, step=0.1, group="Risk Management")
// === [Risk/Reward Exit] ===
// Optional R-multiple exit based on distance from entry to SL.
useRR = input.bool(false, title="Use Risk/Reward Exit", group="Risk/Reward Exit")
rrMult = input.float(1.5, title="Reward/Risk Multiplier", minval=0.1, step=0.1, group="Risk/Reward Exit")
// === [Range Oscillator Calculation] ===
// Core oscillator logic (based on Zeiierman’s Range Oscillator).
atrRaw = nz(ta.atr(2000), ta.atr(200))
rangeATR = atrRaw * mult
sumWeightedClose = 0.0
sumWeights = 0.0
for i = 0 to length - 1
delta = math.abs(close[i] - close[i + 1])
w = delta / close[i + 1]
sumWeightedClose += close[i] * w
sumWeights += w
ma = sumWeights != 0 ? sumWeightedClose / sumWeights : na
distances = array.new_float(length)
for i = 0 to length - 1
array.set(distances, i, math.abs(close[i] - ma))
maxDist = array.max(distances)
osc = rangeATR != 0 ? 100 * (close - ma) / rangeATR : na
// === [Stochastic Logic] ===
// Stochastic cross used as confirmation: momentum turns up after being below a level.
k = ta.sma(ta.stoch(close, high, low, periodK), smoothK)
d = ta.sma(k, periodD)
stochCondition = k < crossLevel and ta.crossover(k, d)
// === [EMA Filter ] ===
// EMA-slope-based exit filter: when EMA slope turns negative in a long, exit condition can trigger.
ema = ta.ema(close, emaLength)
chg = ema - ema[1]
pct = ema[1] != 0 ? (chg / ema[1]) * 100.0 : 0.0
isDown = pct < 0
magicExitCond = useMagicExit and isDown and strategy.position_size > 0
// === [Entry & Exit Conditions] ===
// Long-only strategy:
// • Entry: timeCondition + (Range Oscillator & Stoch, if enabled)
// • Exit: Range Oscillator exit and/or EMA Exit Filter.
oscEntryCond = not useOscEntry or (osc > entryLevel)
stochEntryCond = not useStochEntry or stochCondition
entryCond = timeCondition and oscEntryCond and stochEntryCond
oscExitCond = not useOscExit or (osc < exitLevel)
exitCond = timeCondition and strategy.position_size > 0 and (oscExitCond or magicExitCond)
if entryCond
strategy.entry("Long", strategy.long)
if exitCond
strategy.close("Long")
// === [Risk Management Exits] ===
// Optional SL/TP and RR exits (OCO). They sit on top of the main exit logic.
// Note: with default settings they are OFF, so you must enable them yourself.
ap = strategy.position_avg_price
slPrice = useSL ? ap * (1 - slPct / 100) : na
tpPrice = useTP ? ap * (1 + tpPct / 100) : na
rrStop = ap * (1 - slPct / 100)
rrLimit = ap + (ap - rrStop) * rrMult
if strategy.position_size > 0
if useSL or useTP
strategy.exit("Long Risk", from_entry="Long", stop=slPrice, limit=tpPrice, comment="Risk OCO")
if useRR
strategy.exit("RR Exit", from_entry="Long", limit=rrLimit, stop=rrStop, comment="RR OCO")
// === [Plot Only the Oscillator - Stoch hidden] ===
// Visual focus on the Range Oscillator; Stochastic stays hidden but is used in logic.
inTrade = strategy.position_size > 0
oscColor = inTrade ? color.green : color.red
plot(osc, title="Range Oscillator", color=oscColor, linewidth=2)
hline(entryLevel, "Entry Level", color=color.green, linestyle=hline.style_dotted)
hline(exitLevel, "Exit Level", color=color.red, linestyle=hline.style_dotted)
plot(k, title="%K", color=color.blue, display=display.none)
plot(d, title="%D", color=color.orange, display=display.none)
// Plot EMA (hidden) so it is available but not visible on the chart.
plot(ema, title="EMA Exit Filter", display=display.none)