Dynamo Stochastic
Download scriptThis script functions as a custom technical analysis tool designed to help traders identify momentum and potential price reversals by measuring where the current market price sits relative to its recent historical range.
Core Functionality
The logic operates by constantly scanning recent price action to determine "extremes"—specifically, the highest highs and lowest lows over a set number of candles (periods). By identifying these boundaries, the tool creates a percentage-based oscillator that fluctuates between 0 and 100.
How the Calculation Works
The script processes data through several distinct layers to generate its visual output:
- High and Low Tracking: The tool first isolates the highest and lowest prices over a specific window of time. This establishes the "ceiling" and "floor" for the price action in that period.
- The %K Line (Main Value): It calculates the relationship between the current closing price and the range established by the highs and lows. If the price is near the top of the recent range, the value moves toward 100; if it is near the bottom, it moves toward 0. A "slowing" mechanism is applied here to smooth out minor fluctuations, ensuring the data remains readable rather than jagged.
- The Signal Line: The script takes the primary calculated value and applies a Simple Moving Average (SMA) to it. This acts as a secondary smoothing layer, helping traders see the broader trend of the momentum rather than just instant movements.
- The "Dynamo" Calculation: Finally, the script performs a unique calculation to create its primary visual line. It takes the difference between the main value and the signal line, centers it around a midpoint of 50, and adjusts it to provide a distinct visual representation of momentum strength.
Visual Indicators
The tool provides clear visual benchmarks to assist with decision-making:
- Overbought/Oversold Levels: It features built-in horizontal levels at 75 and 25. When the momentum pushes toward these extremes, it suggests the market may be reaching a point of exhaustion.
- Momentum Dynamics: By comparing the main calculation against the signal line, the tool helps users visualize whether the current price strength is accelerating, decelerating, or stabilizing.
//+------------------------------------------------------------------+
//| Stochastic.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/"
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 1
#property indicator_color1 LightSeaGreen
#property indicator_level1 75
#property indicator_level2 25
//#property indicator_color2 Red
//---- input parameters
extern int KPeriod=5;
extern int DPeriod=3;
extern int Slowing=3;
//---- buffers
double ind_buffer1[];
double MainBuffer[];
double SignalBuffer[];
double HighesBuffer[];
double LowesBuffer[];
//----
int draw_begin1=0;
int draw_begin2=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//---- 2 additional buffers are used for counting.
IndicatorBuffers(5);
SetIndexBuffer(1, MainBuffer);
SetIndexBuffer(2, SignalBuffer);
SetIndexBuffer(3, HighesBuffer);
SetIndexBuffer(4, LowesBuffer);
//---- indicator lines
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0, ind_buffer1);
//---- name for DataWindow and indicator subwindow label
short_name="Dynamo Sto("+KPeriod+","+DPeriod+","+Slowing+")";
IndicatorShortName(short_name);
SetIndexLabel(0,short_name);
//----
draw_begin1=KPeriod+Slowing;
draw_begin2=draw_begin1+DPeriod;
SetIndexDrawBegin(0,draw_begin1);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Stochastic oscillator |
//+------------------------------------------------------------------+
int start()
{
int i,k;
int counted_bars=IndicatorCounted();
double price;
//----
if(Bars<=draw_begin2) return(0);
//---- initial zero
if(counted_bars<1)
{
for(i=1;i<=draw_begin1;i++) MainBuffer[Bars-i]=0;
for(i=1;i<=draw_begin2;i++) SignalBuffer[Bars-i]=0;
}
//---- minimums counting
i=Bars-KPeriod;
if(counted_bars>KPeriod) i=Bars-counted_bars-1;
while(i>=0)
{
double min=1000000;
k=i+KPeriod-1;
while(k>=i)
{
price=Low[k];
if(min>price) min=price;
k--;
}
LowesBuffer[i]=min;
i--;
}
//---- maximums counting
i=Bars-KPeriod;
if(counted_bars>KPeriod) i=Bars-counted_bars-1;
while(i>=0)
{
double max=-1000000;
k=i+KPeriod-1;
while(k>=i)
{
price=High[k];
if(max<price) max=price;
k--;
}
HighesBuffer[i]=max;
i--;
}
//---- %K line
i=Bars-draw_begin1;
if(counted_bars>draw_begin1) i=Bars-counted_bars-1;
while(i>=0)
{
double sumlow=0.0;
double sumhigh=0.0;
for(k=(i+Slowing-1);k>=i;k--)
{
sumlow+=Close[k]-LowesBuffer[k];
sumhigh+=HighesBuffer[k]-LowesBuffer[k];
}
if(sumhigh==0.0) MainBuffer[i]=100.0;
else MainBuffer[i]=sumlow/sumhigh*100;
i--;
}
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
int limit=Bars-counted_bars;
//---- signal line is simple movimg average
for(i=0; i<limit; i++)
SignalBuffer[i]=iMAOnArray(MainBuffer,Bars,DPeriod,0,MODE_SMA,i);
//---- Dynamo of %K
for(i=0; i<limit; i++)
ind_buffer1[i]=50-SignalBuffer[i]+MainBuffer[i];
//----
return(0);
}
//+------------------------------------------------------------------+
Comments