AbsoluteStrength_v1
Download scriptThe AbsoluteStrength indicator is designed to measure and visualize the underlying momentum of a financial market by distinguishing between "Bullish" (buying) and "Bearish" (selling) forces. Unlike standard oscillators that simply track price movement, this tool separates these two forces into independent components to provide a clearer picture of market sentiment.
Core Methodology
The script offers two distinct methods for calculating the strength of the market, allowing users to switch between different types of data analysis:
1. RSI Method (Method 0): This approach focuses on the velocity and direction of price changes. By comparing the current price to its immediate previous value, it calculates the "net" movement. It then mathematically splits this movement into two parts:
- Bulls: Represents the upward momentum.
- Bears: Represents the downward momentum. By isolating these components, the indicator can show if a market is moving strongly in one direction or if there is conflicting pressure from both sides.
2. Stochastics Method (Method 1): This approach looks at where the current price sits relative to recent highs and lows over a specific timeframe.
- Bulls: Measures the distance between the current price and the recent low (how much room is left to run upward).
- Bears: Measures the distance between the current price and the recent high (how much room is left to fall downward). This helps identify how "stretched" the market is in either direction.
Data Processing and Smoothing
To ensure the data is readable and free from "noise" (erratic, minor price fluctuations), the script performs a multi-layered smoothing process:
- Initial Averaging: The raw Bull and Bear values are first averaged over a primary period to establish a baseline trend.
- Secondary Smoothing: These averages are smoothed again to eliminate outliers and emphasize the primary trend.
- Signal Lines: Finally, the script calculates "Signal Lines" based on the smoothed data. These act similarly to moving averages in traditional indicators; they help traders identify when momentum is accelerating or decelerating by showing the distance between the current strength and its recent average.
Summary of Visual Output
The final result provides a set of lines on your chart that represent the "Absolute Strength" of both buyers and sellers. By observing these lines, you can visually determine:
- Dominance: Which side (Bulls or Bears) is currently leading the market.
- Momentum Shifts: When one force begins to weaken while the other strengthens.
- Trend Clarity: Whether a move is backed by significant strength or if it is losing steam, thanks to the layered smoothing and signal lines.
//+------------------------------------------------------------------+
//| 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 2
#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_LINE);
SetIndexBuffer(0,SmthBulls);
SetIndexStyle(1,DRAW_LINE);
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));
Bears[shift] = 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;
}
}
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