Average_Size_Bar
Download scriptThis script is designed as a technical analysis tool for MetaTrader that measures and visualizes the average volatility or "size" of price bars over a specific period. Instead of looking at the price itself, it focuses on the range—the distance between the highest and lowest prices—within each individual bar to determine how much movement is occurring in the market.
Core Functionality
The primary goal of this tool is to smooth out the raw data of price fluctuations into a readable line on your chart. By calculating the average size of these bars, it helps traders identify trends in market activity, such as periods of high volatility (large bar sizes) versus periods of consolidation or low activity (small bar sizes).
Key Components and Logic
1. Customizable Calculation Methods The script allows you to choose between four different mathematical approaches to calculate this average. Depending on your trading style, you can select how "reactive" or "smooth" the resulting line should be:
- Simple Moving Average (SMA): Provides a basic average of the bar sizes over the selected period. It treats all bars in that timeframe with equal importance.
- Exponential Moving Average (EMA): Places more weight on recent price action. This makes the indicator react more quickly to sudden changes in market volatility.
- Smoothed Moving Average (SMMA): Creates a much smoother line by incorporating all previous data into the current calculation, effectively filtering out "noise."
- Linear Weighted Moving Average (LWMA): Applies a weighted progression where the most recent bars have the highest impact on the average, providing a balance between sensitivity and smoothness.
2. Dynamic Data Processing The script is designed to automatically process historical data as new price information arrives. It performs the following background tasks:
- Initialization: It sets up the visual parameters, such as the color of the line (Red) and the starting point on the chart.
- Buffer Management: It creates a dedicated space in the memory to store the calculated values, ensuring that the indicator remains fluid and updates in real-time as new candles form.
- Range Calculation: For every bar on your chart, the script identifies the difference between the High and Low prices. This "size" is the fundamental building block for all the averages mentioned above.
How to Interpret the Result
The final output is a visual line displayed in a separate window below your main price chart.
- Rising Line: Indicates that the average size of the bars is increasing, suggesting growing volatility or stronger market momentum.
- Falling Line: Indicates that the price range is shrinking, which may suggest a cooling-off period, lower liquidity, or a tightening market.
- Flat Line: Suggests that the market is moving with a consistent level of activity relative to the chosen period.
//+------------------------------------------------------------------+
//| 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