Average Size Bar_v1

Download script
Author: ��� ����� �. aka KimIV.
Average Size Bar_v1

This tool is designed to provide traders with a visual representation of market volatility by measuring the "size" of price bars over a specific timeframe. Instead of looking at price movement alone, this indicator focuses on the distance between the highest and lowest points of each candle (the range) and smooths that data into a readable trend line.

Core Functionality

The primary logic of the script revolves around identifying the volatility of each individual bar—calculated by subtracting the low price from the high price. Once these individual sizes are identified, the tool applies different mathematical "smoothing" techniques to help traders see the average volatility more clearly.

Available Calculation Methods

Depending on your preference, the script allows you to choose between four distinct ways of calculating this average:

  • Simple Moving Average (SMA): This provides a straightforward arithmetic mean. It takes the price range of a set number of bars and averages them equally. This is ideal for seeing a clean, steady progression of average volatility.
  • Exponential Moving Average (EMA): This method gives more importance to recent price action. By weighting the most recent bars more heavily than older ones, it reacts faster to sudden spikes in market volatility.
  • Smoothed Moving Average (SMMA): This creates a much "flatter" and smoother line by incorporating all previous data points into the calculation. It is designed to filter out minor noise and highlight long-term trends in price range.
  • Linear Weighted Moving Average (LWMA): Similar to the EMA but using a linear progression, this gives increasing weight to the most recent bars. It provides a balanced middle ground between the simplicity of an SMA and the high sensitivity of an EMA.

How to Interpret the Data

The indicator appears in a separate window below your main price chart. By observing the resulting line, you can determine:

  1. Volatility Expansion: When the line moves upward, the average size of the candles is increasing, suggesting higher market activity or uncertainty.
  2. Volatility Contraction: When the line moves downward, the price ranges are shrinking, which often indicates a period of consolidation or "quiet" trading.
  3. Trend Stability: By watching how quickly the line reacts to new data (based on your chosen method), you can better understand whether current market movements are significant outliers or part of a sustained shift in energy.
Miscellaneous
Implements a curve of type %1
10 Views
0 Downloads
0 Favorites
Average Size Bar_v1
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                             Average Size Bar.mq4 |
//|                                          Êèì Èãîðü Â. aka KimIV. |
//|                                             http://www.kimiv.ru/ |
//+------------------------------------------------------------------+
#property copyright "Êèì Èãîðü Â. aka KimIV."
#property link      "http://www.kimiv.ru/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- indicator parameters
extern int MA_Period=10;
extern int MA_Shift=0;
extern int MA_Method=0;
//---- indicator buffers
double ExtMapBuffer[];
//----
int ExtCountedBars=0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
  int    draw_begin;
  string short_name;
  //---- drawing settings
  SetIndexStyle(0, DRAW_LINE);
  SetIndexShift(0, MA_Shift);
  IndicatorDigits(MarketInfo(Symbol(), MODE_DIGITS));
  if(MA_Period<2) MA_Period=10;
  draw_begin = MA_Period - 1;
  //---- indicator short name
  switch(MA_Method) {
    case 1  : short_name = "EMA("; draw_begin = 0; break;
    case 2  : short_name = "SMMA("; break;
    case 3  : short_name = "LWMA("; break;
    default : short_name = "SMA("; MA_Method = 0;
  }
  IndicatorShortName(short_name + MA_Period + ")");
  SetIndexDrawBegin(0, draw_begin);
  //---- indicator buffers mapping
  SetIndexBuffer(0, ExtMapBuffer);
  //---- initialization done
  return(0);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start() {
  if(Bars<=MA_Period) return(0);
  ExtCountedBars=IndicatorCounted();
  //---- check for possible errors
  if (ExtCountedBars<0) return(-1);
  //---- last counted bar will be recounted
  if (ExtCountedBars>0) ExtCountedBars--;
  //----
  switch(MA_Method) {
    case 0 : sma();  break;
    case 1 : ema();  break;
    case 2 : smma(); break;
    case 3 : lwma();
  }
  //---- done
  return(0);
}

//+------------------------------------------------------------------+
//| Simple Average Size Bar                                          |
//+------------------------------------------------------------------+
void sma() {
  double sum = 0;
  int    i, pos = Bars - ExtCountedBars - 1;
  //---- initial accumulation
   if(pos<MA_Period) pos=MA_Period;
   for(i=1;i<MA_Period;i++,pos--) sum+=High[pos]-Low[pos];
  //---- main calculation loop
  while(pos>=0) {
    sum+=High[pos]-Low[pos];
    ExtMapBuffer[pos]=sum/MA_Period;
	  sum-=High[pos+MA_Period-1]-Low[pos+MA_Period-1];
 	  pos--;
  }
  //---- zero initial bars
  if(ExtCountedBars<1) for(i=1;i<MA_Period;i++) ExtMapBuffer[Bars-i]=0;
}

//+------------------------------------------------------------------+
//| Exponential Average Size                                         |
//+------------------------------------------------------------------+
void ema() {
  double pr=2.0/(MA_Period+1);
  int    pos=Bars-2;
  if(ExtCountedBars>2) pos=Bars-ExtCountedBars-1;
  //---- main calculation loop
  while(pos>=0) {
    if(pos==Bars-2) ExtMapBuffer[pos+1]=High[pos+1]-Low[pos+1];
    ExtMapBuffer[pos]=(High[pos]-Low[pos])*pr+ExtMapBuffer[pos+1]*(1-pr);
 	  pos--;
  }
}

//+------------------------------------------------------------------+
//| Smoothed Average Size Bar                                        |
//+------------------------------------------------------------------+
void smma() {
  double sum=0;
  int    i,k,pos=Bars-ExtCountedBars+1;
  //---- main calculation loop
  pos=Bars-MA_Period;
  if(pos>Bars-ExtCountedBars) pos=Bars-ExtCountedBars;
  while(pos>=0) {
    if(pos==Bars-MA_Period) {
      //---- initial accumulation
      for(i=0,k=pos;i<MA_Period;i++,k++) {
        sum+=High[k]-Low[k];
        //---- zero initial bars
        ExtMapBuffer[k]=0;
      }
    }
    else sum=ExtMapBuffer[pos+1]*(MA_Period-1)+High[pos]-Low[pos];
    ExtMapBuffer[pos]=sum/MA_Period;
    pos--;
  }
}

//+------------------------------------------------------------------+
//| Linear Weighted Average Size Bar                                 |
//+------------------------------------------------------------------+
void lwma() {
  double sum=0.0,lsum=0.0;
  double price;
  int    i,weight=0,pos=Bars-ExtCountedBars-1;
  //---- initial accumulation
  if(pos<MA_Period) pos=MA_Period;
  for(i=1;i<=MA_Period;i++,pos--) {
    price=High[pos]-Low[pos];
    sum+=price*i;
    lsum+=price;
    weight+=i;
  }
  //---- main calculation loop
  pos++;
  i=pos+MA_Period;
  while(pos>=0) {
    ExtMapBuffer[pos]=sum/weight;
    if(pos==0) break;
    pos--;
    i--;
    price=High[pos]-Low[pos];
    sum=sum-lsum+price*MA_Period;
    lsum-=High[i]-Low[i];
    lsum+=price;
  }
  //---- zero initial bars
  if(ExtCountedBars<1) for(i=1;i<MA_Period;i++) ExtMapBuffer[Bars-i]=0;
}
//+------------------------------------------------------------------+

Comments