cci_AdaptiveCyberCycle00test02

Download script
Author: Coded by Witold Wozniak
cci_AdaptiveCyberCycle00test02

This script is a specialized technical analysis tool designed to help traders identify cyclical patterns in financial markets. Based on the principles of cybernetics and market cycle theory, it aims to filter out market "noise" to reveal the underlying rhythmic movements of price action.

Core Logic & Methodology

The tool operates by processing three distinct layers of data to provide a clearer picture of market momentum:

1. Price Smoothing Instead of reacting to every minor fluctuation in the high and low prices, the script first calculates a weighted average. By looking at a window of recent price data (specifically focusing on a mix of current and preceding price points), it creates a "smoothed" baseline. This helps stabilize the data so that the final output isn't overly jumpy or erratic.

2. Dynamic Period Detection (The "Adaptive" Component) One of the most sophisticated features of this script is its ability to change its own sensitivity based on market conditions. Rather than using a fixed timeframe (which can fail if the market speed changes), it utilizes an adaptive algorithm to determine the current cycle period.

  • When the market moves in a specific rhythm, the script calculates that duration automatically.
  • It then feeds this dynamic period into a Commodity Channel Index (CCI) calculation, allowing the tool to "stretch" or "shrink" its perspective depending on how fast the market is currently cycling.

3. Cycle Tracking and Triggers The final output is divided into two main components displayed in a separate window:

  • The Cycle Line: This represents the calculated rhythmic movement of the price. It shows the current momentum relative to the smoothed average, adjusted for the detected cycle period.
  • The Trigger Line: This serves as a delayed signal based on the previous state of the cycle. By comparing the current cycle value to its immediate predecessor, it helps traders identify specific turning points or shifts in momentum.

How It Visualizes Data

The indicator provides visual boundaries (levels at 100 and -100) to help users identify overextended conditions. The primary objective is to provide a clear, readable line that reflects the "heartbeat" of the market, making it easier to spot when a trend is reaching its peak or trough relative to its historical cycle.

Indicators Used
Commodity channel index
Miscellaneous
Implements a curve of type %1
11 Views
0 Downloads
0 Favorites
cci_AdaptiveCyberCycle00test02
//+------------------------------------------------------------------+
//|                                           AdaptiveCyberCycle.mq4 |
//|                                                                  |
//| Adaptive Cyber Cycle                                             |
//|                                                                  |
//| Algorithm taken from book                                        |
//|     "Cybernetics Analysis for Stock and Futures"                 |
//| by John F. Ehlers                                                |
//|                                                                  |
//|                                              contact@mqlsoft.com |
//|                                          http://www.mqlsoft.com/ |
//+------------------------------------------------------------------+
//mod cci
#property copyright "Coded by Witold Wozniak"
#property link      "www.mqlsoft.com"

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

#property indicator_level1     100
#property indicator_level2     -100
#property indicator_levelcolor DarkSlateGray

double Cycle[];
double Trigger[];
double Smooth[];

//extern int CCI_Period      = 14;
extern int CCI_Price       = 5;

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

int init() {
    drawBegin = 8;      
    initBuffer(Trigger, "Trigger", DRAW_LINE);
    initBuffer(Cycle, "Cycle", DRAW_LINE);
    initBuffer(Smooth);
    IndicatorBuffers(buffers);
    IndicatorShortName("cci  Adaptive Cyber Cycle  [" + DoubleToStr(Alpha, 2) + "]");
    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;
        double period = iCustom(0, 0, "CyclePeriod", Alpha, 0, s);
//        double alpha1 = 2.0 / (period + 1.0);
        Cycle[s] = iCCI(NULL,0,period,CCI_Price,s);           
        if (s > Bars - 8) {
            Cycle[s] = (P(s) - 2.0 * P(s + 1) + P(s + 2)) / 4.0;
        }
        Trigger[s] = Cycle[s + 1];
    }
    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