//| HMA.mq4 | //| Copyright ?2004, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------ //mod +sig #property copyright "Copyright ?2004, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" //---- indicator settings #property indicator_chart_window #property indicator_buffers 5 #property indicator_color1 Blue #property indicator_color2 Yellow #property indicator_color3 Red #property indicator_color4 RoyalBlue #property indicator_color5 OrangeRed //---- indicator parameters extern int aTake_Profit = 250; extern int aStop_Loss = 500; extern int HMA_Period= 8; extern bool drawlines = 1; extern bool drawsig= 1; extern double arrowDist =0.55; extern bool aAlerts = false; extern bool EmailOn = false; bool aTurnedUp = false; bool aTurnedDown = false; //---- indicator buffers double ind_buffer0[]; double ind_buffer1[]; double ind_buffer2[]; double buffer[]; double sigbuffUp[]; double sigbuffDn[]; double hmabuff[]; int draw_begin0; //+------------------------------------------------------------------ //| Custom indicator initialization function | //+------------------------------------------------------------------ int init() { //---- indicator buffers mapping IndicatorBuffers(7); if(!SetIndexBuffer(0,ind_buffer0) && !SetIndexBuffer(1,ind_buffer1) && !SetIndexBuffer(2,ind_buffer2) && !SetIndexBuffer(6, buffer)) Print("cannot set indicator buffers!"); // ArraySetAsSeries(ind_buffer1,true); //---- drawing settings if (drawlines) { SetIndexStyle(0,DRAW_LINE); SetIndexStyle(1,DRAW_LINE); SetIndexStyle(2,DRAW_LINE); } else { SetIndexStyle(0,DRAW_NONE); SetIndexStyle(1,DRAW_NONE); SetIndexStyle(2,DRAW_NONE); } if (drawsig) { SetIndexStyle(3,DRAW_ARROW); SetIndexArrow(3,233); SetIndexEmptyValue(3,EMPTY_VALUE); SetIndexStyle(4,DRAW_ARROW); SetIndexArrow(4,234); SetIndexEmptyValue(4,EMPTY_VALUE); SetIndexBuffer(3,sigbuffUp); SetIndexBuffer(4,sigbuffDn); SetIndexBuffer(5,hmabuff); } draw_begin0=HMA_Period+MathFloor(MathSqrt(HMA_Period)); SetIndexDrawBegin(0,draw_begin0); SetIndexDrawBegin(1,draw_begin0); SetIndexDrawBegin(2,draw_begin0); SetIndexDrawBegin(3,draw_begin0); SetIndexDrawBegin(4,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 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 = limit; i >=0; i--) { buffer[i]=iMA(NULL,0,MathFloor (HMA_Period/1.5),0,MODE_LWMA,PRICE_CLOSE,i)*2- //change the HMA_Period/xx will change when the colors chang at given rate iMA(NULL,0,HMA_Period,0,MODE_LWMA,PRICE_CLOSE,i); } for(i = limit; i >=0; i--) { hmabuff[i]=iMAOnArray(buffer,0,MathFloor(MathSqrt(HMA_Period)),0,MODE_LWMA,i); sigbuffUp[i] = EMPTY_VALUE; sigbuffDn[i]= EMPTY_VALUE; if (hmabuff[i]>hmabuff[i+1]&& hmabuff[i+1]<=hmabuff[i+2]) sigbuffUp[i]= Low[i]-arrowDist*iATR(NULL,0,7,i); if (hmabuff[i]<hmabuff[i+1]&& hmabuff[i+1]>=hmabuff[i+2]) sigbuffDn[i]= High[i]+arrowDist*iATR(NULL,0,7,i); } //---- HMA counted in the 0-th buffer tmp=iMAOnArray(buffer,0,MathFloor(MathSqrt (HMA_Period)),0,MODE_LWMA,0); for(i=1; i<limit; i++) { tmpPrevious=iMAOnArray(buffer,0,MathFloor(MathSqrt (HMA_Period)),0,MODE_LWMA,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 ("Buy Entry - " + Symbol() + " " + "EMA " + aRperiodf() + " - Price: " + DoubleToStr(Ask,4)); PlaySound("phone_cellular.wav"); if (EmailOn) { SendMail("Buy Entry - "+(Symbol())+" "+"EMA"+(aRperiodf()),(Symbol())+" Price: "+DoubleToStr(Ask,4)+" Stop: "+ DoubleToStr(aGetSLl(),4) +" Limit: "+DoubleToStr(aGetTPl(),4)); //send email with entry price } } 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 ("Sell Entry - "+(Symbol())+" "+"EMA "+(aRperiodf())," - Price: "+DoubleToStr(Bid,4)); PlaySound("thunder_1.wav"); if (EmailOn) { SendMail("Sell Entry - "+(Symbol())+" "+"EMA"+(aRperiodf()),(Symbol())+" Price: "+DoubleToStr(Ask,4)+" Stop: "+ DoubleToStr(aGetSLs(),4) +" Limit: "+DoubleToStr(aGetTPs(),4)); //send email with entry price } } 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 the lowest prices of each bar
Series array that contains the highest prices of each bar
Series array that contains open time of each bar
Indicator Curves created:
Implements a curve of type DRAW_LINE
Implements a curve of type DRAW_NONE
Implements a curve of type DRAW_ARROW
Indicators Used:
Moving average indicator
Indicator of the average true range
Custom Indicators Used:
Order Management characteristics:
Other Features:
It plays sound alerts
It sends emails