AbsoluteStrength_v1DH_001
Download scriptThe AbsoluteStrength indicator is designed to provide traders with a visual representation of market momentum by separating the forces of "Bulls" (buyers) and "Bears" (sellers). Instead of just showing price movement, it calculates the underlying strength behind those moves, allowing for a clearer view of which side currently holds the upper hand in the market.
How the Logic Works
The script operates by analyzing price action through two different primary methodologies, which users can choose from depending on their preferred trading style:
1. The RSI Method (Relative Strength) In this mode, the indicator looks at the immediate change between consecutive price points. It calculates the difference between the current price and the previous price to determine the direction of the move. By isolating these changes, it quantifies the velocity of the price action. If the price moves up, the "Bull" strength increases; if it moves down, the "Bear" strength increases.
2. The Stochastic Method (Range Positioning) This mode provides a broader perspective by looking at where the current price sits relative to the highest highs and lowest lows over a specific period. It measures how far the price has traveled from its recent boundaries. If the price is hugging the top of its recent range, it signals high bullish strength. Conversely, if it is near the bottom of the range, it signals bearish dominance.
Data Processing and Smoothing
To ensure that the information provided to the trader is stable and not distracted by "market noise" or erratic price spikes, the script performs a multi-stage smoothing process:
- Primary Calculation: The raw strength (Bull/Bear) is first identified based on one of the two modes mentioned above.
- Averaging: This raw data is then averaged over a set period to identify a consistent trend in strength.
- Smoothing: A second layer of smoothing is applied to ensure the lines moveFluidly across the chart.
- Signal Generation: Finally, a "Signal Line" is calculated. This acts as a moving average of the smoothed data, helping traders identify when momentum is accelerating or slowing down.
Visual Output
The indicator presents this data in a dedicated sub-window:
- Histograms: These visually represent the immediate Bull and Bear strength.
- Lines: The Signal lines provide a secondary reference point to help identify potential trend shifts or overextended movements.
By using these multi-layered calculations, the AbsoluteStrength indicator aims to provide a clearer picture of market sentiment, helping traders distinguish between a minor price fluctuation and a significant shift in market power.
//+------------------------------------------------------------------+
//| AbsoluteStrength_v1DH AbsoluteStrength_v1.mq4 |
//| Copyright © 2006, TrendLaboratory Ltd. |
//| http://finance.groups.yahoo.com/group/TrendLaboratory |
//| E-mail: igorad2004@list.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, TrendLaboratory Ltd."
#property link "http://finance.groups.yahoo.com/group/TrendLaboratory"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 LightBlue
#property indicator_width1 2
#property indicator_color2 Tomato
#property indicator_width2 1
#property indicator_color3 Aqua
#property indicator_width3 1
#property indicator_style3 3
#property indicator_color4 Orange
#property indicator_width4 1
#property indicator_style4 3
//---- input parameters
extern int Mode = 0; // 0-RSI method; 1-Stoch method
extern int Length = 10; // Period
extern int Smooth = 5; // Period of smoothing
extern int Signal = 5; // Period of Signal Line
extern int Price = 0; // Price mode : 0-Close,1-Open,2-High,3-Low,4-Median,5-Typical,6-Weighted
extern int ModeMA = 3; // Mode of Moving Average
//---- buffers
double Bulls[];
double Bears[];
double AvgBulls[];
double AvgBears[];
double SmthBulls[];
double SmthBears[];
double SigBulls[];
double SigBears[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
IndicatorBuffers(8);
SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexBuffer(0,SmthBulls);
SetIndexStyle(1,0);
SetIndexBuffer(1,SmthBears);
SetIndexStyle(2,DRAW_LINE);
SetIndexBuffer(2,SigBulls);
SetIndexStyle(3,DRAW_LINE);
SetIndexBuffer(3,SigBears);
SetIndexBuffer(4,Bulls);
SetIndexBuffer(5,Bears);
SetIndexBuffer(6,AvgBulls);
SetIndexBuffer(7,AvgBears);
//---- name for DataWindow and indicator subwindow label
string short_name="AbsoluteStrength("+Mode+","+Length+","+Smooth+","+Signal+","+ModeMA+")";
IndicatorShortName(short_name);
SetIndexLabel(0,"Bulls");
SetIndexLabel(1,"Bears");
SetIndexLabel(2,"SignalBulls");
SetIndexLabel(3,"SignalBears");
//----
SetIndexDrawBegin(0,Length+Smooth+Signal);
SetIndexDrawBegin(1,Length+Smooth+Signal);
SetIndexDrawBegin(2,Length+Smooth+Signal);
SetIndexDrawBegin(3,Length+Smooth+Signal);
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int shift, limit, counted_bars=IndicatorCounted();
double Price1, Price2, smax, smin;
//----
if ( counted_bars < 0 ) return(-1);
if ( counted_bars ==0 ) limit=Bars-Length+Smooth+Signal-1;
if ( counted_bars < 1 )
for(int i=1;i<Length+Smooth+Signal;i++)
{
Bulls[Bars-i]=0;
Bears[Bars-i]=0;
AvgBulls[Bars-i]=0;
AvgBears[Bars-i]=0;
SmthBulls[Bars-i]=0;
SmthBears[Bars-i]=0;
SigBulls[Bars-i]=0;
SigBears[Bars-i]=0;
}
if(counted_bars>0) limit=Bars-counted_bars;
limit--;
for( shift=limit; shift>=0; shift--)
{
Price1 = iMA(NULL,0,1,0,0,Price,shift);
Price2 = iMA(NULL,0,1,0,0,Price,shift+1);
if (Mode==0)
{
Bulls[shift] = (0.5*(MathAbs(Price1-Price2)+(Price1-Price2)))-0.5*(MathAbs(Price1-Price2)-(Price1-Price2));
Bears[shift] = -0.5*(MathAbs(Price1-Price2)-(Price1-Price2))+0.5*(MathAbs(Price1-Price2)-(Price1-Price2));
}
if (Mode==1)
{
smax=High[Highest(NULL,0,MODE_HIGH,Length,shift)];
smin=Low[Lowest(NULL,0,MODE_LOW,Length,shift)];
Bulls[shift] = Price1 - smin;
Bears[shift] = -(smax - Price1)+(smax-Price1);
}
}
for( shift=limit; shift>=0; shift--)
{
AvgBulls[shift]=iMAOnArray(Bulls,0,Length,0,ModeMA,shift);
AvgBears[shift]=iMAOnArray(Bears,0,Length,0,ModeMA,shift);
}
for( shift=limit; shift>=0; shift--)
{
SmthBulls[shift]=iMAOnArray(AvgBulls,0,Smooth,0,ModeMA,shift);
SmthBears[shift]=iMAOnArray(AvgBears,0,Smooth,0,ModeMA,shift);
}
for( shift=limit; shift>=0; shift--)
{
SigBulls[shift]=iMAOnArray(SmthBulls,0,Signal,0,ModeMA,shift);
SigBears[shift]=iMAOnArray(SmthBears,0,Signal,0,ModeMA,shift);
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments