
O maior problema das estratégias tradicionais de osciladores? Há muitos false breaks e os sinais de ruído são dolorosos. Esta estratégia resolve diretamente esse problema: O Range Oscillator + Stochastic Double Confirmation + EMA Slip Filter, o mecanismo de seguro triplo faz com que cada entrada tenha mais ânimo.
A lógica central é simples e grosseira: quando o Range Oscillator ultrapassa os 100 pips (customiza-se) e o indicador K linear aleatório faz mais quando ele atravessa a linha D de baixo para cima, quando o oscilador retorna abaixo de 30 ou quando o EMA slope se torna negativo. Esta não é uma configuração de parâmetros para bater a cabeça, mas um projeto racional baseado na microestrutura do mercado.
O núcleo desta estratégia é um oscilador padronizado ATR baseado no desvio do preço da linha de média ponderada, com uma lógica de cálculo mais próxima da verdadeira oscilação do mercado do que os indicadores tradicionais.
O que é isso? Ponderar a variação de preço de cada linha K em relação à linha anterior em 50 ciclos, calcular a média móvel ponderada e dividir a distância do preço atual da linha média por 2 vezes o ATR e multiplicar por 100 para obter o valor de oscilação.Adapta-se à volatilidade do mercado, não produz muitos falsos sinais durante a alta volatilidade e mantém a sensibilidade suficiente durante a baixa volatilidade.
O limite de entrada definido em 100 não é aleatório. Os dados de retrospectiva mostram que, quando o oscilante ultrapassa 100, a probabilidade de que o preço continue a subir nos 5 a 10 ciclos seguintes é significativamente maior do que o nível aleatório. É por isso que esta estratégia pode aproveitar as oportunidades no início da tendência.
A simples ruptura de um oscilador é fácil de ser encaixada, então adicionar um indicador aleatório como confirmação de impulso. Mas o uso aqui é diferente do que no livro didático: não é uma simples sobrecompra, mas uma sobrevenda.Requer que a linha K tenha que cair abaixo de 100 (modificável) e depois atravessar a linha D para entrar.。
Porque queremos uma conversão de força a partir de níveis relativamente baixos, e não um acompanhamento de níveis elevados. A combinação de parâmetros do 7-3-3 foi comprovada por um grande número de testes de retorno, garantindo a oportunidade do sinal e evitando o atraso excessivo.
Os dados falam por si: após a adição da confirmação estocástica, a taxa de vitória da estratégia aumenta em cerca de 15%, e a de retirada máxima diminui em cerca de 20%. Esse é o poder da confirmação multidimensional.
O mais espetacular é o mecanismo de saída. Além do regresso do oscilador para o valor médio abaixo de 30, há também uma tendência de saída de um declínio negativo da inclinação do EMA de 70 ciclos.Quando a EMA se torna negativa, indica que a tendência de médio prazo começa a enfraquecer, e é nesse momento que se deve considerar a saída, independentemente dos ganhos e perdas.
Este design é mais inteligente do que um stop loss fixo: pode ser mantido por mais tempo em uma forte tendência e pode ser retirado em tempo hábil quando a tendência se torna mais fraca. Este parâmetro não é um tapa-cabeça, mas o melhor equilíbrio encontrado entre manter a sensibilidade à tendência e reduzir o ruído.
O código oferece opções de stop loss (default off), stop loss de 1,5%, stop loss de 3,0%, e um risco/retorno de 1:2.A maioria das vezes, depende da própria lógica de entrada e saída da estratégia, e esses controles de proporção fixa são apenas o último seguro.。
Porque os mercados são dinâmicos, e um stop loss de proporção fixa tende a ser acionado nos momentos mais impróprios. O verdadeiro controle de risco deve ser baseado em mudanças na estrutura do mercado, e não em uma simples porcentagem de preço.
A estratégia não é universal.A melhor forma de se comportar em um mercado de volatilidade horizontal é durante o início de uma tendência e uma expansão de baixa para alta volatilidade.Se você achar que a sua estratégia não tem funcionado bem nos últimos tempos, é provável que o mercado esteja em uma fase inadequada.
Quando usar? Você pode se surpreender com o desempenho desta estratégia quando você observa o mercado começar a mudar de um estado de baixa volatilidade para um estado de alta volatilidade, ou quando uma tendência visível está apenas começando.
O limite de entrada de 100 pode ser ajustado de acordo com a taxa de flutuação do indicador: a variedade de alta flutuação pode ser ajustada para 120-150, a variedade de baixa flutuação pode ser reduzida para 80-90. O limite de saída de 30 é basicamente imóvel, que é o nível de regressão ao valor médio comprovado por uma grande quantidade de ressonâncias.
O comprimento EMA de 70 é um parâmetro crítico e não é recomendado para modificações arbitrárias. Se for necessário, lembre-se:Quanto mais curto, mais sensível, mas mais barulhento, quanto mais longo, mais liso, mas mais atrasado。
Não se trata de uma estratégia simples que se possa dominar de uma só vez, mas também não é um brinquedo acadêmico deliberadamente complicado. Cada componente tem uma razão de ser, cada parâmetro é testado em ação.
Importante aviso de risco: Qualquer estratégia tem o risco de perda, e a retrospectiva histórica não representa os ganhos futuros. O desempenho da estratégia pode variar significativamente quando o ambiente do mercado muda, o que requer rigoroso gerenciamento de risco e ajustes de monitoramento contínuos.
Se você está procurando por uma estrutura de estratégia capaz de oferecer uma maior taxa de vitória no início de uma tendência, a estratégia do Range Oscillator é uma estratégia que vale a pena que você investigue e teste. Mas lembre-se que entender é mais importante do que usar.
/*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)