AbsoluteStrength_v1

Download script
Author: Copyright � 2006, TrendLaboratory Ltd.
AbsoluteStrength_v1

The 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.
Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
10 Views
0 Downloads
0 Favorites
AbsoluteStrength_v1
//+------------------------------------------------------------------+
//|                                          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