Amplitude_NBarsAvg
Download scriptThis tool is designed to analyze market volatility and price action by calculating several different types of "amplitudes" (or movements) over a specific timeframe. Instead of looking at just one type of price movement, it breaks down the candles on your chart into four distinct categories to provide a comprehensive view of how price is behaving.
How the Logic Works
The script looks back at a set number of bars (which you can customize via the settings) and performs the following calculations for every point in time:
- High-Low Average: This measures the total range of price movement. It looks at the distance between the absolute highest point and the absolute lowest point reached during each candle. This represents the overall "stretch" of the market.
- Open-Close Average: This calculates the "body" of the candles. It measures the distance between where a candle started and where it ended, ignoring the outer wicks. This helps identify the actual strength of the trend versus just temporary price spikes.
- Up-Shadow vs. Down-Shadow: The script distinguishes between upward and downward pressure. It calculates the size of the upper "wicks" (the distance from the body to the high) and the lower "wicks" (the distance from the body to the low).
- If a candle is bullish (closes higher than it opened), it measures the space above the close and below the open.
- If a candle is bearish (closes lower than it opened), it adjusts its logic to ensure it captures the correct "wicks" relative to the direction of the move.
- Summed Shadow: This combines both the upper and lower shadows into a single value. This gives you a clear picture of how much "rejection" or "exhaustion" is occurring at the extremes of price, regardless of which direction the candle eventually closed.
Key Features for the User
- Smart Averaging: The script doesn't just add numbers up; it intelligently counts valid movements to ensure the averages remain accurate even if there are flat periods in the market.
- Customizable Window: You can adjust the "Average Period" to make the tool more sensitive (looking at a shorter window) or smoother (looking at a longer window).
- Visual Separation: All five different data points are plotted as separate lines in a dedicated window below your main chart, allowing you to compare the relationship between the "Body" of the price action and the "Shadows" (volatility/rejection) in real-time.
//+------------------------------------------------------------------+
//| Amplitude.mq4 |
//| komposter |
//| mailto:komposterius@mail.ru |
//+------------------------------------------------------------------+
#property copyright "komposter"
#property link "mailto:komposterius@mail.ru"
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_buffers 5
#property indicator_color1 Chartreuse
#property indicator_color2 Green
#property indicator_color3 Blue
#property indicator_color4 Red
#property indicator_color5 SlateGray
#property indicator_width2 2
#property indicator_style5 2
double buf0[]; //High-Low Average
double buf1[]; //Body Average
double buf2[]; //Up_Shadow Average
double buf3[]; //Down_Shadow Average
double buf4[]; //Summ_Shadow Average
extern int AveragePeriod = 21;
extern int DrawBars = 500;
int init()
{
IndicatorShortName( "Ampltd( "+AveragePeriod+" barsAvg)HL,OC,(Hwg,Lwg)H+Lwg" );
// IndicatorShortName( "Amplitude (" + AveragePeriod + " bars average) - " );
IndicatorDigits ( 2 );
SetIndexBuffer ( 0 , buf0 );
SetIndexStyle ( 0 , DRAW_LINE );
SetIndexDrawBegin ( 0 , AveragePeriod );
SetIndexLabel( 0 , "High-Low");
SetIndexBuffer ( 1 , buf1 );
SetIndexStyle ( 1 , DRAW_LINE );
SetIndexDrawBegin ( 1 , AveragePeriod );
SetIndexLabel( 1 , "Open-Close");
SetIndexBuffer ( 2 , buf2 );
SetIndexStyle ( 2 , DRAW_LINE );
SetIndexDrawBegin ( 2 , AveragePeriod );
SetIndexLabel( 2 , "Up_Shadow");
SetIndexBuffer ( 3 , buf3 );
SetIndexStyle ( 3 , DRAW_LINE);
SetIndexDrawBegin ( 3 , AveragePeriod );
SetIndexLabel( 3 , "Down_Shadow");
SetIndexBuffer ( 4 , buf4 );
SetIndexStyle ( 3 , DRAW_LINE);
SetIndexDrawBegin ( 4 , AveragePeriod );
SetIndexLabel( 4 , "Summ_Shadow");
return(0);
}
int start()
{
int counted_bars=IndicatorCounted();
if ( counted_bars < 0 ) { Print( "Indicator Error (Counted bars < 0)!" ); return(-1); }
if ( Bars < 100 ) { Print( "Indicator Error (Bars < 100)!" ); return(-1); }
if ( AveragePeriod > Bars - 1 ) { IndicatorShortName( "Indicator Error (Bars < AveragePeriod)!" ); Print( "Indicator Error (BARS < AveragePeriod)!" ); return(-1); }
if ( DrawBars > Bars - 1 || DrawBars <= 0 ) { DrawBars = Bars - 1; }
if ( DrawBars <= AveragePeriod ) { DrawBars = AveragePeriod + 1; }
for ( int i = DrawBars; i >= 0; i -- )
{
double buf_tmp = 0, buf_tmp1 = 0, buf_tmp2 = 0, buf_tmp3 = 0, buf_tmp4 = 0;
int z = 0, z1 = 0, z2 = 0, z3 = 0, z4 = 0;
double high, low, close, open, point = Point;
for ( int u = i + AveragePeriod; u >= i; u -- )
{
high = High[u]; low = Low[u]; close = Close[u]; open = Open[u];
buf_tmp += ( high - low ) / point;
if ( ( high - low ) / point == 0 ) z --;
buf_tmp1 += MathAbs( ( close - open ) ) / point;
if ( MathAbs( ( close - open ) ) / point == 0 ) z1 --;
if ( close - open >= 0 )
{
buf_tmp2 += ( high - close ) / point;
if ( ( high - close ) / point == 0 ) z2 --;
buf_tmp3 += ( open - low ) / point;
if ( ( open - low ) / point == 0 ) z3 --;
}
else
{
buf_tmp2 += ( high - open ) / point;
if ( ( high - open ) / point == 0 ) z2 --;
buf_tmp3 += ( close - low ) / point;
if ( ( close - low ) / point == 0 ) z3 --;
}
}
buf0[i] = buf_tmp / ( AveragePeriod + z );
buf1[i] = buf_tmp1 / ( AveragePeriod + z1 );
buf2[i] = buf_tmp2 / ( AveragePeriod + z2 );
buf3[i] = buf_tmp3 / ( AveragePeriod + z3 );
buf4[i] = buf2[i] + buf3[i];
}
return(0);
}
Comments