Aroon Oscilator_v1

Aroon Oscilator_v1

Overview of the Custom Aroon Oscillator

This trading tool is designed to help traders visualize and identify market trends by analyzing the relationship between historical high and low price points. Unlike standard indicators that might only look at current momentum, this script focuses on the intensity of price movement over a specific timeframe to determine if the market is trending strongly in one direction or consolidating within a neutral range.

How the Logic Works

The indicator operates through a three-step calculation process:

1. Identifying Extremes The script first looks back at a specific number of recent price bars (defined by the "Aroon Period"). During this lookback, it identifies two critical values:

  • The highest price reached.
  • The lowest price reached.

2. Calculating the Oscillator Value Once these extremes are found, the script calculates a raw oscillator value based on the difference between the low and high prices relative to the total period. This creates a numerical score that represents the "stretch" of the current price action. Essentially, it measures how far the price has moved from its recent boundaries compared to the overall timeframe being analyzed.

3. Trend Categorization (Visual Output) To make the data easy to read at a glance, the script takes the resulting oscillator value and sorts it into three distinct visual categories based on a "Filter" threshold:

  • Bullish Strength: If the oscillator value exceeds the upper filter limit, the tool highlights this as a strong upward trend (represented by the first visual buffer).
  • Bearish Strength: If the oscillator value falls below the lower filter limit, it identifies a strong downward trend (represented by the second visual buffer).
  • Neutral/Consolidation: If the oscillator value stays within the limits of both the upper and lower filters, it indicates that the market is currently sideways or lacks a clear directional trend (represented by the third visual buffer).

Summary for Traders

By using this tool, you can quickly distinguish between three market states: significant upward momentum, significant downward momentum, or a period of indecision. It simplifies complex price data into a clean, color-coded visual representation, allowing you to see at a glance whether the market is trending strongly enough to warrant a position or if it is currently drifting in a neutral zone.

Miscellaneous
Implements a curve of type %1
10 Views
0 Downloads
0 Favorites
Aroon Oscilator_v1
//+------------------------------------------------------------------+
//|                                    Custom Aroon Oscilator_v1.mq4 |
//|                                                        rafcamara |
//|                                                                  |
//+------------------------------------------------------------------+
#property  copyright "rafcamara"
#property  link      "rafcamara@yahoo.com"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 4
#property  indicator_color1  DodgerBlue
#property  indicator_color2  Red
#property  indicator_color3  Snow
#property  indicator_color4  Green

//---- indicator parameters
extern int AroonPeriod=10;
extern int Filter=50;
extern int CountBars=300;

//---- indicator buffers
double     ind_buffer1[];
double     ind_buffer2[];
double     ind_buffer3[];

double     HighBarBuffer[];
double     LowBarBuffer[];
double     ArOscBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   
   //---- additional buffers are used for counting.
   IndicatorBuffers(6);
   SetIndexBuffer(4, HighBarBuffer);
   SetIndexBuffer(5, LowBarBuffer);
   SetIndexBuffer(3, ArOscBuffer);
   SetIndexBuffer(0, ind_buffer1);
   SetIndexBuffer(1, ind_buffer2);
   SetIndexBuffer(2, ind_buffer3);



   //---- drawing settings
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,1);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,1);
   SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,1);
   SetIndexStyle(3,DRAW_LINE,STYLE_SOLID,1);
   
   IndicatorDigits(0);
   //-- indicator buffers mapping
   if(!SetIndexBuffer(0,ind_buffer1) && !SetIndexBuffer(1,ind_buffer2)
   && !SetIndexBuffer(2,ind_buffer3))
      Print("cannot set indicator buffers!");
   //---- name for DataWindow and indicator subwindow label
   IndicatorShortName("Aroon Osc_v1("+AroonPeriod+", "+Filter+")");
   //---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Aroon Oscilator                                                  |
//+------------------------------------------------------------------+
int start()
  {
   if (CountBars>=Bars) CountBars=Bars;
   SetIndexDrawBegin(0,Bars-CountBars+AroonPeriod+1);
   SetIndexDrawBegin(1,Bars-CountBars+AroonPeriod+1);
   SetIndexDrawBegin(2,Bars-CountBars+AroonPeriod+1);
   double   ArOsc, HighBar=0,LowBar=0;
   int      ArPer; 
   int      limit,i;
//   bool     up,dn;
   int      counted_bars=IndicatorCounted();
   
   ArPer=AroonPeriod;
   //---- check for possible errors
   if(counted_bars<0) return(-1);
   
   //---- initial zero
   if(counted_bars<1)
     {
      for(i=1;i<=ArPer;i++) HighBarBuffer[CountBars-i]=0.0;
      for(i=1;i<=ArPer;i++) LowBarBuffer[CountBars-i]=0.0;
      for(i=1;i<=ArPer;i++) ArOscBuffer[CountBars-i]=0.0;
      for(i=1;i<=ArPer;i++) ind_buffer1[CountBars-i]=0.0;
      for(i=1;i<=ArPer;i++) ind_buffer2[CountBars-i]=0.0;
      for(i=1;i<=ArPer;i++) ind_buffer3[CountBars-i]=0.0;
     } 

   //---- last counted bar will be recounted
   //if(counted_bars>0) counted_bars--;
   limit=CountBars-AroonPeriod;

   //----Calculation---------------------------
   for( i=0; i<limit; i++)
   {
  	   HighBarBuffer[i] = Highest(NULL,0,MODE_HIGH,ArPer,i); 	//Periods from HH  	   
  	   LowBarBuffer[i] = Lowest(NULL,0,MODE_LOW,ArPer,i);		//Periods from LL

  	   ArOscBuffer[i]= 100*(LowBarBuffer[i]-HighBarBuffer[i])/ArPer;		//Short formulation
   }

   //---- dispatch values between 2 buffers
   for(i=limit-1; i>=0; i--)
     {
      ArOsc=ArOscBuffer[i];
      if(ArOsc>Filter)
        {
         ind_buffer1[i]=ArOsc;
         ind_buffer2[i]=0.0;
         ind_buffer3[i]=0.0;      
        }       
      if(ArOsc<-Filter)
        {
         ind_buffer1[i]=0.0;
         ind_buffer2[i]=ArOsc;
         ind_buffer3[i]=0.0;
        }
       if(ArOsc<=Filter && ArOsc>=-Filter)
       {
         ind_buffer1[i]=0.0;
         ind_buffer2[i]=0.0;
         ind_buffer3[i]=ArOsc;
       }  
     }
   //---- done
   return(0);
  }

Comments