The Stochastic Chaikin's Volatility is a custom technical analysis tool designed to help traders identify momentum and potential reversal points by focusing on price fluctuations. Instead of looking at the raw price of an asset (like a stock or currency), this indicator measures the "stretch" or volatility of the market over specific periods.
How the Logic Works
The script processes market data through three primary stages to arrive at its final visual output:
1. Measuring Price Range First, the tool looks at each individual candle to determine the distance between the highest and lowest price points (the "High" and the "Low"). This represents the immediate volatility of the market at that specific moment.
2. Smoothing the Volatility (The Chaikin Component) Rather than looking at one single candle in isolation, the script applies a smoothing calculation to these price ranges. It uses an Exponential Moving Average (EMA) to bridge these gaps, creating a more stable and continuous flow of data. This helps filter out "market noise"—the tiny, insignificant price flickers that can often mislead traders.
3. The Stochastic Conversion The final stage takes that smoothed volatility and converts it into a percentage-based oscillator. It looks back over a set timeframe to identify the highest and lowest volatility peaks reached during that period. By comparing the current volatility level to these highs and lows, the script generates two main lines:
- The Main Line: This shows where the current volatility sits relative to its recent range (scaled from 0 to 100).
- The Trigger Line: This acts as a slight delay or "signal" line based on the previous period's data.
How to Interpret the Results
Because this tool operates on a scale of 0 to 100, it provides clear visual boundaries for traders:
- Overbought/Oversold Zones: When the lines reach the upper levels (near 80), it suggests that volatility has stretched significantly upward. When they drop toward the lower levels (near 20), it suggests a significant downward stretch in volatility.
- Momentum Shifts: Traders typically look for the "Main Line" to cross the "Trigger Line." These crossings, combined with the lines moving into extreme zones, can serve as signals that the market's current trend is losing steam and may be preparing for a change in direction.
//+------------------------------------------------------------------+
//| Stochastic Chaikin's Volatility.mq4 |
//| Giaras |
//| giampiero.raschetti@gmail.com |
//+------------------------------------------------------------------+
#property copyright "giaras"
#property link "giampiero.raschetti@gmail.com"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_level1 0
#property indicator_level2 80
#property indicator_level3 20
#property indicator_minimum 0
#property indicator_maximum 100
//---- input parameters
//extern int iPeriod=5;
extern int maPeriod=10;
extern int StocLength = 5;
extern int WMALength = 5;
//---- buffers
double chakin[];
double StocChakin[];
double Trigger[];
double Value3[];
double hl[];
double emahl[];
int buffers = 0;
int drawBegin = 0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
drawBegin = 4;
//---- indicators
initBuffer(StocChakin, "Stochastic Chakin", DRAW_LINE);
initBuffer(Trigger, "Trigger", DRAW_LINE);
initBuffer(hl);
initBuffer(emahl);
initBuffer(chakin);
initBuffer(Value3);
IndicatorBuffers(buffers);
IndicatorShortName("Stochastic Chakin Volatility[" + maPeriod + ", " + StocLength + ", " + WMALength + "]");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
if (Bars <= drawBegin) return (0);
int counted_bars=IndicatorCounted();
if(counted_bars<0) return (-1);
if(counted_bars>0) counted_bars--;
int limit=Bars-counted_bars-1;
//----
for(int c = 0 ;c <= limit ;c++)
hl[c]=High[c]-Low[c];
//for(int e = 0 ;e <= limit ;e++)
//{
// emahl[e]= iMAOnArray(hl,0,maPeriod,0,MODE_EMA,e);
//}
//for(int i = 0 ;i <= limit-iPeriod ;i++)
for(int i = 0 ;i <= limit ;i++)
{
//chakin[i] = ( (emahl[i]-emahl[i+iPeriod])/emahl[i+iPeriod] )*100;
//chakin[i] = ( (emahl[i]-emahl[i+iPeriod]) );
chakin[i] = iMAOnArray(hl,0,maPeriod,0,MODE_EMA,i);
}
for (int s = limit; s >= 0; s--) {
double _chakin = chakin[s];
double hh = _chakin, ll = _chakin;
for (i = 0; i < StocLength; i++) {
double tmp = chakin[s + i];
hh = MathMax(hh, tmp);
ll = MathMin(ll, tmp);
}
double Value1 = _chakin - ll;
double Value2 = hh - ll;
Value3[s] = 0.0;
if (Value2 != 0.0) {
Value3[s] = Value1 / Value2;
}
}
for (s = limit - 1; s >= 0; s--) {
//StocChakin[s] = 2.0 * (iMAOnArray(Value3, 0, WMALength, 0, MODE_LWMA, s) - 0.5);
StocChakin[s] = 100 * iMAOnArray(Value3, 0, WMALength, 0, MODE_LWMA, s);
Trigger[s] = StocChakin[s + 1];
}
return(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