Download MetaTrader 5

Need Help adding alert in 1 2 3 indicator

To add comments, please log in or register
Do you have Mac OS? Find out how to install MetaTrader on it!
Wei Quan Sim
114
Wei Quan Sim 2015.10.03 05:00 
Hi, experienced coders out there , please i need some help in adding alert sound when the 1 2 3 is printed on my chart , thank you for your kindness!!

Here is the code ..



#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Lime

extern int  maxbars=200;
extern int aggression=1;
extern string fontname="Arial Black";
extern int fontsize=8;
extern int PipTextHeight=0;

int oldmaxbars=0;
double estpiptexth=0.0;
int lastDNcheckpos=0;
int lastUPcheckpos=0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
//----
   
   return(0);
  }


void movemarkers(string obname)
{
   double yp=0;
   int obindx=0;
   string tstr;
   int pos;
   
   pos=0;
   while (Time[pos] > StrToDouble(StringSubstr(obname,7,StringLen(obname)-7))) pos++;

   
   if ((StringSubstr(obname,3,3) ==  "Dp2") || (StringSubstr(obname,3,3) ==  "Up1") || (StringSubstr(obname,3,3) ==  "Up3"))
   {
    /// move markers in bottom pos  
     yp = Low[pos];
     tstr ="123Dp2,"+StringSubstr(obname,7,StringLen(obname)-7);
     obindx = ObjectFind(tstr);
     if (obindx !=-1)
     {
      ObjectSet(tstr,OBJPROP_PRICE1,yp);
      yp=yp-estpiptexth;
     }
     
     tstr ="123Up1,"+StringSubstr(obname,7,StringLen(obname)-7);
     obindx = ObjectFind(tstr);
     if (obindx !=-1)
     {
      ObjectSet(tstr,OBJPROP_PRICE1,yp);
      yp=yp-estpiptexth;
     }

     tstr ="123Up3,"+StringSubstr(obname,7,StringLen(obname)-7);
     obindx = ObjectFind(tstr);
     if (obindx !=-1)
     {
      ObjectSet(tstr,OBJPROP_PRICE1,yp);
      yp=yp-estpiptexth;
     }
     
   }
   else
   {
    //move markers in top pos
     yp = High[pos]+estpiptexth;
     tstr ="123Up2,"+StringSubstr(obname,7,StringLen(obname)-7);
     obindx = ObjectFind(tstr);
     if (obindx !=-1)
     {
      ObjectSet(tstr,OBJPROP_PRICE1,yp);
      yp=yp+estpiptexth;
     }
     
     tstr ="123Dp1,"+StringSubstr(obname,7,StringLen(obname)-7);
     obindx = ObjectFind(tstr);
     if (obindx !=-1)
     {
      ObjectSet(tstr,OBJPROP_PRICE1,yp);
      yp=yp+estpiptexth;
     }

     tstr ="123Dp3,"+StringSubstr(obname,7,StringLen(obname)-7);
     obindx = ObjectFind(tstr);
     if (obindx !=-1)
     {
      ObjectSet(tstr,OBJPROP_PRICE1,yp);
      yp=yp+estpiptexth;
     }
    
   }
}

void deleteoldmarkers(string mtype,int frompos)
{
  int pos=0;
  string tstr;

   // delete old 123 text markers
   // if frompos = -1 then delete all markers
   // els delete markers younger than the date supplied
   
   pos = 0;
   while (pos < ObjectsTotal())
   {
      tstr = ObjectName(pos);
      if (StringSubstr(tstr,0,3+StringLen(mtype)) =="123"+mtype) 
      {
         if (frompos ==-1)
         {
          ObjectDelete(tstr);
          pos = 0;
         }
         else
         {
           if (StrToDouble(StringSubstr(tstr,7,StringLen(tstr)-7)) >= frompos)
           {
            ObjectDelete(tstr);
            //move any other markers at this point.
            movemarkers(tstr);
            pos = 0;
           }
           else pos++;
         }
      }
      else
      pos++;
   }   
}



//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   
   deleteoldmarkers("",-1);
   return(0);
  }


bool obinset(string obname,string typeset)
{

  if (typeset=="T")
  {
      // check if we have one 1 on top of price bar
      if ((StringSubstr(obname,0,6) =="123Dp1") || (StringSubstr(obname,0,6) =="123Dp3") ||
      (StringSubstr(obname,0,6) =="123Up2")) return(true); 
  }      
  else
  if (typeset=="B")
  {
      // check if we have one 1 on bottom of price bar
      if ((StringSubstr(obname,0,6) =="123Up1") || (StringSubstr(obname,0,6) =="123Up3") ||
      (StringSubstr(obname,0,6) =="123Dp2")) return(true);
  }
  return(false);
}


int findobatpos(int barnum,string pointtype,string typeset)
{
int inx=0;
int res=0;
string tstr;
string fstr;
   
   // count  markers at datetime supplied in barnum 
   /// if point type = "" then count any 123 marker type
   /// else only count markers of type detailed in pointtype
   /// return number of markers at Point
   inx = ObjectsTotal();
   while ((inx >=0)&& (res==0))
   {
      tstr = ObjectName(inx);
      fstr = "123"+pointtype;
      if (((StringSubstr(tstr,0,StringLen(fstr)) ==fstr) && (typeset =="")) || 
         ((typeset!= "") && (obinset(tstr,typeset)) ))
      {
         if (StrToDouble(StringSubstr(tstr,7,StringLen(tstr)-7)) == barnum)
         {
            res++;
            inx--;
            if (pointtype =="")
            {
               while (inx >=0)
               {
                  tstr = ObjectName(inx);
                  fstr = "123"+pointtype;
                  if (((StringSubstr(tstr,0,StringLen(fstr)) ==fstr) && (typeset=="")) ||
                     ((typeset!= "") && (obinset(tstr,typeset)) ))
                  {
                     if (StrToDouble(StringSubstr(tstr,7,StringLen(tstr)-7)) == barnum)
                     res++;
                  }
                 inx--;
               }
            }
            
         }
      }
      inx--;
   }
   
   return(res);   
}


double getestpiptexth()
{
double range=0;
int st=0;
double result;
int texth=0;

/// cacluate & return the estimated text height in pips

st=FirstVisibleBar();

st = st-BarsPerWindow();

if (st <0) st=0;

range =High[Highest(NULL,0,MODE_HIGH,BarsPerWindow(),st)];
   
range = range - Low[Lowest(NULL,0,MODE_LOW,BarsPerWindow(),st)];


// add 8% of range to estimate window height in pips
range = range+((range*0.08)*Point);

// scale the fontsize use result var cos we need a double not int
result = fontsize;
texth= MathRound((result /8)*4);


result = (Point*texth)*(range/(range/(range/(Point*100))));

if (result < Point ) result = Point;

return(result);

}


void CheckDowns()
  {
int pos=0;
int dn1pos =-1;
int dn2pos=-1;
int dn3pos=-1;
double yadj=0;



   //check for down 123s

   pos = lastDNcheckpos;

  


  while ((pos >0) && (!IsStopped() )) 
   {

      // get to bottom of down run if we are in one
      while ((pos >0) && (High[pos+1]>= High[pos])) pos--;

      /// find potential 1 & 2  
         while ((pos >0) && (dn1pos ==-1)) 
         {
          if (!(High[pos+1]<= High[pos]))
         {
           dn1pos =pos+1;
           dn2pos = pos;
         }
         else pos--;
         }

               
      pos--;
   
      //if we dont have a pos 3 then find one or invalidate pos1&2
        while ((pos>0) && (dn3pos==-1))
        {
        
         if (High[pos] >High[dn1pos]) 
         { 
            pos = dn1pos-1;
            dn1pos =-1;
            dn2pos =-1;
            dn3pos=-1;
            break;
         }
         else
         if (Low[pos]< Low[dn2pos]) 
         {
           dn2pos = pos;
           pos--;
         }
         else
         if (High[pos] > High[dn2pos])
         {          
         dn3pos = pos;
         }
         else pos--;
        } 
  
         // we have found a potential 3 so check if we have a higher bar 
         if (dn3pos !=-1)
         { 


            pos--;
            if (pos==0) 
            {
             if (High[0] > High[dn1pos]) dn3pos =-1;
            }
            else
            {

            //done = false;
            while ((pos >0)   && (dn3pos !=-1))
            {
               if (High[pos] > High[dn1pos])
               {
                  pos = dn1pos-1;
                  dn1pos =-1;
                  dn2pos=-1;
                  dn3pos=-1;
               }
               else 
               if ((Low[pos] < Low[dn3pos])&& (High[pos]<= High[dn3pos]))
               {
                break;
               }
               else
               if (High[pos] >= High[dn3pos]) 
               {
                dn3pos = pos;
                pos--;
               }
               else pos--;
            }   
                
            }
         }


      if ((dn1pos !=-1) && (dn2pos !=-1) && (dn3pos !=-1) )
      {
      
         
         if ((findobatpos(Time[dn1pos],"Dp3","") > 0) && (aggression <3)) 
         {
            if (aggression < 2 ) pos = dn2pos-1; else pos=dn1pos-1;
            dn1pos =-1;
            dn2pos=-1;
            dn3pos=-1;
         }
         else 
         if  ((findobatpos(Time[dn3pos],"Dp3","") > 0) && (aggression == 0))
         {
            if (aggression < 2 ) pos = dn2pos-1; else pos=dn1pos-1;
            dn1pos =-1;
            dn2pos=-1;
            dn3pos=-1;         
         }
         else
         {
         yadj= (findobatpos(Time[dn1pos],"","T")+1)*estpiptexth;
         if  (!IsStopped())
         {
         
         ObjectCreate("123Dp1,"+DoubleToStr(Time[dn1pos],0),OBJ_TEXT,0,Time[dn1pos],High[dn1pos]+yadj);
         ObjectSetText("123Dp1,"+DoubleToStr(Time[dn1pos],0),"1",fontsize,fontname,indicator_color1);
         }
         
         yadj = findobatpos(Time[dn2pos],"","B")*estpiptexth; 
         if  (!IsStopped())
         {
         ObjectCreate("123Dp2,"+DoubleToStr(Time[dn2pos],0),OBJ_TEXT,0,Time[dn2pos],Low[dn2pos]-yadj);
         ObjectSetText("123Dp2,"+DoubleToStr(Time[dn2pos],0),"2",fontsize,fontname,indicator_color1);
         }

         yadj= (findobatpos(Time[dn3pos],"","T")+1)*estpiptexth;
         if  (!IsStopped())
         {         
         ObjectCreate("123Dp3,"+DoubleToStr(Time[dn3pos],0),OBJ_TEXT,0,Time[dn3pos],High[dn3pos]+yadj);
         ObjectSetText("123Dp3,"+DoubleToStr(Time[dn3pos],0),"3",fontsize,fontname,indicator_color1);
         }
         lastDNcheckpos = Time[dn1pos];
         if (aggression < 2) pos = dn2pos-1; else pos=dn1pos-1;
         dn1pos =-1;
         dn2pos=-1;
         dn3pos=-1;
         }
    }
   }
  }


void CheckUps()
  {
int pos=0;
int up1pos =-1;
int up2pos=-1;
int up3pos=-1;
double yadj=0;


   //check for Up 123s

   pos = lastUPcheckpos;



  while ((pos >0) &&(!IsStopped())) 
   {

      // get to top of up run if we are in one
      while ((pos >0) && (Low[pos+1]<= Low[pos])) pos--;

      /// find potential 1 & 2  
         while ((pos >0) && (up1pos ==-1)) 
         {
          if (!(Low[pos+1]>= Low[pos]))
         {
           up1pos =pos+1;
           up2pos = pos;
         }
         else pos--;
         }

               
      pos--;
   
      //if we dont have a pos 3 then find one or invalidate pos1&2
        while ((pos>0) && (up3pos==-1))
        {
        
         if (Low[pos] <Low[up1pos]) 
         { 
            pos = up1pos-1;
            up1pos =-1;
            up2pos =-1;
            up3pos=-1;
            break;
         }
         else
         if (High[pos]> High[up2pos]) 
         {
           up2pos = pos;
           pos--;
         }
         else
         if (Low[pos] < Low[up2pos])
         {          
         up3pos = pos;
         }
         else pos--;
         
        } 
  
         // we have found a potential 3 so check if we have a higher bar 
         if (up3pos !=-1)
         { 


            pos--;
            if (pos==0) 
            {
             if (Low[0] < Low[up1pos]) up3pos =-1;
            }
            else
            {

            while ((pos >0) && (up3pos !=-1))
            {
               if (Low[pos] < Low[up1pos])
               {
                  pos = up1pos-1;
                  up1pos =-1;
                  up2pos=-1;
                  up3pos=-1;
               }
               else
               if ((High[pos] > High[up3pos])&& (Low[pos]>= Low[up3pos]))
               {
                break;
               }
               else
               if (Low[pos] <= Low[up3pos]) 
               {
                up3pos = pos;
                pos--;
               }
               else
               pos--;
            }   
                
            }
         }


      if ((up1pos !=-1) && (up2pos !=-1) && (up3pos !=-1))
      {
         if ((findobatpos(Time[up1pos],"Up3","") > 0) && (aggression <3))
         {
            if (aggression < 2) pos = up2pos-1; else pos=up1pos-1;
            up1pos =-1;
            up2pos=-1;
            up3pos=-1;
         }
         else
         if   ((findobatpos(Time[up3pos],"Up3","") > 0)&& (aggression ==0))
         {
            if (aggression < 2) pos = up2pos-1; else pos=up1pos-1;
            up1pos =-1;
            up2pos=-1;
            up3pos=-1;
         }
         else
         {
         yadj= (findobatpos(Time[up1pos],"","B"))*estpiptexth;
         if  (!IsStopped())
         {
         ObjectCreate("123Up1,"+DoubleToStr(Time[up1pos],0),OBJ_TEXT,0,Time[up1pos],Low[up1pos]-yadj);
         ObjectSetText("123Up1,"+DoubleToStr(Time[up1pos],0),"1",fontsize,fontname,indicator_color2);
         }
        
         yadj = (findobatpos(Time[up2pos],"","T")+1)*estpiptexth; 
         if  (!IsStopped())
         {
         ObjectCreate("123Up2,"+DoubleToStr(Time[up2pos],0),OBJ_TEXT,0,Time[up2pos],High[up2pos]+yadj);
         ObjectSetText("123Up2,"+DoubleToStr(Time[up2pos],0),"2",fontsize,fontname,indicator_color2);
         }
         
         yadj= (findobatpos(Time[up3pos],"","B"))*estpiptexth;
         if  (!IsStopped())
         {
         ObjectCreate("123Up3,"+DoubleToStr(Time[up3pos],0),OBJ_TEXT,0,Time[up3pos],Low[up3pos]-yadj);
         ObjectSetText("123Up3,"+DoubleToStr(Time[up3pos],0),"3",fontsize,fontname,indicator_color2);
         }
         lastUPcheckpos = Time[up1pos];
         if (aggression < 2) pos = up2pos-1; else pos=up1pos-1;
         up1pos =-1;
         up2pos=-1;
         up3pos=-1;
         }
     }
   }
  }



int start()
{
int tpos=0;
double tmpeh;
string tstr="";

if (IsStopped()) return(0);




// if user changed maxbars then force reset of all
   if (maxbars !=oldmaxbars)
   {
      oldmaxbars = maxbars;
      if (maxbars > Bars )
      {
         maxbars =Bars;
         oldmaxbars =maxbars;
      }
      estpiptexth =0.0;
   }

  
// see if everything needs to be recalced
  if (PipTextHeight == 0) 
  {
  //if user has not specified a piptext height then
    tmpeh =getestpiptexth();
    if (tmpeh != estpiptexth) 
    {
         estpiptexth = tmpeh;
         lastDNcheckpos = maxbars;
         lastUPcheckpos = maxbars;
         deleteoldmarkers("",-1);
    }

  }
   else
  {
               
      //if user has specified a piptext height then
      if (estpiptexth != (PipTextHeight *Point)) 
      {
        estpiptexth = (PipTextHeight *Point);
        lastDNcheckpos = maxbars;
        lastUPcheckpos = maxbars;
        deleteoldmarkers("",-1);
      }
   }



   if (lastUPcheckpos != maxbars) 
   {
      lastUPcheckpos =0;
      
       while ((lastUPcheckpos < maxbars) && (findobatpos(Time[lastUPcheckpos],"Up1","") == 0)) lastUPcheckpos++;   
       while ((lastUPcheckpos < maxbars) && (findobatpos(Time[lastUPcheckpos],"Up3","") == 0)) lastUPcheckpos++;   
       tpos = lastUPcheckpos+1;
       lastUPcheckpos--;
       
      if (aggression <2)  tstr = "Up2"; else tstr= "Up1";

      while ((tpos < maxbars) && (findobatpos(Time[tpos],tstr,"") == 0)) tpos++;   
      
      deleteoldmarkers("U",Time[lastUPcheckpos]);
      lastUPcheckpos = tpos-1;
   }


   if (lastDNcheckpos != maxbars) 
   {
      lastDNcheckpos =0;
      
      while ((lastDNcheckpos < maxbars) && (findobatpos(Time[lastDNcheckpos],"Dp1","") == 0)) lastDNcheckpos++;   
      while ((lastDNcheckpos < maxbars) && (findobatpos(Time[lastDNcheckpos],"Dp3","") == 0)) lastDNcheckpos++;   
      tpos = lastDNcheckpos+1;
      lastDNcheckpos--;
      
      if (aggression <2)  tstr = "Dp2"; else tstr= "Dp1";

      while ((tpos < maxbars) && (findobatpos(Time[tpos],tstr,"") == 0)) tpos++;   
      
      deleteoldmarkers("D",Time[lastDNcheckpos]);
      lastDNcheckpos = tpos-1;
   }

//Alert("UP : ",lastUPcheckpos," DN:"+lastDNcheckpos);

   if (!IsStopped())
   {
   CheckDowns();
   CheckUps();
   }

  RefreshRates();
  return(0);
}
//+------------------------------------------------------------------+
Files:
sshot-6.png 27 kb
To add comments, please log in or register