Better_M5_diff

Author: Copyright � 2007, MetaQuotes Software Corp.
Better_M5_diff

This script is designed as a technical analysis tool for the MetaTrader platform. Its primary purpose is to calculate and visualize specific differences between multiple Moving Averages (MA) to help traders identify trends or momentum shifts.

Core Functionality

The script operates by analyzing price data across different timeframes. Instead of simply showing you a standard moving average line, it calculates the "spread" or distance between three distinct moving averages:

  • A short-term average (5 periods)
  • A medium-term average (10 periods)
  • A long-term average (15 periods)

How the Logic Works

The script processes data in a loop, looking back over a set number of historical bars. For every point on the chart, it performs the following steps:

  1. Time Synchronization: It identifies the correct corresponding candle on a 5-minute timeframe based on the current chart's time.
  2. Data Gathering: It retrieves the closing prices for three different moving averages (5, 10, and 15 periods) at three specific points in time:
    • The current candle.
    • The previous candle (1 bar ago).
    • The candle before that (2 bars ago).
  3. Difference Calculation: The script subtracts these averages from one another to create "distance" values. For example, it calculates the gap between the 5-period average and the 10-period average, as well as the gap between the 10-period average and the 15-period average.
  4. User Selection (Options): The script allows you to choose which specific "gap" you want to view on your chart through a settings menu:
    • Option 0: Displays the differences calculated from the current candle.
    • Option 1: Displays the differences calculated from the previous candle.
    • Option 2: Displays the differences calculated from the candle two positions back.

Visual Output

The results are plotted in a separate window (not directly on the price candles). It generates three distinct lines representing these different average gaps. By observing how these lines move, a trader can visualize the widening or narrowing relationship between short-term and long-term price trends.

Price Data Components
Series array that contains close prices for each bar
Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
5 Views
0 Downloads
0 Favorites
Better_M5_diff
//+------------------------------------------------------------------+
//|                                                   Better_MA.mq4  |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Lime
#property indicator_color2 Aqua
#property indicator_color3 White
#property indicator_level1 0.0



extern int NrBars=2000;
extern int Option=0;//0,1,2

string SymbolName;
int PeriodMinutes1=0;
int PeriodMinutes5=PERIOD_M5;
int PeriodMinutes60=PERIOD_H1;
int PeriodMinutes240=PERIOD_H4;


//---- buffers
double VolBuffer1[];
double VolBuffer2[];
double VolBuffer3[];
double x0,x1,x2,x3,x4,x5,x6,x7,x8,x9;
double y0,y1,y2,y3,y4,y5,y6,y7,y8,y9;
double z0,z1,z2,z3,z4,z5,z6,z7,z8,z9;

double at0,at1,at2,at3,at4,at5,at6,at7,at8;
double at9,at10,at11,at12,at13,at14,at15,at16,at17;
double at18,at19,at20,at21,at22,at23,at24,at25,at26;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//|------------------------------------------------------------------|

int init()
  {


    SymbolName = Symbol();


   IndicatorBuffers(3);
   
   SetIndexStyle(0,DRAW_LINE,0,1);
   SetIndexBuffer(0, VolBuffer1);

   SetIndexEmptyValue(0,EMPTY_VALUE);
   
   SetIndexStyle(1,DRAW_LINE,0,1);
   SetIndexBuffer(1, VolBuffer2);

   SetIndexEmptyValue(1,EMPTY_VALUE);
   
   SetIndexStyle(2,DRAW_LINE,0,1);
   SetIndexBuffer(2, VolBuffer3);

   SetIndexEmptyValue(2,EMPTY_VALUE);

   return(0);
  }


//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {

  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {

   for (int i=NrBars-1;i>=0;i--)
      {
      datetime time1=iTime(SymbolName,PeriodMinutes1,i);
      
      int b5=iBarShift(SymbolName,PeriodMinutes5,time1,true);
/*
      int b60=iBarShift(SymbolName,PeriodMinutes60,time1,true);
      int b240=iBarShift(SymbolName,PeriodMinutes240,time1,true);
*/    

      if(b5>=0)
      {
        x0=iClose(SymbolName,PeriodMinutes5,b5);   
           
        x1=iMA(SymbolName,PeriodMinutes5,5,0,MODE_SMA,PRICE_CLOSE,b5);
        x2=iMA(SymbolName,PeriodMinutes5,10,0,MODE_SMA,PRICE_CLOSE,b5);
        x3=iMA(SymbolName,PeriodMinutes5,15,0,MODE_SMA,PRICE_CLOSE,b5);
        
        at0=x1-x2;
        at1=x2-x3;
        at2=x1-x3;

        y1=iMA(SymbolName,PeriodMinutes5,5,0,MODE_SMA,PRICE_CLOSE,b5+1);
        y2=iMA(SymbolName,PeriodMinutes5,10,0,MODE_SMA,PRICE_CLOSE,b5+1);
        y3=iMA(SymbolName,PeriodMinutes5,15,0,MODE_SMA,PRICE_CLOSE,b5+1);

        at9=y1-y2;
        at10=y2-y3;
        at11=y1-y3;

        z1=iMA(SymbolName,PeriodMinutes5,5,0,MODE_SMA,PRICE_CLOSE,b5+2);
        z2=iMA(SymbolName,PeriodMinutes5,10,0,MODE_SMA,PRICE_CLOSE,b5+2);
        z3=iMA(SymbolName,PeriodMinutes5,15,0,MODE_SMA,PRICE_CLOSE,b5+2);

        at18=z1-z2;
        at19=z2-z3;
        at20=z1-z3;        
      }
/*      
      if(b60>=0)
      {        
        x4=iMA(SymbolName,PeriodMinutes60,5,0,MODE_SMA,PRICE_CLOSE,b60);
        x5=iMA(SymbolName,PeriodMinutes60,10,0,MODE_SMA,PRICE_CLOSE,b60);
        x6=iMA(SymbolName,PeriodMinutes60,15,0,MODE_SMA,PRICE_CLOSE,b60);

        at3=x4-x5;
        at4=x5-x6;
        at5=x4-x6;
        
        y4=iMA(SymbolName,PeriodMinutes60,5,0,MODE_SMA,PRICE_CLOSE,b60+1);
        y5=iMA(SymbolName,PeriodMinutes60,10,0,MODE_SMA,PRICE_CLOSE,b60+1);
        y6=iMA(SymbolName,PeriodMinutes60,15,0,MODE_SMA,PRICE_CLOSE,b60+1);

        at12=y4-y5;
        at13=y5-y6;
        at14=y4-y6;
        
        z4=iMA(SymbolName,PeriodMinutes60,5,0,MODE_SMA,PRICE_CLOSE,b60+2);
        z5=iMA(SymbolName,PeriodMinutes60,10,0,MODE_SMA,PRICE_CLOSE,b60+2);
        z6=iMA(SymbolName,PeriodMinutes60,15,0,MODE_SMA,PRICE_CLOSE,b60+2);

        at21=z4-z5;
        at22=z5-z6;
        at23=z4-z6;        
      }       
      if(b240>=0)
      {             
        x7=iMA(SymbolName,PeriodMinutes240,5,0,MODE_SMA,PRICE_CLOSE,b240);
        x8=iMA(SymbolName,PeriodMinutes240,10,0,MODE_SMA,PRICE_CLOSE,b240);
        x9=iMA(SymbolName,PeriodMinutes240,15,0,MODE_SMA,PRICE_CLOSE,b240);
        at6=x7-x8;
        at7=x8-x9;
        at8=x7-x9;
        y7=iMA(SymbolName,PeriodMinutes240,5,0,MODE_SMA,PRICE_CLOSE,b240+1);
        y8=iMA(SymbolName,PeriodMinutes240,10,0,MODE_SMA,PRICE_CLOSE,b240+1);
        y9=iMA(SymbolName,PeriodMinutes240,15,0,MODE_SMA,PRICE_CLOSE,b240+1);

        at15=y7-y8;
        at16=y8-y9;
        at17=y7-y9;
        z7=iMA(SymbolName,PeriodMinutes240,5,0,MODE_SMA,PRICE_CLOSE,b240+2);
        z8=iMA(SymbolName,PeriodMinutes240,10,0,MODE_SMA,PRICE_CLOSE,b240+2);
        z9=iMA(SymbolName,PeriodMinutes240,15,0,MODE_SMA,PRICE_CLOSE,b240+2);
        at24=z7-z8;
        at25=z8-z9;
        at26=z7-z9;
      }
*/  
   if(Option==0)
   {  
	  VolBuffer1[i]=at0; 
 	  VolBuffer2[i]=at1;   
 	  VolBuffer3[i]=at2;      
 	}
 	else if(Option==1)
   {   
	  VolBuffer1[i]=at9; 
 	  VolBuffer2[i]=at10;   
 	  VolBuffer3[i]=at11;      
 	}
 	else if(Option==2)
   {    
	  VolBuffer1[i]=at18; 
 	  VolBuffer2[i]=at19;   
 	  VolBuffer3[i]=at20; 
 	}
 	  
  
  }
  
 
   
		

   
   return(0);
  }
//+------------------------------------------------------------------+

Comments