Aroon_Oscilator_v1

Download script
Aroon_Oscilator_v1

This custom Aroon Oscillator tool is designed to help traders identify and visualize market trends by analyzing the relationship between recent price highs and lows. Rather than just showing raw price movements, it translates these fluctuations into a structured visual format that helps distinguish between strong trending periods and neutral "sideways" markets.

How the Logic Works

The script operates through three distinct phases of data processing:

1. Data Gathering (Identifying Extremes) The tool begins by looking back over a specific number of recent candles (defined by the "Aroon Period"). During this look-back, it identifies the highest price point reached and the lowest price point hit within that timeframe. This establishes the boundaries of the market's recent behavior.

2. The Oscillator Calculation Once the highs and lows are identified, the script calculates an oscillator value. This value represents the distance between the recent low and the recent high, relative to the time period being observed. By calculating this difference, the tool quantifies the "momentum" or the "stretch" of the price movement.

3. Filtering and Visual Sorting To make the data readable for a human trader, the script passes the calculated value through a "Filter." It categorizes the results into three distinct visual components based on where they fall relative to this filter:

  • Bullish Momentum: If the oscillator value exceeds the positive threshold of the filter, it highlights a significant upward trend.
  • Bearish Momentum: If the oscillator value falls below the negative threshold of the filter, it identifies a significant downward trend.
  • Neutral/Consolidation: If the oscillator value stays within the boundaries of both the positive and negative filters, it indicates that the market is currently in a range-bound or sideways state with no clear dominant direction.

Summary for the User

The end result is a visual display that separates "noise" from "signal." Instead of a single messy line, the tool provides a clearer picture by isolating strong upward moves, strong downward moves, and periods of stability into separate graphical elements. This allows you to see at a glance whether the market is currently pushing in a specific direction or simply fluctuating within a tight corridor.

Miscellaneous
Implements a curve of type %1
19 Views
0 Downloads
0 Favorites
Aroon_Oscilator_v1
//+------------------------------------------------------------------+
//|                                    Custom Aroon Oscilator_v1.mq4 |
//|                                                        rafcamara |
//|                                       Has corrected - Ramdass    |
//+------------------------------------------------------------------+
#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);
   SetIndexDrawBegin(3,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