AbsoluteStrenghtHisto_v1_v1
Download scriptThe AbsoluteStrength indicator is a technical analysis tool designed to measure and visualize the momentum between "bullish" (buying) and "bearish" (selling) forces in a financial market. Rather than just showing price action, it attempts to quantify the underlying strength of each side to help traders identify who is currently in control of the market trend.
Core Calculation Logic
The script operates by separating price movement into two distinct categories:
- Bullish Strength: The upward momentum or buying pressure.
- Bearish Strength: The downward momentum or selling pressure.
To achieve this, the tool offers two different mathematical methods (modes) to determine these values:
- Relative Movement Method: This looks at the change in price between the current bar and the previous one. It calculates whether the movement was positive or negative and captures the magnitude of that shift.
- Range Extremes Method: This measures where the current price sits relative to the highest highs and lowest lows over a specific period. For example, if the price is near the recent high, it suggests strong bullish strength; if it is near the recent low, it suggests bearish strength.
Data Refinement and Smoothing
Raw market data can be "noisy," which often leads to erratic signals. To provide a cleaner view for the trader, the script performs a multi-layered smoothing process:
- Averaging: It calculates an average of the bullish and bearish strengths over a user-defined period.
- Smoothing: It applies a second layer of smoothing to these averages. This reduces "jitter" and helps highlight the broader trend rather than momentary price spikes.
Visual Representation (Histogram Modes)
The tool provides several ways to display this data visually, depending on how the user prefers to interpret the market:
- Standard Comparison: Displays the smoothed bullish and bearish values side-by-side, allowing for a direct comparison of which force is larger at any given moment.
- Opposing Histogram: This reflects the two forces against each other (often one pointing up and one pointing down). If the "bulls" are stronger, their value is shown positively; if the "bears" are stronger, their value is flipped to show a negative orientation. This creates a "mirror" effect that makes it easy to see which side is dominating.
- Dominance Tracking: In certain modes, the script simplifies the visual entirely by only showing the strongest force. If buying pressure is higher, it shows the bullish value and hides the bearish; if selling pressure is higher, it shows the bearish value and hides the bullish. This provides a very clean "winner-takes-all" visual of the current market sentiment.
Summary for the User
Essentially, this script acts as a "tug-of-war" meter. It looks at the history of price movements, determines which side is pulling harder (buyers or sellers), smooths out the distractions of minor price fluctuations, and presents that information in a visual format that allows you to see the prevailing market sentiment at a glance.
//+------------------------------------------------------------------+
//| AbsoluteStrength_v1.mq4 |
//| Copyright © 2006, TrendLaboratory Ltd. |
//| http://finance.groups.yahoo.com/group/TrendLaboratory |
//| E-mail: igorad2004@list.ru |
//+------------------------------------------------------------------+
//| Modifications: |
//| - AbsoluteStrengthHisto_v1, 2006/06/26: |
//| Put in Histogram form with 2 level lines |
//| ph_bresson@yahoo.com |
//+------------------------------------------------------------------+
#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 Blue
#property indicator_width1 3
#property indicator_color2 Red
#property indicator_width2 3
#property indicator_color3 DeepSkyBlue
#property indicator_width3 1
#property indicator_color4 Red
#property indicator_width4 1
//---- input parameters
extern int Mode =0; // 0-RSI method; 1-Stoch method
extern int Length= 9; // Period
extern int Smooth= 1; // Period of smoothing
extern int Signal= 4; // 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
extern int Mode_Histo =3;
//---- 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,EMPTY,3);
SetIndexBuffer(0,SmthBulls);
SetIndexStyle(1,DRAW_HISTOGRAM,EMPTY,3);
SetIndexBuffer(1,SmthBears);
//
SetIndexStyle(2,DRAW_LINE,EMPTY,1);
SetIndexBuffer(2,SigBulls);
SetIndexStyle(3,DRAW_LINE,EMPTY,1);
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="AbsoluteStrengthHistogram("+Mode+","+Length+","+Smooth+","+Signal+",,"+ModeMA+")";
IndicatorShortName(short_name);
SetIndexLabel(0,"Bulls");
SetIndexLabel(1,"Bears");
SetIndexLabel(2,"Bulls");
SetIndexLabel(3,"Bears");
//
SetIndexDrawBegin(0,Length+Smooth+Signal);
SetIndexDrawBegin(1,Length+Smooth+Signal);
SetIndexDrawBegin(2,Length+Smooth+Signal);
SetIndexDrawBegin(3,Length+Smooth+Signal);
//
SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.0);
SetIndexEmptyValue(2,0.0);
SetIndexEmptyValue(3,0.0);
SetIndexEmptyValue(4,0.0);
SetIndexEmptyValue(5,0.0);
SetIndexEmptyValue(6,0.0);
SetIndexEmptyValue(7,0.0);
//----
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);
}
if(Mode_Histo==1)
{
for( shift=limit; shift>=0; shift--)
{
if(SmthBulls[shift]-SmthBears[shift]>0)
{
SetIndexStyle(0,DRAW_HISTOGRAM,EMPTY,5);
SetIndexStyle(1,DRAW_LINE,EMPTY,2);
SmthBears[shift]= SmthBears[shift]/Point;
SmthBulls[shift]= SmthBulls[shift]/Point;
}
else
{
SetIndexStyle(1,DRAW_HISTOGRAM,EMPTY,5);
SetIndexStyle(0,DRAW_LINE,EMPTY,2);
SmthBears[shift]= SmthBears[shift]/Point;
SmthBulls[shift]= SmthBulls[shift]/Point;
}
} //end for( shift=limit; shift>=0; shift--)
} // end if(Mode_Histo == 1)
else
if(Mode_Histo==2)
{
for( shift=limit; shift>=0; shift--)
{
if(SmthBulls[shift]-SmthBears[shift]>0)
{
SmthBears[shift]=-SmthBears[shift]/Point;
SmthBulls[shift]= SmthBulls[shift]/Point;
}
else
{
SmthBulls[shift]=-SmthBulls[shift]/Point;
SmthBears[shift]= SmthBears[shift]/Point;
}
} //end for( shift=limit; shift>=0; shift--)
} //end if(Mode_Histo == 2)
else
if(Mode_Histo==3)
{
for( shift=limit; shift>=0; shift--)
{
SigBulls[shift]= SmthBulls[shift];
SigBears[shift]= SmthBears[shift];
if(SmthBulls[shift]-SmthBears[shift]>0)
SmthBears[shift]=0;
else
SmthBulls[shift]=0;
} //end for( shift=limit; shift>=0; shift--)
} //end if(Mode_Histo == 3)
else
if(Mode_Histo==4)
{
for( shift=limit; shift>=0; shift--)
{
if(SmthBulls[shift]-SmthBears[shift]>0)
{
SigBears[shift]= SmthBears[shift];
SmthBears[shift]=0;
}
else
{
SigBulls[shift]= SmthBulls[shift];
SmthBulls[shift]=0;
}
} //end for( shift=limit; shift>=0; shift--)
} //end if(Mode_Histo == 4)
//----
return(0);
}
//+------------------------------------------------------------------+
Comments