//+------------------------------------------------------------------+ //| 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 SteelBlue #property indicator_color2 Red //---- indicator parameters extern bool SoundON=true; extern bool EmailON=false; extern bool HistogramAlarm=true; extern bool ZeroLineAlarm=true; 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 ("\nOSMA: M", Period()," Trend has changed to UP"); if (MACDBelowZero) Comment ("\nOSMA: M", Period()," 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(Symbol()," M",Period()," 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(Symbol()," M",Period()," OSMA is Negative"); //"\n Time=",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(Symbol()," M",Period()," OSMA Histogram is Above 0"); //"\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(Symbol()," M",Period()," OSMA Histogram is Below 0");//"\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); }
Sample
Analysis
Market Information Used:
Indicator Curves created:
Implements a curve of type DRAW_HISTOGRAM
Indicators Used:
Moving average indicator
Custom Indicators Used:
Order Management characteristics:
Other Features:
It issuies visual alerts to the screen
It sends emails