Average Size Bar_v1
Download scriptThis 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:
- Volatility Expansion: When the line moves upward, the average size of the candles is increasing, suggesting higher market activity or uncertainty.
- Volatility Contraction: When the line moves downward, the price ranges are shrinking, which often indicates a period of consolidation or "quiet" trading.
- 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.
/*-----------------------------+
| |
| 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