Better_H4_diff

Download script
Author: Copyright � 2007, MetaQuotes Software Corp.
Better_H4_diff

This script is designed as a technical analysis tool for the MetaTrader 4 platform. Its primary purpose is to calculate and display specific mathematical relationships between moving averages across different timeframes, helping traders visualize momentum or "spread" in price trends.

Core Logic Overview

The indicator operates by analyzing price data on a larger timeframe (specifically the 4-hour chart) and comparing multiple Moving Averages (MA) simultaneously. Instead of simply showing you the price lines, it calculates the numerical difference between these averages to create a specialized "volume" or "spread" reading.

How It Works

The script follows a structured process to generate its visual data:

1. Multi-Timeframe Analysis The tool automatically looks ahead to identify specific points in time on higher timeframes. While it references several periods, the active logic focuses on the 4-hour (240-minute) interval. This allows the user to see "big picture" market trends while viewing them on a smaller, more active chart.

2. Moving Average Calculations For every data point, the script calculates three different Simple Moving Averages (SMA) based on three distinct lengths: 5, 10, and 15 periods. These represent short, medium, and slightly longer-term trends within that specific timeframe.

3. Difference Calculation (The "Spread") Rather than plotting these averages directly, the script subtracts them from one another to find the distance between them:

  • It calculates the gap between the 5-period and 10-period averages.
  • It calculates the gap between the 10-period and 15-period averages.
  • It calculates the total gap between the 5-period and 15-period averages.

4. User Customization (Options) The script includes a selector that allows the user to choose which specific set of "difference" data they want to view on their chart. These options correspond to different calculation stages within the 4-hour timeframe data, providing various perspectives on how the price gaps are evolving over time.

Summary for the User

In simple terms, this indicator doesn't tell you what the price is; it tells you how much the trend is stretching. By measuring the distance between different moving averages on a high timeframe (4-hour), it provides a visual representation of market momentum and volatility that is often smoothed out or hidden on standard charts.

Price Data Components
Series array that contains close prices for each bar
Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
7 Views
0 Downloads
0 Favorites
Better_H4_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



extern int NrBars=1000;
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]=at6; 
 	  VolBuffer2[i]=at7;   
 	  VolBuffer3[i]=at8;      
 	}
 	else if(Option==1)
   {   
	  VolBuffer1[i]=at15; 
 	  VolBuffer2[i]=at16;   
 	  VolBuffer3[i]=at17;      
 	}
 	else if(Option==2)
   {    
	  VolBuffer1[i]=at24; 
 	  VolBuffer2[i]=at25;   
 	  VolBuffer3[i]=at26; 
 	}
 	  
  
  }
  
 
   
		

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

Comments