Amplitude_short
Download scriptThe Amplitude indicator is designed to provide traders with a comprehensive visual breakdown of price volatility and candle structure. Instead of looking at just one price movement, it decomposes the price action into four distinct components, allowing you to see how much of the market's "energy" is coming from the actual body of the candles versus the wicks (shadows).
Core Functionality
The indicator operates by calculating averages over a specific timeframe (the AveragePeriod). By analyzing these periods, it smooths out minor noise to reveal the underlying trends in price movement. It provides four primary metrics:
- High-Low Average: This tracks the total range of price movement. It measures the distance from the highest point reached to the lowest point during each period, giving you a sense of the overall volatility.
- Open-Close Average: This focuses on the "Body" of the candle. It measures how much the price actually moved from its opening price to its closing price, representing the strength of the trend or conviction of the market participants.
- Up Shadow & Down Shadow: These represent the extremes of price rejection. The Up Shadow tracks how far the price moved upward before being pushed back down, while the Down Shadow tracks how far it dropped before being recovered.
- Summ_Shadow: This combines both the upper and lower shadows into a single metric. It highlights the total "rejection" area, showing you how much of the price action was essentially "tested" and abandoned by the market.
How the Logic Works
To ensure accuracy, the script performs the following steps:
- Data Collection: It looks back at a set number of bars (defined by your settings) to gather historical data points.
- Smart Averaging: The logic is designed to be intelligent; if it encounters "flat" candles where no movement occurred, it adjusts its calculations automatically. This prevents those flat periods from skewing the average and ensures the data remains as accurate as possible.
- Dynamic Calculation: For every new candle, the indicator recalculates these four components simultaneously. This allows you to see, in real-time, if the market is becoming more "bodied" (stronger trend conviction) or more "shadowed" (increasing uncertainty and price rejection).
Practical Use
By observing these different lines, a trader can distinguish between a high-volatility market that has clear direction (large bodies, small shadows) and a high-volatility market that is undecided (small bodies, very long shadows). It serves as a tool to measure the "amplitude" or intensity of price movements across various dimensions.
//+------------------------------------------------------------------+
//| 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 Red
#property indicator_color2 Lime
#property indicator_color3 White
#property indicator_color4 White
#property indicator_color5 White
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 = 100;
int init()
{
IndicatorShortName( "Amplitude (" + AveragePeriod + " bars average) - " );
IndicatorDigits ( 2 );
SetIndexBuffer ( 0 , buf0 );
SetIndexDrawBegin ( 0 , AveragePeriod );
SetIndexLabel( 0 , "High-Low");
SetIndexBuffer ( 1 , buf1 );
SetIndexDrawBegin ( 1 , AveragePeriod );
SetIndexLabel( 1 , "Open-Close");
SetIndexBuffer ( 2 , buf2 );
SetIndexStyle ( 2 , DRAW_LINE, STYLE_DOT );
SetIndexDrawBegin ( 2 , AveragePeriod );
SetIndexLabel( 2 , "Up_Shadow");
SetIndexBuffer ( 3 , buf3 );
SetIndexStyle ( 3 , DRAW_LINE, STYLE_DOT );
SetIndexDrawBegin ( 3 , AveragePeriod );
SetIndexLabel( 3 , "Down_Shadow");
SetIndexBuffer ( 4 , buf4 );
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