Aroon_Oscillator_v1

Download script
Aroon_Oscillator_v1

This custom indicator is designed to help traders visualize market trends by analyzing the relationship between recent price highs and lows. It functions as a modified version of an "Oscillator," which translates complex price movements into a simplified visual format in a separate window on your trading platform.

Core Logic and Functionality

The script operates through three primary stages: Data Collection, Calculation, and Visual Filtering.

1. Data Collection & Range Analysis The indicator looks back at a specific number of bars (defined by the AroonPeriod) to identify two key pieces of information:

  • The highest price reached during that time.
  • The lowest price reached during that time.

By identifying these boundaries, the script establishes the "boundaries" of recent market activity.

2. The Oscillator Calculation Once it identifies the highs and lows, the script calculates a specific value based on the difference between them. It essentially measures how far the current low is relative to the highest point in the period. This calculation produces a numerical value that fluctuates based on the intensity of the price movement.

3. Trend Filtering (The Visual Output) The most unique feature of this script is how it organizes the data visually. Instead of showing one continuous line, it categorizes the market activity into three distinct visual elements based on a "Filter" threshold:

  • Bullish Strength: When the calculated value exceeds the positive filter, the indicator highlights the data in one color (Dodger Blue). This represents strong upward momentum.
  • Bearish Strength: When the calculated value falls below the negative filter, it switches to a different color (Red), indicating strong downward momentum.
  • Neutral Zone: When the value stays within the boundaries of the filter (the "middle ground"), it displays in a third color (Snow). This suggests a period of consolidation or indecision where the market isn't showing a clear trend in either direction.

Summary for the User

In plain terms, this tool filters out "market noise." Instead of forcing you to interpret every tiny price wiggle, it waits until the price movement is significant enough to cross your chosen filter. It then tells you—via distinct colors—whether the market is currently trending up, trending down, or simply moving sideways.

Miscellaneous
Implements a curve of type %1
16 Views
0 Downloads
0 Favorites
Aroon_Oscillator_v1
//+------------------------------------------------------------------+
//|                                  Custom Aroon Oscillator_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("AroonOsc_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