sStochastic

Author: Copyright � 2004, MetaQuotes Software Corp.
sStochastic

This script is a specialized technical analysis tool designed for the MetaTrader platform. It functions as a Stochastic Oscillator, which is used by traders to identify potential overbought or oversold conditions in a financial market. Rather than looking at raw prices, this tool analyzes the relationship between recent price highs and lows to determine momentum.

Core Logic and Methodology

The script operates through a structured sequence of calculations to translate raw market data into visual signals:

1. Identification of Extremes The tool first scans a specific number of past candles (defined by the "KPeriod") to identify the highest price reached and the lowest price reached within that timeframe. By establishing these boundaries, the script creates a "range" for the current market period.

2. Momentum Calculation (%K Line) Once the highs and lows are identified, the script calculates the relative position of the current closing price within that range. It smooths this data over a set period (the "Slowing" parameter) to create the primary moving line (the Main Buffer). This represents the current strength of the market trend.

3. Signal Smoothing (Signal Line) To filter out minor market "noise" and prevent false signals, the script takes the primary momentum line and applies a Simple Moving Average (SMA). This results in a secondary, smoother line that helps traders see the broader direction of the momentum.

Automated Alerts and Trading Logic

Beyond just displaying lines on a chart, this specific script includes an automated logic system designed to notify the user of potential trade entries:

  • The "Buy" Condition: The script monitors the primary momentum line. If the value drops below a certain threshold (30) and then begins to turn upward, the tool recognizes this as a potential area where the market may be "oversold." When this occurs, it triggers an automated alert notifying the user of a "BUY" opportunity.
  • The "Sell" Condition: Conversely, if the momentum line rises above a specific threshold (70) and begins to turn downward, the tool identifies a potential "overbought" condition. It then triggers an alert notifying the user of a "SELL" opportunity.

User Experience Summary

For the end-user, this script automates the heavy lifting of watching price fluctuations. Instead of manually checking if the market is moving too fast in one direction or if it has dipped too low, the script continuously monitors these mathematical boundaries and provides real-time notifications (Alerts) when the data suggests a reversal in momentum might be occurring.

Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
13 Views
0 Downloads
0 Favorites
sStochastic
//+------------------------------------------------------------------+
//|                                                  sStochastic.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 2
#property indicator_color1 LightSeaGreen
#property indicator_color2 Red
//---- input parameters
extern int KPeriod = 5;
extern int DPeriod = 3;
extern int Slowing = 3;
//---- buffers
double MainBuffer[];
double SignalBuffer[];
double HighesBuffer[];
double LowesBuffer[];
//----
int draw_begin1 = 0;
int draw_begin2 = 0;
//---- Íîìåð áàðà, ïî êîòîðîìó áóäåò èñêàòüñÿ ñèãíàë
#define SIGNAL_BAR 1
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- 2 additional buffers are used for counting.
   IndicatorBuffers(4);
   SetIndexBuffer(2, HighesBuffer);
   SetIndexBuffer(3, LowesBuffer);
//---- indicator lines
   SetIndexStyle(0, DRAW_LINE);
   SetIndexBuffer(0, MainBuffer);
   SetIndexStyle(1, DRAW_LINE);
   SetIndexBuffer(1, SignalBuffer);
//---- name for DataWindow and indicator subwindow label
   short_name="sSto(" + 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);
//---- Ñòàòè÷åñêèå ïåðåìåííûå, â êîòîðûõ õðàíÿòñÿ
//---- âðåìÿ ïîñëåäíåãî áàðà è íàïðàâëåíèå ïîñëåäíåãî ñèãíàëà
	  static int PrevSignal = 0, PrevTime = 0;
//---- Åñëè áàðîì äëÿ àíàëèçà âûáðàí íå 0-é, íàì íåò ñìûñëà ïðîâåðÿòü ñèãíàë
//---- íåñêîëüêî ðàç. Åñëè íå íà÷àëñÿ íîâûé áàð, âûõîäèì.
	  if(SIGNAL_BAR > 0 && Time[0] <= PrevTime) 
	      return(0);
//---- Îòìå÷àåì, ÷òî ýòîò áàð ïðîâåðåí
	  PrevTime = Time[0];
//---- Åñëè ïðåäûäóùèé ñèãíàë áûë ÑÅËË èëè ýòî ïåðâûé çàïóñê (PrevSignal=0)
	  if(PrevSignal <= 0)
	    {
		     if(MainBuffer[SIGNAL_BAR] - 30.0 > 0 && 30.0 - MainBuffer[SIGNAL_BAR+1] >= 0)
		       {
			        PrevSignal = 1;
			        Alert("sStochastic (", Symbol(), ", ", Period(), ")  -  BUY!!!");
		       }
	    }
	  if(PrevSignal >= 0)
	    {
		     if(70.0 - MainBuffer[SIGNAL_BAR] > 0 && MainBuffer[SIGNAL_BAR+1] - 70.0 >= 0)
		       {
			        PrevSignal = -1;
			        Alert("sStochastic (", Symbol(), ", ", Period(), ")  -  SELL!!!");
		       }
	    }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments