Aroon_Oscilator_v1
Download scriptThis 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.
//+------------------------------------------------------------------+
//| 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