OsMA_ColorHist_AlertNew
Download scriptThis 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:
- 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.
- Signal Line Generation: It then takes that MACD data and applies another moving average to it, creating what is known as a "Signal Line."
- 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.
//+------------------------------------------------------------------+
//| 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