AbsoluteStrength_v1.1

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

The AbsoluteStrength indicator is designed to measure and visualize the competing forces between buyers (Bulls) and sellers (Bears) in the financial market. Rather than just looking at price direction, it quantifies the "intensity" of each side to help traders understand who is currently in control of the price movement.

Core Logic Overview

The script operates by calculating two primary values: Bull Strength and Bear Strength. Depending on the selected mode, it uses different mathematical approaches to determine these values:

  • RSI Method: Focuses on the absolute change in price between the current period and the previous one. It separates this movement into positive gains (Bull) and negative losses (Bear).
  • Stochastic Method: Evaluates where the current price sits relative to the highest high and lowest low over a specific look-back period. This helps determine if the price is near its "ceiling" or "floor."
  • ADX Method: Analyzes the volatility and range of high and low prices between periods to gauge the momentum of the market.

Data Processing Pipeline

To ensure the information provided to the trader is clear and not distracted by minor market "noise," the script processes the raw data through three distinct layers:

  1. Raw Calculation: The script first identifies the immediate Bull and Bear strengths based on one of the modes mentioned above.
  2. Averaging: It applies a Moving Average to these raw values. This step smooths out erratic price spikes, providing a more reliable picture of the sustained trend.
  3. Smoothing & Signaling: Finally, the script applies a second layer of smoothing. It also generates "Signal Lines," which act as a secondary reference point. These signals can be configured to trigger at specific thresholds (Overbought/Oversold levels) or follow a moving average to help identify potential turning points in the market.

Visual Output

The indicator displays these calculations on a separate window, typically showing four distinct lines:

  • Bulls: The primary strength of the buying side.
  • Bears: The primary strength of the selling side.
  • Signal Bulls & Signal Bears: Derived lines that help traders identify "crossovers" or momentum shifts, making it easier to spot when one side starts to lose its grip on the market.
Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
15 Views
0 Downloads
0 Favorites
AbsoluteStrength_v1.1
//+------------------------------------------------------------------+
//|                                        AbsoluteStrength_v1.1.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; 2-ADX method
extern int       Length     = 10; // Period of evaluation
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
extern double    OverBought =  0; // OverBought Level
extern double    OverSold   =  0; // OverSold Level 
  
//---- 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;
         }
         
         if (Mode==2)
         {
         Bulls[shift] = 0.5*(MathAbs(High[shift]-High[shift+1])+(High[shift]-High[shift+1]));
         Bears[shift] = 0.5*(MathAbs(Low[shift+1]-Low[shift])+(Low[shift+1]-Low[shift]));
         }
      
      
      }
      
      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--)
      {
         if (OverBought > 0 && OverSold > 0 )
         {
         SigBulls[shift]=OverBought/100*(SmthBulls[shift]+SmthBears[shift]);
         SigBears[shift]=OverSold/100*(SmthBulls[shift]+SmthBears[shift]);
         }
         else
         {
         SigBulls[shift]=iMAOnArray(SmthBulls,0,Signal,0,ModeMA,shift);     
         SigBears[shift]=iMAOnArray(SmthBears,0,Signal,0,ModeMA,shift);
         }
      }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments