This tool is a specialized visual indicator designed to track market momentum and trend direction by analyzing the relationship between different moving averages. It operates as an oscillator, meaning it focuses on the "speed" and "strength" of price movements rather than just the price itself, making it easier to identify potential shifts in market sentiment.
Core Logic and Methodology
The logic follows a three-step process to filter out market noise and highlight significant trends:
1. Calculating Raw Momentum The script begins by comparing two different types of Exponential Moving Averages (EMA). By subtracting a slower moving average from a faster one, the tool creates a base momentum value. This tells the system whether the price is accelerating upward, downward, or remaining stagnant.
2. Creating a Signal Smoothing Layer To prevent the data from being too erratic or "jittery," the script takes that raw momentum and applies a second smoothing calculation (a Simple Moving Average). This produces a "Signal Line." By comparing the raw momentum against this smoothed signal line, the tool can determine the current trend's reliability.
3. Dynamic Visual Filtering (The "Rainbow" Effect) The most unique aspect of this script is how it categorizes and colors the data based on specific intensity thresholds:
- High Intensity Trends: When the difference between the momentum and the signal line exceeds a certain threshold, the tool highlights these as strong trends. These are visualized with distinct colors to alert the user to significant price action.
- Low Intensity / Neutral Zones: If the difference is very small (near zero), the script recognizes this as a "quiet" market. In these instances, it suppresses the visual data to keep the chart clean, only highlighting the bars when they cross a specific sensitivity point.
- Directional Identification: The logic automatically separates positive momentum from negative momentum, assigning different colors to each. This allows traders to instantly distinguish between bullish (upward) pressure and bearish (downward) pressure at a glance.
Summary for the User
In simple terms, this script acts as a sophisticated filter. It looks at how fast price is moving, smooths out the "noise" of minor fluctuations, and then highlights only the most significant movements. By using different colors for different strengths and directions, it helps you identify when a trend is gaining real power versus when the market is just drifting sideways.
//+------------------------------------------------------------------+
//| OsMA.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "colour update by thor@gmx.co.uk, Moneytec chat: thorr"
//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Maroon
#property indicator_color2 DarkGreen
#property indicator_color3 Lime
#property indicator_color4 OrangeRed
//---- indicator parameters
extern int FastEMA=8;
extern int SlowEMA=12;
extern int SignalSMA=9;
extern double thresh = 0.0001;
//---- indicator buffers
double ind_buffer0[];
double ind_buffer1[];
double ind_buffer2[];
double ind_buffer3[];
double ind_brighthi[];
double ind_brightlo[];
double res;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- 2 additional buffers are used for counting.
IndicatorBuffers(6);
//---- drawing settings
SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2);
SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2);
SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,2);
SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_SOLID,2);
SetIndexDrawBegin(0,SignalSMA);
SetIndexDrawBegin(1,SignalSMA);
SetIndexDrawBegin(2,SignalSMA);
SetIndexDrawBegin(3,SignalSMA);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2);
//---- 4 indicator buffers mapping
if(!SetIndexBuffer(0,ind_buffer0) &&
!SetIndexBuffer(1,ind_buffer1) &&
!SetIndexBuffer(2,ind_brighthi) &&
!SetIndexBuffer(3,ind_brightlo) &&
!SetIndexBuffer(4,ind_buffer2) &&
!SetIndexBuffer(5,ind_buffer3))
Print("cannot set indicator buffers!");
//---- name for DataWindow and indicator subwindow label
IndicatorShortName("RainbowOsMA("+FastEMA+","+SlowEMA+","+SignalSMA+")");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| Moving Average of Oscillator |
//+------------------------------------------------------------------+
int start()
{
int limit;
int counted_bars=IndicatorCounted();
//---- check for possible errors
if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
//---- macd counted in the 1-st additional buffer
for(int i=0; i<limit; i++)
ind_buffer3[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
//---- signal line counted in the 2-nd additional buffer
for(i=0; i<limit; i++)
ind_buffer2[i]=iMAOnArray(ind_buffer3,Bars,SignalSMA,0,MODE_SMA,i);
//---- main loop
for(i=limit-1; i>=0; i--)
{
res = ind_buffer3[i] - ind_buffer2[i];
// Sort it out now...
if (res < thresh && res > 0) {
ind_buffer1[i] = res;
ind_brighthi[i] = 0;
continue;
} else if (res > 0) {
ind_brighthi[i] = res;
ind_buffer1[i] = 0;
} else if (res > -thresh && res < 0) {
ind_brightlo[i] = 0;
ind_buffer0[i] = res;
continue;
} else if (res < 0)
ind_brightlo[i] = res;
ind_buffer0[i] = 0;
}
return(0);
}
Comments