Author: Copyright � 2004, MetaQuotes Software Corp.
Stomach

This script is a financial analysis tool designed to help traders identify momentum and potential price reversals by measuring the relationship between recent price highs and lows. It essentially creates a visual representation of "overbought" or "oversold" conditions, smoothed out to make it easier for a human observer to read.

Core Functional Logic

The script operates through four distinct stages of data processing:

1. Identifying Price Extremes The tool first looks back at a specific number of previous candles (defined by the K-Period) to find the highest and lowest price points reached during that timeframe. By establishing these boundaries, the script creates a "trading range" for the period.

2. Calculating Momentum (%K Line) Once the high and low boundaries are set, the script calculates where the current price is sitting relative to those extremes. It measures the distance between the current closing prices and the lowest points, comparing them to the total distance of the trading range. This result is converted into a percentage (0 to 100). A high percentage suggests the price is near the top of its recent range (potentially overbought), while a low percentage suggests it is near the bottom (potentially oversold).

3. Smoothing the Data (Signal Line) Raw momentum data can be very "noisy" and jump around erratically, which can lead to false signals. To fix this, the script applies a "Signal Line." This is calculated by taking a simple moving average of the momentum values. It acts as a secondary guide that follows the main movement but with less volatility, allowing traders to see the broader trend of the momentum.

4. Advanced Moving Average Overlay In addition to the standard signal line, this specific version of the script includes an extra layer of analysis: a secondary moving average. This provides an even smoother interpretation of the momentum data. By comparing these different averages against each other, users can more clearly distinguish between a temporary price fluctuation and a significant shift in market direction.

Visual Representation

The script generates three distinct lines on your chart:

  • The Main Line: The primary momentum indicator showing current price positioning.
  • The Signal Line: A dotted line that smooths out the main movement to highlight trends.
  • The MA Line: An additional smoothed average that helps filter out market noise for a cleaner analytical view.
Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
12 Views
0 Downloads
0 Favorites
Stomach
//+------------------------------------------------------------------+
//|                                                   Stochastic.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//|                         modified: Moving Average of Stoch added  |
//|                                                  by: Bh Jul 2006 |
//+------------------------------------------------------------------+
#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 3
#property indicator_color1 Gold
#property indicator_color2 MediumTurquoise
#property indicator_color3 Red

//---- input parameters
extern int KPeriod=10;
extern int DPeriod=5;
extern int Slowing=5;
extern int MA_Period=13;
extern int MA_method=1;
//---- buffers
double MainBuffer[];
double SignalBuffer[];
double HighesBuffer[];
double LowesBuffer[];
double MABuffer[];
//----
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(3, HighesBuffer);
   SetIndexBuffer(4, LowesBuffer);
//---- indicator lines
   SetIndexStyle(1,DRAW_LINE,STYLE_SOLID, 2);
   SetIndexBuffer(1, MainBuffer); //Main Stoch
   SetIndexStyle(2,DRAW_LINE, STYLE_DOT, 1);
   SetIndexBuffer(2, SignalBuffer); //Signal Stoch
   SetIndexStyle(0,DRAW_LINE, STYLE_SOLID, 2);
   SetIndexBuffer(0, MABuffer); //MA   
//---- name for DataWindow and indicator subwindow label
   short_name="StoMAch: MA("+MA_Period+")  Stoch("+KPeriod+","+DPeriod+","+Slowing+")" ;
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
   SetIndexLabel(1,short_name);
   SetIndexLabel(2,"Signal");
//----
   draw_begin1=KPeriod+Slowing;
   draw_begin2=draw_begin1+DPeriod;
   SetIndexDrawBegin(0,0);
   SetIndexDrawBegin(1,draw_begin1);
   SetIndexDrawBegin(2,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);
      MABuffer[i]=iMAOnArray(MainBuffer,Bars,MA_Period,0,MA_method,i);
     }          
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments