Cybernetic Oscillator

Category: Indicators By: Iván González Created: October 1, 2025, 9:55 AM
October 1, 2025, 9:55 AM
Indicators
3 Comments
rms

The Cybernetic Oscillator is a zero-centered, energy-normalized momentum oscillator inspired by John Ehlers’ digital signal processing work. It combines a high-pass filter to remove drift, a 2nd-order Super Smoother to reduce noise, and RMS normalization so the amplitude remains comparable across markets and timeframes. The result is a responsive, clean oscillator that highlights direction changes and strength without being dominated by raw volatility.

Key Features at a Glance

  • Band-pass behavior: High-pass → Super Smoother low-pass chain isolates tradable swings.
  • RMS normalization: Divides by rolling RMS of the filtered signal to stabilize amplitude.
  • Zero-centered: Clear polarity around the 0-line for bias flips.
  • Threshold bands (±1 by default): Optional gating for “strong” moves.
  • Polarity coloring: Green above zero, red below, for instant read.

Intuition First: The Signal Pipeline

Price → remove trend with a 2nd-order High-Pass → reduce noise via 2nd-order Super Smoother → scale by RMS of recent energy → plot oscillator with zero line and ±thresholds.

  • The HP filter strips slow drift so momentum flips are timely.
  • The Super Smoother suppresses jitter without excessive lag.
  • RMS normalization keeps values consistent, making ±1 a meaningful, portable reference.

Formula Breakdown

  1. High-Pass (2nd order)
    • Frequency set by hpPeriod. Coefficients use expcos and π to emulate a digital HP.
    • Output: hp, removing low-frequency drift.
  2. Super Smoother (2nd order Low-Pass)
    • Frequency set by lpPeriod. Applied to the average of hp and hp[1] to reduce phase noise.
    • Output: lp, a smooth band-passed signal.
  3. RMS Normalization
    • Compute rolling RMS over rmsLen of lp².
    • Normalize: osc = lp / max(rms, ε) so amplitude ≈ 1 in steady conditions.
  4. Display & Thresholds
    • Plot osc, zero line, and optional ±threshold.
    • Dynamic color: green above zero, red below.

Inputs & Defaults

  • hpPeriod = 30
    Controls how aggressively drift is removed.

    • Shorter (15–25): faster bias flips, more whipsaws.
    • Longer (35–50): steadier bias, slower to turn.
  • lpPeriod = 20
    Governs smoothing of the high-pass output.

    • Shorter (10–16): snappier but noisier.
    • Longer (22–30): calmer but laggier.
  • rmsLen = 100
    Window for energy normalization.

    • Shorter (50–80): amplitude adapts quickly to volatility shifts.
    • Longer (120–200): more stable scaling across regimes.
  • threshold = 1
    Optional gating for “strong” moves.

    • Raise to 1.25–1.5 in choppy markets to reduce false positives.
    • Lower to 0.7–0.9 to be more permissive.

How to Read the Oscillator

  • Zero-line flips: Crossing above 0 suggests bullish momentum bias; below 0 suggests bearish.
  • Threshold zones: Moves beyond +threshold or below -threshold indicate stronger impulses.
  • Divergences: Price making new extremes while osc fails to confirm often precedes momentum fades.
  • Regime awareness: In strong trends, pullbacks may stall near the zero line; in ranges, price mean-reverts around zero more frequently.

Tip: Treat ±threshold as context, not absolute signals. Combine with trend/volatility filters.

Trading Playbooks (Examples, Not Advice)

  1. Momentum Flip
    • Entry: Bias flip through zero in trend direction (e.g., price above a slow MA, oscillator crosses > 0).
    • Exit: First loss of momentum back through zero or trail with ATR.
    • Use threshold: If the first push also clears +threshold, allow a wider stop; otherwise, be tighter.
  2. Pullback Continuation
    • Uptrend: After a dip above -threshold, look for osc to curl back up and cross zero.
    • Downtrend: Mirror logic with +threshold.
    • Idea: Avoid deeper counter-trend swings that pierce the opposite threshold.
  3. Range Mean-Reversion
    • In sideways regimes, fade moves that tag ±threshold when price is at range extremes.
    • Exit near the zero line or mid-range.

Risk management: Always define invalidation (e.g., ATR-based stops or swing points) and position sizing before entries.

Best Practices & Common Pitfalls

  • Don’t over-filter: Very long hpPeriod + lpPeriod can mute useful signals.
  • Keep RMS realistic: Too small rmsLen can inflate amplitude after brief shocks.
  • Mind regime shifts: Re-tune threshold when volatility regime changes.
  • Use confirmations: Pair zero-cross ideas with a simple regime filter (e.g., MA slope) and a volatility filter (e.g., ATR percentile) to decide whether to run momentum or mean-reversion playbooks.

Code (ProBuilder)

// ====================================================
//PRC_Cybernetic Oscillator (John Ehlers, TASC 2025)
//version = 0
//01.10.25
//Iván González @ www.prorealcode.com
//Sharing ProRealTime knowledge
// ====================================================
// ----- Parámetros
hpPeriod = 30       // Periodo filtro Highpass
lpPeriod = 20       // Periodo filtro Lowpass (Super Smoother)
rmsLen   = 100      // Longitud RMS
threshold = 1       // Umbral opcional
// ----- Constantes
pi = 3.1415926535
sqrt2 = 1.41421356237
src = close
// ====================================================
// Calculos
// ====================================================
if barindex>=4 then
// ----- High-Pass Filter (2nd order)
a0 = sqrt2 * pi / hpPeriod
a1 = EXP(-a0)
c2hp = 2*a1*COS(a0*180/pi)
c3hp = -(a1*a1)
c1hp = (1 + c2hp - c3hp) * 0.25
   
hp = 0
hp = c1hp * (src - 2*src[1] + src[2]) + c2hp*hp[1] + c3hp*hp[2]
   
// ----- Super Smoother (Low-Pass, 2nd order)
a0lp = sqrt2 * pi / lpPeriod
a1lp = EXP(-a0lp)
c2lp = 2*a1lp*COS(a0lp*180/pi)
c3lp = -(a1lp*a1lp)
c1lp = 1 - c2lp - c3lp
   
lp = 0
lp = c1lp * 0.5*(hp + hp[1]) + c2lp*lp[1] + c3lp*lp[2]
endif
// ====================================================
// RMS Normalization
// ====================================================
pow2 = lp*lp
rms = SQRT(Average[rmsLen](pow2))
epsilon = 0.000001
den = MAX(rms, epsilon)

osc = lp / den
// ====================================================
// Líneas de referencia
// ====================================================
zeroline = 0
upth = threshold
lowth = -threshold
if osc > 0 then
red=0
green=255
blue=0
else
red=255
green=0
blue=0
endif
// ====================================================
RETURN osc AS "Cybernetic Osc" coloured(red,green,blue)style(histogram),zeroline COLOURED(200,200,200) AS "0",upth COLOURED(150,150,150) AS "+Threshold",lowth COLOURED(150,150,150) AS "-Threshold"

Download
Filename: PRC_Cybernetic-Oscillator.itf
Downloads: 69
Iván González Master
As an architect of digital worlds, my own description remains a mystery. Think of me as an undeclared variable, existing somewhere in the code.
Author’s Profile

Comments

Logo Logo
Loading...