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