HA ALert at candle close

 

What is the best way to change this code so that the alert only happens at the end of the candle once we know for sure whether it is going to be green or a red candle?


//+------------------------------------------------------------------+
//|                                                  Heiken Ashi.mq4 |
//|                      Copyright c 2004, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
//| For Heiken Ashi we recommend next chart settings ( press F8 or   |
//| select on menu 'Charts'->'Properties...'):                       |
//|  - On 'Color' Tab select 'Black' for 'Line Graph'                |
//|  - On 'Common' Tab disable 'Chart on Foreground' checkbox and    |
//|    select 'Line Chart' radiobutton                               |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
//----
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Red
#property indicator_color2 Green
#property indicator_color3 Red
#property indicator_color4 Green
//----
extern color color1 = Red;
extern color color2 = Green;
extern color color3 = Red;
extern color color4 = Green;
extern int alertsOn = true;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
//----
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//|------------------------------------------------------------------|
int init()
  {
//---- indicators
   SetIndexStyle(0, DRAW_HISTOGRAM, 0, 1, color1);
   SetIndexBuffer(0, ExtMapBuffer1);
   SetIndexStyle(1, DRAW_HISTOGRAM, 0, 1, color2);
   SetIndexBuffer(1, ExtMapBuffer2);
   SetIndexStyle(2, DRAW_HISTOGRAM, 0, 2, color3);
   SetIndexBuffer(2, ExtMapBuffer3);
   SetIndexStyle(3, DRAW_HISTOGRAM, 0, 2, color4);
   SetIndexBuffer(3, ExtMapBuffer4);
//----
   SetIndexDrawBegin(0, 10);
   SetIndexDrawBegin(1, 10);
   SetIndexDrawBegin(2, 10);
   SetIndexDrawBegin(3, 10);
//---- indicator buffers mapping
   SetIndexBuffer(0, ExtMapBuffer1);
   SetIndexBuffer(1, ExtMapBuffer2);
   SetIndexBuffer(2, ExtMapBuffer3);
   SetIndexBuffer(3, ExtMapBuffer4);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   double haOpen, haHigh, haLow, haClose;
   if(Bars <= 10) 
       return(0);
   ExtCountedBars = IndicatorCounted();
//---- check for possible errors
   if(ExtCountedBars < 0) 
       return(-1);
//---- last counted bar will be recounted
   if(ExtCountedBars > 0) 
       ExtCountedBars--;
   int pos = Bars - ExtCountedBars - 1;
   while(pos >= 0)
     {
       haOpen = (ExtMapBuffer3[pos+1] + ExtMapBuffer4[pos+1]) / 2;
       haClose = (Open[pos] + High[pos] + Low[pos] + Close[pos]) / 4;
       haHigh = MathMax(High[pos], MathMax(haOpen, haClose));
       haLow = MathMin(Low[pos], MathMin(haOpen, haClose));
       if(haOpen  <haClose) 
         {
           ExtMapBuffer1[pos] = haLow;
           ExtMapBuffer2[pos] = haHigh;
         } 
       else
         {
           ExtMapBuffer1[pos] = haHigh;
           ExtMapBuffer2[pos] = haLow;
         } 
       ExtMapBuffer3[pos] = haOpen;
       ExtMapBuffer4[pos] = haClose;
             pos--;
     }

if (alertsOn == true) {
   if (LastAlertTime < Time[0])
   {
      //how can I get haopen[0] compared to haOpen[1]
      if(haOpen<=haClose) current_direction = "LONG";
      if(haOpen>haClose) current_direction = "SHORT";
      Alert("New Candle Forming on ",Symbol()," TimeFrame: ",Period());
      LastAlertTime = Time[0];
   }
}

   return(0);
  }
//+------------------------------------------------------------------+
 
anyone?
 

the only way to know for 100% sure is to check Bar[1]

 
qjol:

the only way to know for 100% sure is to check Bar[1]


No, that won't work as I have to check the value of the last bar also.

if(haOpen<=haClose) current_direction = "LONG";

if(haOpen>haClose) current_direction = "SHORT";


So I need to compare haOpen and close from bar[i+1] and then also bar[0]

 
       
while(pos >= 0)
     {
       haOpen = (ExtMapBuffer3[pos+1] + ExtMapBuffer4[pos+1]) / 2;
       haClose = (Open[pos] + High[pos] + Low[pos] + Close[pos]) / 4;
       haHigh = MathMax(High[pos], MathMax(haOpen, haClose));
       haLow = MathMin(Low[pos], MathMin(haOpen, haClose));
       if(haOpen  <haClose) 
         {
           ExtMapBuffer1[pos] = haLow;
           ExtMapBuffer2[pos] = haHigh;
         } 
       else
         {
           ExtMapBuffer1[pos] = haHigh;
           ExtMapBuffer2[pos] = haLow;
         } 
       ExtMapBuffer3[pos] = haOpen;
       ExtMapBuffer4[pos] = haClose;
       
       //CHanged to bullish
       //draw on chart
       if (ExtMapBuffer3[pos] < ExtMapBuffer4[pos] &&
          ExtMapBuffer3[pos+1] > ExtMapBuffer4[pos+1]) //ie colour change
       {
         ChangeUp[pos] = ExtMapBuffer3[pos] + 0.0010;
       }
       //Alert - check one extra candle back to ensure we are checking closes
       if (ExtMapBuffer3[pos+1] < ExtMapBuffer4[pos+1] &&
          ExtMapBuffer3[pos+2] > ExtMapBuffer4[pos+2]) //ie colour change
       {
         AlertOnce ("We have to buy",1);
       }

       //changed to bearish
       //draw
       if (ExtMapBuffer3[pos] > ExtMapBuffer4[pos] &&
          ExtMapBuffer3[pos+1] < ExtMapBuffer4[pos+1]) //ie colour change
       {
         ChangeDown[pos] = ExtMapBuffer3[pos] + 0.0010;
       }
       //alert
       if (ExtMapBuffer3[pos+1] > ExtMapBuffer4[pos+1] &&
          ExtMapBuffer3[pos+2] < ExtMapBuffer4[pos+2]) //ie colour change
       {
         AlertOnce ("We have to sell",1);
       }
       
 	     pos--;
     }

This code here should only be checked on a new candle...but when it is the new candle it needs to check the previous candle.

So if pos+1 is green and at the close of pos[0] it changes to red then alert.

But I'm not sure how to code around the fact that a new candle will already be open.

Should I be checking pos+2 and pos+1?

Reason: