StochasticCyberCycle

Download script
Author: Coded by Witold Wozniak
StochasticCyberCycle

The Stochastic Cyber Cycle is a sophisticated technical analysis tool designed to identify underlying cycles and momentum shifts within financial markets. Unlike standard oscillators that simply track price velocity, this indicator utilizes advanced cybernetic principles—specifically those derived from the work of John F. Ehlers—to filter out market "noise" and highlight significant cyclical movements.

How the Logic Works

The script processes market data through a multi-stage mathematical pipeline to transform raw price action into actionable visual signals:

1. Price Averaging and Smoothing The logic begins by calculating the midpoint of each price bar (the average of the high and low). It then applies a specific smoothing formula to this data. This step is crucial because it removes minor, erratic price fluctuations, allowing the indicator to focus on the "true" trend rather than temporary volatility.

2. Cyclical Analysis Once the data is smoothed, the algorithm calculates a "Cycle." It uses a recursive mathematical structure that looks back at previous data points to determine the current phase of the market cycle. This involves a balancing act between current price momentum and historical cycles, adjusted by a sensitivity factor (Alpha). This allows the indicator to recognize when a market is moving in a repetitive wave.

3. Stochastic Normalization To make the cyclical data easier to read, the script converts it into a normalized percentage scale. It identifies the highest highs and lowest lows over a specific look-back period (Length). By comparing the current cycle position against these extremes, it creates a value that fluctuates within a defined range.

4. Final Smoothing and Triggering The final result is passed through a weighted moving average to produce two distinct visual components:

  • The Main Line (Stochastic Cyber Cycle): A smoothed representation of the current cyclical position. This line shows the overall strength and direction of the market cycle.
  • The Trigger Line: A secondary, faster-responding line derived from the main cycle.

Summary for Traders

By watching the interaction between the main cycle line and the trigger line, traders can attempt to identify points of exhaustion or momentum shifts. Because the logic is rooted in cybernetics, it is specifically designed to identify repeating patterns in time-series data, making it a specialized tool for identifying cyclical trends that may not be obvious using standard price action alone.

Miscellaneous
Implements a curve of type %1
13 Views
0 Downloads
0 Favorites
StochasticCyberCycle
//+------------------------------------------------------------------+
//|                                         StochasticCyberCycle.mq4 |
//|                                                                  |
//| Stochastic Cyber Cycle                                           |
//|                                                                  |
//| Algorithm taken from book                                        |
//|     "Cybernetics Analysis for Stock and Futures"                 |
//| by John F. Ehlers                                                |
//|                                                                  |
//|                                              contact@mqlsoft.com |
//|                                          http://www.mqlsoft.com/ |
//+------------------------------------------------------------------+
#property copyright "Coded by Witold Wozniak"
#property link      "www.mqlsoft.com"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue

#property indicator_level1 0
#property indicator_minimum -1
#property indicator_maximum 1

double StocCC[];
double Trigger[];
double Smooth[];
double Cycle[];
double Value1[];

extern double Alpha = 0.07;
extern int Length = 8;
int buffers = 0;
int drawBegin = 0;

int init() {
    drawBegin = Length;
    initBuffer(StocCC, "Stochastic Cyber Cycle", DRAW_LINE);
    initBuffer(Trigger, "Trigger", DRAW_LINE);
    initBuffer(Smooth);
    initBuffer(Cycle);
    initBuffer(Value1);
    IndicatorBuffers(buffers);
    IndicatorShortName("Stochastic Cyber Cycle [" + DoubleToStr(Alpha, 2) + ", " + Length + "]");
    return (0);
}

int start() {
    if (Bars <= drawBegin) return (0);
    int countedBars = IndicatorCounted();
    if (countedBars < 0) return (-1);
    if (countedBars > 0) countedBars--;
    int s, limit = Bars - countedBars - 1;
    for (s = limit; s >= 0; s--) {
        Smooth[s] = (P(s) + 2.0 * P(s + 1) + 2.0 * P(s + 2) + P(s + 3)) / 6.0;
        Cycle[s] = (1.0 - 0.5 * Alpha) * (1.0 - 0.5 * Alpha) * (Smooth[s] - 2.0 * Smooth[s + 1] + Smooth[s + 2])
            + 2.0 * (1.0 - Alpha) * Cycle[s + 1]
            - (1.0 - Alpha) * (1.0 - Alpha) * Cycle[s + 2];
        if (s > Bars - 8) {
            Cycle[s] = (P(s) - 2.0 * P(s + 1) + P(s + 2)) / 4.0;
        }
        double hh = Cycle[s], ll = Cycle[s];
        for (int i = 0; i < Length; i++) {
            double tmp = Cycle[s + i];
            hh = MathMax(hh, tmp);
            ll = MathMin(ll, tmp);
        }
        Value1[s] = 0.0;
        if (hh != ll) {
            Value1[s] = (Cycle[s] - ll) / (hh - ll);
        }
        StocCC[s] = (4.0 * Value1[s] + 3.0 * Value1[s + 1] + 2.0 * Value1[s + 2] + Value1[s + 3]) / 10.0;
        StocCC[s] = 2.0 * (StocCC[s] - 0.5);
        Trigger[s] = 0.96 * (StocCC[s + 1] + 0.02);
    }
    return (0);   
}

double P(int index) {
    return ((High[index] + Low[index]) / 2.0);
}

void initBuffer(double array[], string label = "", int type = DRAW_NONE, int arrow = 0, int style = EMPTY, int width = EMPTY, color clr = CLR_NONE) {
    SetIndexBuffer(buffers, array);
    SetIndexLabel(buffers, label);
    SetIndexEmptyValue(buffers, EMPTY_VALUE);
    SetIndexDrawBegin(buffers, drawBegin);
    SetIndexShift(buffers, 0);
    SetIndexStyle(buffers, type, style, width);
    SetIndexArrow(buffers, arrow);
    buffers++;
}

Comments