HMA_Modified_sigalert_001





//| 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