OsMA Color

This tool is a specialized technical analysis indicator designed to help traders visualize momentum and trend direction in the financial markets. It functions by calculating and transforming standard moving average data into a visual histogram that highlights the "velocity" of price movements.

Core Logic and Functionality

The script operates through three primary layers of logic:

1. Data Foundation (The Moving Averages) At its core, the script processes three distinct types of moving averages using user-definable periods (Fast, Slow, and Signal). By calculating the relationship between a fast-moving average and a slow-moving average, the tool identifies the underlying momentum of the asset. It uses a weighted pricing model to ensure that more recent price actions have a significant impact on the current reading.

2. Momentum Calculation The script calculates an "Oscillator" value based on these moving averages. This value represents the gap between the short-term trend and the long-term trend. When this value is positive, it suggests upward momentum; when negative, it suggests downward momentum.

3. Visual Differentiation and Trend Tracking What makes this specific script unique is how it translates those raw numbers into a visual histogram. Instead of just showing a simple line, the logic analyzes the direction of change between the current price point and the previous one:

  • Trend Identification: The script determines if the momentum is currently "Up" or "Down."
  • Dynamic Coloring: It assigns specific colors to the histogram based on two simultaneous conditions: whether the momentum is positive/negative and whether that momentum is increasing or decreasing.
    • It distinguishes between strengthening trends (where the movement is gaining speed) and weakening trends (where the movement is slowing down).
    • By doing this, the visual output provides a multi-dimensional view: you can see not just where the price is going, but whether that movement has "energy" behind it or is losing steam.

User Experience

For the end-user, this logic results in a dynamic visual representation in a separate window below the main price chart. By observing the color shifts and the height of the histogram bars, a trader can quickly identify trend reversals, momentum exhaustion, and potential entry or exit points based on the "health" of the current market move.

Indicators Used
Moving Average of Oscillator
Miscellaneous
Implements a curve of type %1
9 Views
0 Downloads
0 Favorites
OsMA Color
//+------------------------------------------------------------------+
//|                                                         OsMA.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2004, MetaQuotes Software Corp."
#property  link      "http://www.metaquotes.net/"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 4
#property  indicator_color1  LimeGreen
#property  indicator_color2  Green
#property  indicator_color3  Red
#property  indicator_color4  Maroon

//#property  indicator_level1  0.0003
//#property  indicator_level2  -0.0003

//---- indicator buffers
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=9;

double     ind_buffer1[], ind_buffer1s[];
double     ind_buffer2[], ind_buffer2s[];
double     ind_buffer3[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- 1 additional buffer used for counting.
   IndicatorBuffers(5);
   //---- drawing settings
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,4);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,4);
   SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,4);
   SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_SOLID,4);
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1);
   SetIndexDrawBegin(0,34);
   SetIndexDrawBegin(1,34);
   SetIndexDrawBegin(3,34);
   SetIndexDrawBegin(4,34);
//---- 3 indicator buffers mapping
   if(!SetIndexBuffer(0,ind_buffer1) &&
      !SetIndexBuffer(1,ind_buffer1s) &&
      !SetIndexBuffer(2,ind_buffer2) &&
      !SetIndexBuffer(3,ind_buffer2s) &&
      !SetIndexBuffer(4,ind_buffer3))
      Print("cannot set indicator buffers!");
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("OsMA("+FastEMA+","+SlowEMA+","+SignalSMA+")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current;
//---- 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]=iOsMA(NULL,0,FastEMA,SlowEMA,SignalSMA,PRICE_WEIGHTED,i);
//---- dispatch values between 2 buffers
   bool up=true;
   for(i=limit-1; i>=0; i--)
     {
      current=ind_buffer3[i];
      prev=ind_buffer3[i+1];
      if (((current<0)&&(prev>0))||(current<0))   up= false;    
      if (((current>0)&&(prev<0))||(current>0))   up= true;      
      
      if(!up)
        {
         if(current > prev)
           {
            ind_buffer2s[i]=current;
            ind_buffer2[i]=0.0;
            ind_buffer1[i]=0.0;
            ind_buffer1s[i]=0.0;             
           }        
         else
           {
            ind_buffer2[i]=current;
            ind_buffer2s[i]=0.0;
            ind_buffer1[i]=0.0;
            ind_buffer1s[i]=0.0;            
           }             
        }
        else
        {
         if(current < prev)
           {
            ind_buffer1s[i]=current;
            ind_buffer1[i]=0.0;
            ind_buffer2[i]=0.0;
            ind_buffer2s[i]=0.0;
           }
        else
           {
            ind_buffer1[i]=current;
            ind_buffer1s[i]=0.0;
            ind_buffer2[i]=0.0;
            ind_buffer2s[i]=0.0;
            }           
         }       
     }
//---- done
   return(0);
  }

Comments