//| HMA4.mq4 | //| Copyright © 2004-08, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------ #property copyright "Copyright © 2004-08, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" //---- indicator settings #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 DodgerBlue #property indicator_width1 2 #property indicator_color2 Yellow #property indicator_width2 2 #property indicator_color3 Crimson #property indicator_width3 2 //---- indicator parameters extern string note1 = "Hull Moving Average Period"; extern int HMA_Period= 30; extern int MA_Shift=0; extern string note2 = "0=Simple,1=Exponential"; extern string note3 = "2=Smooth,3=Linear Weighted"; extern int MA_Method=3; extern string note4 = "0=High/Low,1=Close/Close"; extern int MA_Price=0; extern string note5 = "--------------------------------------------"; extern string note6 = "Filter # default = 2.0"; extern double FilterNumber = 2.0; extern string note7 = "Draw Dots = true"; extern string note8 = "Draw Lines = false"; extern bool DrawDots = true; extern string note9 = "--------------------------------------------"; extern int aTake_Profit = 48; extern int aStop_Loss = 38; extern string note10 = "--------------------------------------------"; extern string note11 = "turn on HMA Pop-up Alert = true"; extern string note12 = "turn off = false"; extern bool aAlerts = false; extern string note13 = "--------------------------------------------"; extern string note14 = "send HMA Email Alert = true"; extern string note15 = "turn off = false"; extern bool EmailOn = false; bool aTurnedUp = false; bool aTurnedDown = false; //---- indicator buffers double ind_buffer0[]; double ind_buffer1[]; double ind_buffer2[]; double buffer[]; int draw_begin0; string AlertPrefix; string GetTimeFrameStr() { switch(Period()) { case 1 : string TimeFrameStr="M1"; break; case 5 : TimeFrameStr="M5"; break; case 15 : TimeFrameStr="M15"; break; case 30 : TimeFrameStr="M30"; break; case 60 : TimeFrameStr="H1"; break; case 240 : TimeFrameStr="H4"; break; case 1440 : TimeFrameStr="D1"; break; case 10080 : TimeFrameStr="W1"; break; case 43200 : TimeFrameStr="MN1"; break; default : TimeFrameStr=Period(); } return (TimeFrameStr); } //+------------------------------------------------------------------ //| Custom indicator initialization function | //+------------------------------------------------------------------ int init() { //---- indicator buffers mapping IndicatorBuffers(4); if(!SetIndexBuffer(0,ind_buffer0) && !SetIndexBuffer(1,ind_buffer1) && !SetIndexBuffer(2,ind_buffer2) && !SetIndexBuffer(3, buffer)) Print("cannot set indicator buffers!"); // ArraySetAsSeries(ind_buffer1,true); //---- drawing settings if (DrawDots) { SetIndexStyle(0,DRAW_ARROW); SetIndexStyle(1,DRAW_ARROW); SetIndexStyle(2,DRAW_ARROW); SetIndexArrow(0,159); SetIndexArrow(1,159); SetIndexArrow(2,159); } else { SetIndexStyle(0,DRAW_LINE); SetIndexStyle(1,DRAW_LINE); SetIndexStyle(2,DRAW_LINE); } draw_begin0=HMA_Period+MathFloor(MathSqrt(HMA_Period)); SetIndexDrawBegin(0,draw_begin0); SetIndexDrawBegin(1,draw_begin0); SetIndexDrawBegin(2,draw_begin0); IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1); //---- name for DataWindow and indicator subwindow label IndicatorShortName("HMA("+HMA_Period+")"); SetIndexLabel(0,"Hull Moving Average"); //---- initialization done AlertPrefix=Symbol()+" ("+GetTimeFrameStr()+"): "; return(0); } //+------------------------------------------------------------------ //| Moving Averages Convergence/Divergence | //+------------------------------------------------------------------ int start() { int limit,i; int counted_bars=IndicatorCounted(); double tmp, tmpPrevious; //---- check for possible errors if(counted_bars<1) { for(i=1;i<=draw_begin0;i++) buffer[Bars-i]=0; for(i=1;i<=HMA_Period;i++) { ind_buffer0[Bars-i]=0; ind_buffer1[Bars-i]=0; ind_buffer2[Bars-i]=0; } } //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; //---- MA difference counted in the 1-st buffer for(i=0; i<limit; i++) { buffer[i]=iMA(NULL,0,MathFloor (HMA_Period/FilterNumber),MA_Shift,MA_Method,MA_Price,i)*2- //change the HMA_Period/xx will change when the colors chang at given rate iMA(NULL,0,HMA_Period,MA_Shift,MA_Method,MA_Price,i); } //---- HMA counted in the 0-th buffer tmp=iMAOnArray(buffer,0,MathFloor(MathSqrt(HMA_Period)),0,MA_Method,0); for(i=1; i<limit; i++) { tmpPrevious=iMAOnArray(buffer,0,MathFloor(MathSqrt (HMA_Period)),0,MA_Method,i); if (tmpPrevious > tmp) { ind_buffer0[i] = EMPTY_VALUE; ind_buffer1[i] = EMPTY_VALUE; ind_buffer2[i] = tmpPrevious; ind_buffer2[i-1] = tmp; // ! } else if (tmpPrevious < tmp) { ind_buffer0[i] = tmpPrevious; ind_buffer0[i-1] = tmp; // ! ind_buffer1[i] = EMPTY_VALUE; ind_buffer2[i] = EMPTY_VALUE; } else { ind_buffer0[i] = CLR_NONE; ind_buffer1[i] = tmpPrevious; ind_buffer2[i-1] = tmp; // ! ind_buffer2[i] = CLR_NONE; } if (aAlerts) { if (tmpPrevious < tmp) //change the wt[?] number will change when the signal will trigger based on # of last bars { if (!aTurnedUp) { if (BarChanged()) { Alert(AlertPrefix+"HMA "+(aRperiodf())+" Alert\nBUY signal @ Ask = $",Ask,"; Bid = $",Bid,"\nDate & Time = ",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime())); PlaySound("alert.wav"); if (EmailOn) { SendMail(AlertPrefix,"HMA Alert\nBUY signal @ Ask = $"+DoubleToStr(Ask,4)+", Bid = $"+DoubleToStr(Bid,4)+", Date & Time = "+TimeToStr(CurTime(),TIME_DATE)+" "+TimeHour(CurTime())+":"+TimeMinute(CurTime())+" Stop: "+ DoubleToStr(aGetSLl(),4)+" Limit: "+DoubleToStr(aGetTPl(),4)); } } aTurnedUp = true; aTurnedDown = false; } } if (tmpPrevious > tmp) //change the wt[?] number will change when the signal will trigger based on # of last bars { if (!aTurnedDown) { if (BarChanged()) { Alert(AlertPrefix+"HMA Alert\nSELL signal @ Ask = $",Ask,"; Bid = $",Bid,"\nDate & Time = ",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime())); PlaySound("alert.wav"); if (EmailOn) { SendMail(AlertPrefix,"HMA Alert\nSELL signal @ Ask = $"+DoubleToStr(Ask,4)+", Bid = $"+DoubleToStr(Bid,4)+", Date & Time = "+TimeToStr(CurTime(),TIME_DATE)+" "+TimeHour(CurTime())+":"+TimeMinute(CurTime())+" Stop: "+ DoubleToStr(aGetSLs(),4) +" Limit: "+DoubleToStr(aGetTPs(),4)); } } aTurnedDown = true; aTurnedUp = false; } } } tmp = tmpPrevious; } //---- done return(0); } bool BarChanged() { static datetime dt = 0; if (dt != Time[0]) { dt = Time[0]; return(true); } return(false); } //---- done return(0); double aGetTPs() { return(Bid-aTake_Profit*Point); } double aGetTPl() { return(Ask+aTake_Profit*Point); } double aGetSLs() { return(Bid+aStop_Loss*Point); } double aGetSLl() { return(Ask-aStop_Loss*Point); } int aRperiodf() { return(HMA_Period*Point*10000); }
Sample
Analysis
Market Information Used:
Series array that contains open time of each bar
Indicator Curves created:
Implements a curve of type DRAW_ARROW
Implements a curve of type DRAW_LINE
Indicators Used:
Moving average indicator
Custom Indicators Used:
Order Management characteristics:
Other Features:
It issuies visual alerts to the screen
It plays sound alerts
It sends emails