Stochastic_with_Shade
Download scriptThis technical tool is a specialized momentum indicator designed to help traders visualize market trends and identify potential entry or exit points by analyzing price velocity. It builds upon the standard Stochastic Oscillator—a popular trading tool that compares a recent closing price to its range of highs and lows over a specific period—by adding sophisticated visual "shading" to make trend shifts easier to spot at a glance.
Core Logic and Functionality
1. Price Range Analysis The script begins by scanning historical price data to identify the highest and lowest points within specific look-back windows (defined by the K-Period). By identifying these extremes, the tool establishes a "boundaries" map of where the price has recently traded.
2. Calculation of Momentum (%K Line) The primary line of the indicator (the Main Buffer) is calculated by measuring the distance between the closing price and the lowest low, relative to the total range between the highest high and the lowest low. This result is converted into a percentage scale (0 to 100). Essentially, it tells you where the current price sits within its recent historical range:
- A high percentage suggests the price is near the top of its recent range (potentially overextended).
- A low percentage suggests the price is near the bottom of its recent range (potentially oversold).
3. Signal Smoothing To filter out market "noise" and minor fluctuations, the script calculates a secondary line called the Signal Line. This is achieved by taking a Simple Moving Average of the Main Buffer. When the Main Line moves above this Signal Line, it generally indicates upward momentum; when it moves below, it suggests downward momentum.
4. Visual Shading and Trend Tracking The unique feature of this specific script is its visual "Shade" logic. Instead of just showing two lines, it compares the position of the Main Buffer against the Signal Buffer in real-time to determine which value is currently dominant:
- Upward Bias: When the Main Line is positioned above the Signal Line, the script highlights the area based on that relationship, visually signaling a bullish lean.
- Downward Bias: When the Main Line drops below the Signal Line, the visual shading shifts to reflect a bearish lean.
Summary of User Experience
For a trader, this means you don't have to constantly guess which line is "winning." The script automates that comparison and provides a visual background/histogram effect. It allows you to see both the raw momentum of the market and the smoothed trend simultaneously, highlighting the transition points where price sentiment shifts from one direction to another.
//+------------------------------------------------------------------+
//| Stochastic_with_Shade.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
//| The shade is added by Serega Lykov |
//| http://mtexperts.narod.ru/ |
//+------------------------------------------------------------------+
#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 5
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_color3 Black // color of background
#property indicator_color4 LightSeaGreen
#property indicator_color5 Red
//---- input parameters
extern int KPeriod=5;
extern int DPeriod=3;
extern int Slowing=3;
//---- buffers
double MainBuffer[];
double SignalBuffer[];
double HighesBuffer[];
double LowesBuffer[];
double UpShadeBuffer[];
double DownShadeBuffer[];
double BackgroundBuffer[];
//----
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(7);
SetIndexBuffer(5,HighesBuffer);
SetIndexBuffer(6,LowesBuffer);
//---- indicator lines
SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2);
SetIndexBuffer(0,UpShadeBuffer);
SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2);
SetIndexBuffer(1,DownShadeBuffer);
SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,2);
SetIndexBuffer(2,BackgroundBuffer);
SetIndexStyle(3,DRAW_LINE);
SetIndexBuffer(3,MainBuffer);
SetIndexStyle(4,DRAW_LINE);
SetIndexBuffer(4,SignalBuffer);
//---- name for DataWindow and indicator subwindow label
short_name = "Sto(" + KPeriod + "," + DPeriod + "," + Slowing + ")";
IndicatorShortName(short_name);
SetIndexLabel(0,short_name);
SetIndexLabel(1,"Signal");
//----
draw_begin1 = KPeriod + Slowing;
draw_begin2 = draw_begin1 + DPeriod;
SetIndexDrawBegin(0,draw_begin1);
SetIndexDrawBegin(1,draw_begin2);
//----
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);
if(SignalBuffer[i] > MainBuffer[i])
{
UpShadeBuffer[i] = EMPTY_VALUE;
DownShadeBuffer[i] = SignalBuffer[i];
BackgroundBuffer[i] = MainBuffer[i];
}
else if(SignalBuffer[i] < MainBuffer[i])
{
UpShadeBuffer[i] = MainBuffer[i];
DownShadeBuffer[i] = EMPTY_VALUE;
BackgroundBuffer[i] = SignalBuffer[i];
}
else
{
UpShadeBuffer[i] = EMPTY_VALUE;
DownShadeBuffer[i] = EMPTY_VALUE;
BackgroundBuffer[i] = EMPTY_VALUE;
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments