Dynamo Stochastic_v1
Download scriptThis tool is a specialized technical indicator designed to help traders understand the momentum and relative price position of a financial asset. It functions by analyzing past price movements to determine whether an asset is currently "overbought" or "oversold," providing a visual representation of where the price sits within its recent historical range.
Core Functionality
The script processes market data through several distinct layers of calculation to create a smoothed, readable output:
1. High and Low Identification The logic begins by scanning the price history over a specific set of time periods (defined by the user). It identifies the highest and lowest prices reached during those windows. These "peaks" and "valleys" form the foundation for all subsequent calculations.
2. The %K Main Value Using the identified highs and lows, the script calculates a percentage value. This represents where the current price is relative to its recent range. For example, if the price is trading very close to its recent high, this value will be near 100; if it is near its recent low, the value will be closer to 0. To ensure the data isn't too volatile or "jittery," the script applies a smoothing effect over these values.
3. The Signal Line The script then takes that smoothed main value and calculates a Simple Moving Average (SMA). This acts as a secondary trend line, filtering out minor market noise to show the broader direction of the momentum.
4. The "Dynamo" Calculation The final output displayed on your chart is a unique derivation called the "Dynamo." Instead of showing just the standard raw data, the logic combines the main value and the signal line relative to a center point (50). This creates a customized visual representation that highlights the interaction between current price momentum and the established trend.
How it appears on your chart
The indicator operates in a separate window below your main price chart, scaled from 0 to 100. It includes two primary reference levels:
- Upper Level (75): Generally indicates that the asset has moved significantly upward in a short period and may be reaching an "overbought" state.
- Lower Level (25): Generally indicates that the asset has moved significantly downward and may be reaching an "oversold" state.
By observing the interaction between the calculated lines and these levels, traders can better visualize price exhaustion and potential shifts in market direction.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| 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