OsMA_ColorHist_AlertNew

Download script
OsMA_ColorHist_AlertNew

This script is a specialized trading tool designed to analyze and visualize market momentum by calculating the Moving Average of an Oscillator (OsMA). It provides traders with a visual histogram and an automated notification system to identify shifts in price direction.

Core Logic and Calculations

The tool operates by processing three distinct layers of data:

  1. MACD Calculation: The script first calculates the standard MACD (Moving Average Convergence Divergence) by comparing two different moving averages—a "Fast" average and a "Slow" average. This identifies the gap between short-term price movements and long-term trends.
  2. Signal Line Generation: It then takes that MACD data and applies another moving average to it, creating what is known as a "Signal Line."
  3. OsMA Calculation: Finally, the script subtracts the Signal Line from the MACD value. This resulting figure is the OsMA. It represents the momentum of the trend, filtering out minor price fluctuations to show the underlying strength of the move.

Visual Representation

To make this data easy for a user to read at a glance, the script converts these numbers into a dynamic histogram:

  • Color Dynamics: The histogram changes appearance based on whether the current momentum is increasing or decreasing compared to the previous period.
    • If the value is rising, it highlights the upward movement.
    • If the value is falling, it highlights the downward movement.
  • Trend Tracking: The script monitors the position of the OsMA relative to the zero line, allowing traders to see instantly if the overall market sentiment is positive (above zero) or negative (below zero).

Automated Alerts and Notifications

One of the primary functions of this script is its ability to "watch" the market 24/7 and notify the user of specific events. The logic includes three main types of alerts:

  • Histogram Color Changes: Triggered when the momentum shifts direction (e.g., moving from an upward trend to a downward trend).
  • Zero Line Crossings: Triggered specifically when the OsMA crosses from negative to positive territory (potential buy signal) or positive to negative territory (potential sell signal).
  • Multi-Channel Delivery: Depending on the user's preferences, these alerts can be delivered via:
    • Sound Alerts: Audible pings within the trading platform.
    • Email Notifications: Direct messages sent to a registered email address.
    • On-Screen Comments: Textual updates displayed directly on the chart showing the current trend status.

In summary, this tool simplifies complex momentum math into a visual histogram that tells the user not just where the price is going, but how fast it is moving and when the trend is likely to reverse.

Price Data Components
Series array that contains open time of each bar
Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screenIt sends emails
13 Views
0 Downloads
0 Favorites
OsMA_ColorHist_AlertNew
//+------------------------------------------------------------------+
//|                                                         OsMA.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//|                                    Copyright © 2006, Robert Hill |
//|                                    Copyright © 2008, Linuxser    |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2006, Robert Hill"
#property  copyright "Copyright © 2008, Linuxser and Forex-TSD"
#property  link      "http://www.metaquotes.net/"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  DarkSeaGreen
#property  indicator_color2  Tomato

//---- indicator parameters
extern bool SoundON=true;
extern bool EmailON=false;
extern bool HistogramAlarm=false;
extern bool ZeroLineAlarm=false;
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=9;

//---- indicator buffers
double     OsmaBuffer[];
double     MacdBuffer[];
double     SignalBuffer[];
double HistogramBufferUp[];
double HistogramBufferDown[];
bool HistAboveZero = false;
bool HistBelowZero = false;
bool MACDAboveZero = false;
bool MACDBelowZero = false;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- 2 additional buffers are used for counting.
   IndicatorBuffers(5);
//---- drawing settings
   SetIndexDrawBegin(0,SignalSMA);
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID);
   SetIndexBuffer(0,HistogramBufferUp);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID);
   SetIndexBuffer(1,HistogramBufferDown);
   IndicatorDigits(Digits+2);
//---- 3 indicator buffers mapping
   SetIndexBuffer(2,OsmaBuffer);
   SetIndexBuffer(3,MacdBuffer);
   SetIndexBuffer(4,SignalBuffer);
   SetIndexBuffer(0,HistogramBufferUp);
   SetIndexBuffer(1,HistogramBufferDown);
   
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("OsMA("+FastEMA+","+SlowEMA+","+SignalSMA+")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Moving Average of Oscillator                                     |
//+------------------------------------------------------------------+
int start()
  {

   double current, prev;
   int limit;
   int counted_bars=IndicatorCounted();
//---- 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++)
      MacdBuffer[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++)
      SignalBuffer[i]=iMAOnArray(MacdBuffer,Bars,SignalSMA,0,MODE_SMA,i);
//---- main loop
   for(i=0; i<limit; i++)
      OsmaBuffer[i]=MacdBuffer[i]-SignalBuffer[i];

   for(i=0; i<limit; i++)
   {
      HistogramBufferUp[i] = 0;
      HistogramBufferDown[i] = 0;
      current = MacdBuffer[i] - SignalBuffer[i];
      prev = MacdBuffer[i+1] - SignalBuffer[i+1];
      if (current > prev)
      {
        HistogramBufferUp[i] = current;
        HistogramBufferDown[i] = 0.0;
      }
      else
      {
        HistogramBufferDown[i] = current;
        HistogramBufferUp[i] = 0.0;
      }
      
      if (MACDAboveZero) Comment ("\nThe trend has changed to UP");
      if (MACDBelowZero) Comment ("\nThe trend has changed to DOWN");
      
      if (i == 1)
      {
// Check for Histogram Change Color
        if  (HistogramAlarm==true)
        {
        if (HistogramBufferUp[i] > HistogramBufferDown[i + 1])
        {
// Cross up
         if (HistAboveZero == false)
         {
           HistAboveZero=true;
           HistBelowZero=false;
           if (SoundON) Alert("OSMA is Positive","\n Time=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()),"\n Symbol=",Symbol()," Period=",Period());
           if (EmailON) SendMail("OSMA is Positive", "MACD Crossed up, Date="+TimeToStr(CurTime(),TIME_DATE)+" "+TimeHour(CurTime())+":"+TimeMinute(CurTime())+" Symbol="+Symbol()+" Period="+Period());
         }
        }
        else if (HistogramBufferDown[i] <  HistogramBufferUp[i + 1] > 0)
        {
// Cross down
         if (HistBelowZero == false)
         {
          HistBelowZero=true;
          HistAboveZero=false;
          if (SoundON) Alert("OSMA is Negative","\n Date=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()),"\n Symbol=",Symbol()," Period=",Period());
          if (EmailON) SendMail("OSMA is Negative","MACD Crossed Down, Date="+TimeToStr(CurTime(),TIME_DATE)+" "+TimeHour(CurTime())+":"+TimeMinute(CurTime())+" Symbol="+Symbol()+" Period="+Period());
         }
        }
        }
// Check for MACD Signal line crossing 0 line
        if (ZeroLineAlarm==true)
        {
        if (OsmaBuffer[i] > 0 && OsmaBuffer[i + 1] < 0)
        {
// Cross up
         if (MACDAboveZero == false)
         {
           MACDAboveZero=true;
           MACDBelowZero=false;
           if (SoundON) Alert("Histogram is Above Zero Line","\n Time=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()),"\n Symbol=",Symbol()," Period=",Period());
           if (EmailON) SendMail("Histogram is Above Zero Line", "OSMA Crossed up, Date="+TimeToStr(CurTime(),TIME_DATE)+" "+TimeHour(CurTime())+":"+TimeMinute(CurTime())+" Symbol="+Symbol()+" Period="+Period());
         }
        }
        else if (OsmaBuffer[i] < 0 && OsmaBuffer[i + 1] > 0)
        {
// Cross down
         if (MACDBelowZero == false)
         {
          MACDBelowZero=true;
          MACDAboveZero=false;
          if (SoundON) Alert("Histogram is Below Zero Line","\n Date=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()),"\n Symbol=",Symbol()," Period=",Period());
          if (EmailON) SendMail("Histogram is Below Zero Line","OSMA Crossed Down, Date="+TimeToStr(CurTime(),TIME_DATE)+" "+TimeHour(CurTime())+":"+TimeMinute(CurTime())+" Symbol="+Symbol()+" Period="+Period());
         }
        }
      }
    }  
   }
      
//---- done
   return(0);
  }

Comments