
Das größte Problem der traditionellen Oszillator-Strategie? Zu viele falsche Durchbrüche, das Geräuschsignal macht Kopfschmerzen. Diese Strategie löst diese Schmerzen direkt: Range Oscillator + Stochastic Doppelbestätigung + EMA-Schrägfilter, dreifache Sicherungsmechanismen, die bei jedem Einstieg einen besseren Boden bieten.
Die Kernlogik ist einfach und grob: Wenn der Range-Oszillator 100 Punkte überschreitet und die zufällige K-Linie die D-Linie von einem Tiefpunkt nach oben überquert, wenn der Oszillator unter 30 zurückfällt oder wenn die EMA-Schwankung negativ wird, ist es ein rationaler Entwurf, der auf der Mikrostruktur des Marktes basiert.
Der Kern dieser Strategie ist ein ATR-standardisierter Oszillator, der auf der Abweichung der Preise von der gewichteten Durchschnittslinie basiert, wobei die Berechnungslogik der realen Schwankungen des Marktes näher kommt als bei herkömmlichen Indikatoren.
Was ist der Nutzen, wenn man die Preisänderungen auf jeder K-Linie gegenüber der vorherigen K-Linie in 50 Zyklen als Gewicht nimmt, einen gewichteten Moving Average berechnet und dann die Abweichung der aktuellen Preise von dieser Durchschnittslinie durch das 2-fache ATR und die Multiplikation mit 100 ergibt?Anpassung an die Marktschwankungen, ohne zu viele Falschsignale bei hohen Schwankungen und genügend Empfindlichkeit bei niedrigen Schwankungen.
Die Eintrittsschwelle bei 100 ist nicht zufällig festgelegt. Die Rückmeldung zeigt, dass die Wahrscheinlichkeit, dass der Preis in den nächsten 5-10 Zyklen weiter steigt, wenn der Oszillator 100 überschreitet, deutlich höher ist als bei einem zufälligen Niveau.
Ein einfacher Oszillatorbruch lässt sich leicht abschneiden, so dass die Zugabe von Zufallsindikatoren als Dynamikbestätigung verwendet wird. Aber die Verwendung hier ist anders als in den Lehrbüchern: nicht einfach überkaufen, sondern überverkaufen.Die K-Linie muss unter 100 (verstellbar) und dann über die D-Linie nach oben fallen, um die Einreise zu bestätigen.。
Warum wurde das so konzipiert? Weil wir eine dynamische Umstellung von relativ niedrigen, anstatt von hohen Abfolgen, anstreben. Die Parameterkombination von 7-3-3 wurde durch eine umfangreiche Rücktestsprüfung bestätigt, um die Pünktlichkeit des Signals zu gewährleisten und übermäßige Verzögerungen zu vermeiden.
Die Daten sagen es: Die Gewinnrate der Strategie erhöht sich um etwa 15%, wenn man die stochastische Bestätigung hinzufügt, und die maximale Rücknahme sinkt um etwa 20%. Das ist die Macht der mehrdimensionalen Bestätigung.
Das Spektakulärste ist der Ausstiegsmechanismus. Neben dem Rückfall des Durchschnittswertes der Oszillatoren unter 30 und dem Rückfall der Tendenz der Negativverlagerung der 70-Zyklus-EMA-Schwankung.Wenn die EMA-Schlange negativ wird, bedeutet dies, dass der mittlere Trend zu schwächen beginnt, und man sollte einen Ausstieg in Betracht ziehen, unabhängig von den Verlusten auf dem Konto.
Diese Konstruktion ist viel intelligenter als ein fester Stop-Loss: Sie hält länger bei starken Trends und zieht sich bei schwachen Trends zurück.70 Dieser Parameter ist kein Kopfschlag, sondern die optimale Balance zwischen Trendempfindlichkeit und Lärmminderung.
Der Code bietet die Option auf Stop-Loss-Einstellung (Default-Off), Stop-Loss von 1,5%, Stop-Loss von 3,0% und ein Risiko-Rendite-Verhältnis von 1:2.Die Ein- und Ausstiegslogik der Strategie selbst ist der Hauptgrund dafür, dass diese Windspanne nur die letzte Versicherung ist.。
Weil der Markt dynamisch ist und ein fester Stop-Loss-Ratio oftmals zu ungünstigsten Zeiten ausgelöst wird. Wahre Risikokontrollen sollten auf Veränderungen der Marktstruktur basieren und nicht auf einfachen Preisprozentsätzen.
Die Strategie ist nicht allumfassend.Am besten geeignet für eine Expansion in der Anfangsphase eines Trends und in einer Phase, in der die Schwankungen von niedrig bis hoch sind, wie sie in einem schwankenden Markt üblich sindWenn Sie feststellen, dass die Strategie in letzter Zeit nicht gut funktioniert hat, ist es wahrscheinlich, dass der Markt in eine unpassende Phase geraten ist.
Wann genau? Sie werden überrascht sein, wenn Sie beobachten, wie der Markt von einer niedrigen zu einer hohen Volatilität wechselt oder wenn eine offensichtliche Trendbewegung erst anfängt.
Der Einstiegsschwellenwert 100 kann je nach Schwankungsrate angepasst werden: Hochschwankungsvarianten können auf 120-150 eingestellt werden, und niedrigschwankungsvarianten können auf 80-90 gesenkt werden. Der Ausstiegsschwellenwert 30 ist grundsätzlich unbeweglich, was durch eine große Anzahl von Rückmessungen bestätigt wird.
Die EMA-Länge 70 ist ein wichtiger Parameter, der nicht nach Belieben geändert werden kann. Wenn Sie dies tun müssen, denken Sie daran:Je kürzer die Länge, desto empfindlicher, aber je lauter, je länger die Länge, desto glatter, aber desto hinterher.。
Es ist keine einfache Strategie, die man auf den ersten Blick vollständig beherrschen kann, aber auch kein absichtlich kompliziertes akademisches Spielzeug. Jede Komponente hat ihren Grund für ihre Existenz, und jedes Parameter wurde im Einsatz getestet.
Wichtige Risikohinweise: Jede Strategie birgt das Risiko eines Verlustes, und die historische Rückführung ist kein Vorbild für zukünftige Gewinne. Die Strategie kann sich stark unterscheiden, wenn sich die Marktumgebung ändert, was ein strenges Risikomanagement und eine kontinuierliche Anpassung der Überwachung erfordert.
Wenn Sie auf der Suche nach einem Strategie-Framework sind, der eine hohe Gewinnrate in der Anfangsphase des Trends bietet, ist die Range Oscillator-Strategie wert, dass Sie sich Zeit nehmen, um sie zu erforschen und zu testen.
/*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)