RainbowOsMA

RainbowOsMA

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.

Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
18 Views
0 Downloads
0 Favorites
RainbowOsMA
//+------------------------------------------------------------------+
//|                                                         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