Download MetaTrader 5

very slow optimization after 4 or 5 passes

To add comments, please log in or register
Do you have Mac OS? Find out how to install MetaTrader on it!
oneilljo
106
oneilljo 2013.06.17 18:26 

Hello all.  I'm currently optimizing my EA.  After 5 passes, I have 5 optimization results.  However, the next passes are running extremely slow.  I have tried restarting it multiple times, but I can't move forward with optimization.  If it is because of my code, then I don't know why the first few passes run quickly.  There is nothing in the journal that would suggest anything.  The only section of my code that is different than other EA's I have optimized before successfully is this:  (Note- bid_array and time_array are declared as global variables)

//--- allocate memory in the arrays for new elements  
   ArrayResize(bid_array,ArraySize(bid_array)+1);
   ArrayResize(time_array,ArraySize(time_array)+1);
//--- add the new elements to their proper arrays   
   bid_array[ArraySize(bid_array)-1]=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   time_array[ArraySize(time_array)-1]=TimeCurrent(); 
//--- find the index in the array at which tick data is too old  
   int too_old_index=0;     
   for(int i=ArraySize(time_array)-1; i>=0; i--)
     {
      datetime seconds_elapsed=time_array[ArraySize(time_array)-1]-time_array[i];
      MqlDateTime time_struct;
      TimeToStruct(seconds_elapsed,time_struct);
      if (time_struct.sec>MaxSeconds)
        {
         too_old_index=i+1;
         break;
        }
     }
//--- use aforementioned index to delete tick data that is too old     
   double temp_bid[];
   datetime temp_time[];   
   ArrayCopy(temp_bid,bid_array,0,too_old_index,WHOLE_ARRAY);
   ArrayCopy(temp_time,time_array,0,too_old_index,WHOLE_ARRAY);
   ArrayResize(time_array,ArraySize(temp_time));
   ArrayResize(bid_array,ArraySize(temp_bid));
   ArrayCopy(bid_array,temp_bid);
   ArrayCopy(time_array,temp_time);
//--- exit before trading if something has gone wrong gathering data
   if(ArraySize(bid_array)!= ArraySize(time_array)) return; 

 Perhaps it has something to do with "deleting" tick data that is too old by using ArrayCopy()?  And this is hazardous to the memory?  I am not sure.

 

I would appreciate any help solving this problem, let me know if there is any more information from my terminal that would be helpful.

Alain Verleyen
Moderator
30725
Alain Verleyen 2013.06.17 18:30  
oneilljo:

Hello all.  I'm currently optimizing my EA.  After 5 passes, I have 5 optimization results.  However, the next passes are running extremely slow.  I have tried restarting it multiple times, but I can't move forward with optimization.  If it is because of my code, then I don't know why the first few passes run quickly.  There is nothing in the journal that would suggest anything.  The only section of my code that is different than other EA's I have optimized before successfully is this:  (Note- bid_array and time_array are declared as global variables)

 Perhaps it has something to do with "deleting" tick data that is too old by using ArrayCopy()?  And this is hazardous to the memory?  I am not sure.

 

I would appreciate any help solving this problem, let me know if there is any more information from my terminal that would be helpful.

Can you post a screenshot of your settings for Strategy Tester please ?

EDIT: Where is this code executed ? in OnTick() ?

oneilljo
106
oneilljo 2013.06.17 18:48  
angevoyageur:

Can you post a screenshot of your settings for Strategy Tester please ?

EDIT: Where is this code executed ? in OnTick() ?

Yes, this code is executed in OnTick().  Here is a screenshot of the Settings Tab in the strategy tester.  Also, I tried optimizing the MACD sample from metaquotes, it runs just fine.

 

 

 

 

There is the journal.  Where it says "stopped by user" is when I stopped the running optimization of the MACD sample.  

Right now, the agents are processing tasks at about 0.1%/half hour.  This is much slower than the first 4 tasks. 

 

Alain Verleyen
Moderator
30725
Alain Verleyen 2013.06.17 19:30  
oneilljo:

Yes, this code is executed in OnTick().  Here is a screenshot of the Settings Tab in the strategy tester.  Also, I tried optimizing the MACD sample from metaquotes, it runs just fine.

 

 

That comes probably from your code, but I don't know why only after 5 passes.

Anyway as your code is executed on each tick, seems to me that makes a lot of work. Maybe you can start a profiling (in MetaEditor) to see how your code is ran and eventually detect bottleneck. What is the actual size of your arrays ?

oneilljo
106
oneilljo 2013.06.17 19:39  
angevoyageur:

That comes probably from your code, but I don't know why only after 5 passes.

Anyway as your code is executed on each tick, seems to me that makes a lot of work. Maybe you can start a profiling (in MetaEditor) to see how your code is ran and eventually detect bottleneck. What is the actual size of your arrays ?

The size of the arrays are usually only about 10-30 elements.  I ran this chunk of code in a data_tester EA, printing the size of the arrays and the latest elements each time to make sure it functioned correctly.  It seemed to run fine.  Huh.  I guess I'll learn about profiling.  Please let me know if you have any other suggestions.
Alain Verleyen
Moderator
30725
Alain Verleyen 2013.06.17 19:43  
oneilljo:
The size of the arrays are usually only about 10-30 elements.  I ran this chunk of code in a data_tester EA, printing the size of the arrays and the latest elements each time to make sure it functioned correctly.  It seemed to run fine.  Huh.  I guess I'll learn about profiling.  Please let me know if you have any other suggestions.

As your problem arises after 5 passes, may be the problem comes from your optimization parameters. How can they influence your arrays, or others portions of your code ?

What is the mean time for the 5 first passes ?

oneilljo
106
oneilljo 2013.06.21 08:00  
angevoyageur:

As your problem arises after 5 passes, may be the problem comes from your optimization parameters. How can they influence your arrays, or others portions of your code ?

What is the mean time for the 5 first passes ?

This was exactly the issue, angevoyageur, thank you for putting me on the right path.   The issue came from this section of code:

      datetime seconds_elapsed=time_array[ArraySize(time_array)-1]-time_array[i];
      MqlDateTime time_struct;
      TimeToStruct(seconds_elapsed,time_struct);
      if (time_struct.sec>MaxSeconds)

 

 I forgot that time_struct.sec would not take into account if the seconds were more than 60.  

 

Anyways, thank you for your great help. 

Alain Verleyen
Moderator
30725
Alain Verleyen 2013.06.21 10:01  
oneilljo:

This was exactly the issue, angevoyageur, thank you for putting me on the right path.   The issue came from this section of code:

 

 I forgot that time_struct.sec would not take into account if the seconds were more than 60.  

 

Anyways, thank you for your great help. 

Glad it works. You are welcome.
To add comments, please log in or register