The Doda-Stochastic is a specialized technical analysis indicator designed to help traders identify potential entry and exit points by analyzing price momentum and relative positioning. Unlike standard oscillators that may provide "noisy" signals, this script uses a multi-layered smoothing approach to filter out market fluctuations and highlight significant trends.
Core Logic Overview
The indicator operates through three distinct stages of data processing:
1. Primary Momentum Calculation The script first identifies the highest high and lowest low over a specific recent period. It calculates where the current price sits relative to this range, creating a percentage value. This represents the "raw" momentum of the asset.
2. Smoothing and Stabilization To prevent the indicator from jumping erratically with every minor price tick, the script applies a smoothing formula (similar to a Moving Average). This process stabilizes the raw momentum data into a continuous line, making it easier to visualize the underlying trend rather than just the immediate noise.
3. Signal Refinement and Cross-Overs The logic then performs a secondary and tertiary layer of calculation. It takes the smoothed momentum and runs it through additional smoothing cycles. The goal of this multi-step refinement is to create two distinct "lines" on your chart:
- A primary signal line representing current smoothed price action.
- A secondary signal line acting as a trigger or "slow" moving average.
Trade Signal Logic
The script identifies opportunities by looking for specific interactions between these smoothed lines and established boundaries:
- Buy Signals: The indicator looks for the primary momentum to drop into the "oversold" territory (typically below the 20 level). If the momentum line stays above its secondary signal line while deep in this zone, it suggests that the downward pressure is exhausting and a move upward may be imminent.
- Sell Signals: Conversely, when both lines climb into the "overbought" territory (above the 80 level), the script identifies that the asset may be overextended. It signals a potential reversal or price drop when the primary line interacts with its secondary signal line at these high levels.
User Experience
The script is designed to be proactive. Instead of requiring the trader to constantly watch the lines for tiny intersections, it features an automated alert system. When the specific mathematical conditions for a "Buy" or "Sell" are met based on the smoothing logic described above, the system generates a real-time notification on the trading platform.
#include <stdlib.mqh>
//+------------------------------------------------------------------+
//| Doda-Stochastic.mq4 |
//| Copyright © 2010, Gopal Krishan Doda |
//| http://www.DodaCharts.com |
//| http://www.InvestmentKit.com |
//|This is version 1.0 of Doda-Stochastic indicator |
//|Last Modified on 08-Mar-2011 |
//| I'm not the original coder. Just modified for screen alert. |
//+------------------------------------------------------------------+
// This was converted using YouSky's MT3 to MT4 translator. I cannot take credit for the code.//
#property indicator_separate_window
#property indicator_minimum 0.00
#property indicator_maximum 100.00
#property indicator_color1 Lime
#property indicator_buffers 2
#property indicator_color2 Red
#property indicator_level1 20
#property indicator_level2 80
//+------------------------------------------------------------------+
//| Common External variables |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| External variables |
//+------------------------------------------------------------------+
extern double Slw = 8;
extern double Pds = 13;
extern double Slwsignal = 9;
extern int Barcount = 2000;
//+------------------------------------------------------------------+
//| Special Convertion Functions |
//+------------------------------------------------------------------+
int LastTradeTime;
double ExtHistoBuffer[];
double ExtHistoBuffer2[];
bool BuyAlert=false, SellAlert=false;
void SetLoopCount(int loops)
{
}
void SetIndexValue(int shift, double value)
{
ExtHistoBuffer[shift] = value;
// Print ("ExtHistoBuffer :" ,value); // green
}
void SetIndexValue2(int shift, double value)
{
ExtHistoBuffer2[shift] = value;
// Print ("ExtHistoBuffer2 :" ,value); // green
}
double GetIndexValue(int shift)
{
return(ExtHistoBuffer[shift]);
}
double GetIndexValue2(int shift)
{
return(ExtHistoBuffer2[shift]);
}
//+------------------------------------------------------------------+
//| End |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Initialization |
//+------------------------------------------------------------------+
int init()
{
SetIndexStyle(0, DRAW_LINE, STYLE_SOLID);
SetIndexBuffer(0, ExtHistoBuffer);
SetIndexStyle(1, DRAW_LINE, STYLE_SOLID);
SetIndexBuffer(1, ExtHistoBuffer2);
return(0);
}
int start()
{
//+------------------------------------------------------------------+
//| Local variables |
//+------------------------------------------------------------------+
double AA = 0;
double bb = 0;
double aa1 = 0;
double cnt1 = 0;
int shift = 0;
double cnt = 0;
double loopbegin = 0;
double loopbegin2 = 0;
double loopbegin3 = 0;
bool first = True;
double prevbars = 0;
double sum = 0;
double smconst = 0;
double smconst1 = 0;
double prev = 0;
double prev1 = 0;
double prev2 = 0;
double prev3 = 0;
double weight = 0;
double linear = 0;
double MAValue = 0;
double MAValue2 = 0;
double mavalue3 = 0;
string MAstring = "";
double MyHigh = 0;
double MyLow = 0;
int counter = 0;
double Price = 0;
double Price1 = 0;
double tmpDevAA = 0;
SetLoopCount(0);
smconst = 2 / (1+Slw);
smconst1 = 2 / (1+Slwsignal);
loopbegin = loopbegin+1;
for(shift =Barcount;shift >=0 ;shift --)
{
prev = GetIndexValue2(shift+1);
// Yousky 15/05/2006 - Change to avoid Zero divide exception.
AA = 0;
tmpDevAA = (High[Highest(NULL, 0, MODE_HIGH,shift+Pds,Pds)] - Low[Lowest(NULL, 0, MODE_LOW,shift+Pds,Pds)]);
if (tmpDevAA != 0)
AA = 100* ((Close[shift] - Low[Lowest(NULL, 0, MODE_LOW,shift+Pds,Pds)]) / tmpDevAA);
// ---
MAValue2 = smconst * (AA-prev) + prev;
SetIndexValue2(shift,MAValue2);
loopbegin = loopbegin-1;
}
loopbegin2 = loopbegin2+1;
for(shift =Barcount-Pds;shift >=0 ;shift --){
MyHigh = -999999;
MyLow = 99999999;
for(counter =shift;counter <=Pds + shift ;counter ++){
Price= GetIndexValue2(counter);
if( Price > MyHigh )
MyHigh = Price;
if( Pds <= 0 )
MyHigh = Price;
if( Price < MyLow )
MyLow = Price;
if( Pds <= 0 )
MyLow = Price;
}
prev1 = GetIndexValue(shift+1);
aa1=GetIndexValue2(shift);
// Yousky 15/05/2006 - Change to avoid Zero divide exception.
bb= 0;
if ((MyHigh-MyLow) != 0)
bb=100*(aa1-MyLow)/(MyHigh-MyLow);
// ---
MAValue = smconst * (bb-prev1) + prev1;
SetIndexValue(shift,MAValue);
loopbegin2 = loopbegin2-1;
}
//Print (MAValue); // green
loopbegin3 = loopbegin3+1;
for(shift =Barcount;shift >=0 ;shift --){
prev2=GetIndexValue2(shift+1);
prev3=GetIndexValue(shift);
mavalue3= smconst1 * (prev3-prev2) +prev2;
SetIndexValue2(shift,mavalue3);
loopbegin3 = loopbegin3-1;
}
if(ExtHistoBuffer[0] > ExtHistoBuffer2[0] && ExtHistoBuffer[0]<20.1 && ExtHistoBuffer2[0] < 20.1 && BuyAlert==False)
{
Alert ("Doda-Stochastic says Buy ",Symbol()," at ",Close[0]);
BuyAlert = True;
SellAlert = False;
}
if(ExtHistoBuffer2[0] > ExtHistoBuffer[0] && ExtHistoBuffer[0]>80.1 && ExtHistoBuffer2[0] > 80.1 && SellAlert==False)
{
// sell signal
Alert ("Doda-Stochastic says Sell ",Symbol()," at ",Close[0]);
BuyAlert = false;
SellAlert = True;
}
}
Comments