Download MetaTrader 5
To add comments, please log in or register
Do you have questions to the application's developer - ask them in Comments section
Paolo Borsa
18
Paolo Borsa 2016.03.01 18:36 

Hi all.

I have inserted this code in my EA:

if (TimeHour(TimeCurrent())>=7 && TimeHour(TimeCurrent())<=18)

    {time_OK=true;}

    else {time_OK=false;}

 

 The backtest period going from 28 february 2015 to 28 february 2016. However, the ea operates only in march 2015(where it starts) and in february 2016. The other months are stop at  "else" of the code. 

 

Why? Must i use "MqlDateTime& dt_struct" in TimeCurrent?

Thanks all.
whroeder1
13610
whroeder1 2016.03.01 19:03  
  1. This can be simplified
    if (TimeHour(TimeCurrent())>=7 && TimeHour(TimeCurrent())<=18){
       time_OK=true;
    }else{
       time_OK=false;
    }
    What you wrote
    if (aBool){
       time_OK=aBool;
    }else{
       time_OK=aBool;
    }
    Simplified.
    time_OK=TimeHour(TimeCurrent())>=7 && TimeHour(TimeCurrent())<=18;
    
    You would never write if( (2+2 == 4) == true) would you? if(2+2 == 4) is sufficient. So Don't write if(bool == true), just use if(bool) or if(!bool). Code becomes self documenting when you use meaningful variable names, like bool isLongEnabled. Long_Entry sounds like a trigger price or a ticket number and "if long entry" is an incomplete sentence.

  2. The other months are stop at  "else" of the code.
    Impossible; the code finishes the if/else and continues there after. Your problem is elsewhere. Put a print statements (including variable values) after and find out why.
  3. Must i use "MqlDateTime& dt_struct" in TimeCurrent?
    Not if you want the current time.
Paolo Borsa
18
Paolo Borsa 2016.03.01 20:29  

Hi, excuse me, I explained bad.

if (TimeHour(TimeCurrent())>=7 && TimeHour(TimeCurrent())<=18){
   time_OK=true;
}else{
   time_OK=false;
}
if (time_OK=true)
{ ....EA is all in here...}

Impossible; the code finishes the if/else and continues there after. Your problem is elsewhere. Put a print statements (including variable values) after and find out why.

Infact, i have used "else" only for detect this problem through print, and EA stops here. 

Same mistake if I catch the last 3 month, it opens only a position on the 1st of dicembre. I' m starting to think that is a problem of historical data... I' m using tickstory.

Paolo Borsa
18
Paolo Borsa 2016.03.02 20:03  

I have found the problem. A stupid error.

if (TimeHour(TimeCurrent())>=7 && TimeHour(TimeCurrent())<=18)

    {time_OK=true;)    

   

 

if(time_OK==true)

{

if (giro==0)

{

  if (TIME>=7 && TIME<12)                //

     { if (TimeHour(TimeCurrent())>12 && TimeHour(TimeCurrent())<18)     

            {giro=1;}

}

         

   if (TIME>=12 && TIME<24)              //

       {if (TimeHour(TimeCurrent())>=7 && TimeHour(TimeCurrent())<12)

            {giro=1;}

}

                       

  if (TIME>=0 && TIME<7) // THIS WAS THE PROBLEM. I HAVE FORGOTTEN TO SELECT THE TIME OF ORDERCLOSE, IF IT HAD HAPPENED BETWEEN 0 AND 6. IN THIS CASE "giro" COULD NOT CHANGE THEIR STATUS. 

   {if (TimeHour(TimeCurrent())>=7 && TimeHour(TimeCurrent())<12) //

            giro=1;} //

}

}



if (giro==1)

{


total=OrdersTotal();

Symb=Symbol();                             

                                        

   for(int i=1; i>=OrdersTotal(); i++)                      

     {

      if (OrderSelect(i-1,SELECT_BY_POS)==true) // If

        {                                       //

         if (OrderSymbol()==Symb)      // 

             {

              ticket=OrderTicket();

              prezzo=OrderOpenPrice();

              SL=prezzo-15*Point;

              TP=prezzo+20*Point;//

            RefreshRates();

         if ((Bid>=TP)||(Ask<=SL))

         {

         ans=OrderClose(ticket,lotti,Ask,2,red);

         if (ans==true)

            {

             Print("ordine chiuso");

             contabarre=0;

             giro=0;

             TIME=Hour(); 

             return(0);

            }

             }

             

             return(0);}                                     //

             }  

           else 

           {

        

           break;                                             //

           

           } 

      }   

 


Sorry for the loss of time, bye.
whroeder1
13610
whroeder1 2016.03.02 21:03  
Don't paste code
Play video
Please edit your post.
For large amounts of code, attach it.
Vasyl Nosal
18208
Vasyl Nosal 2016.03.02 23:26  

And another one.

To do not call functione twice(or more)

if (TimeHour(TimeCurrent())>=7 && TimeHour(TimeCurrent())<=18)
Better to write like this
int hours_=TimeHour(TimeCurrent());
if (hours_>=7 && hours_<=18)
/
To add comments, please log in or register