Analysis of test results and optimisation in the MetaTrader 5 strategy tester

Anatoli Kazharski  

Let's look at the results of the tests on one and a few characters. The tests will be conducted in All ticks mode. You can use your own multisymbol EA schemes to reproduce the problem and share your results.

Let us denote the problem. For example, if you test one symbol, the test time takes 1 minute. If another character is added, the test takes 4 minutes, not 2 as expected. If we add one more character (total of 3), the test takes 8 times as long as for one more character, and so on.

Let's try to find out the reason why the test takes less time than expected. One of the reasons could be incorrect handling of account history. If we request the whole history, it may significantly slow down the test time as it grows. In this case, the time spent at the beginning of the test will be significantly different from the time spent at the end of the test. This can be seen very well when there are a lot of transactions in one test (tens of thousands).

If everything is done correctly with respect to the above case, the result will be as shown in the table below. The initial test time is fixed(2017.01.01). And then, each test increases the time range by one month. The difference between the current and previous results ( Difference column) will be approximately the same. There is no dependence on the amount of trades in the account history.

An Expert Advisor has been used in the test, in which the indicators are running, the data of bars and indicators is requested for checking the conditions, and trades are executed.

2018.01.27 18:10:50.318 Core 1  EURUSD,M5: 26169180 ticks, 74266 bars generated. Environment synchronized in 0:00:00.031. Test passed in 0:00:36.641 (including ticks preprocessing 0:00:01.297).
2018.01.27 18:10:50.318 Core 1  EURUSD,M5: total time from login to stop testing 0:00:36.672 (including 0:00:00.031 for history data synchronization)
2018.01.27 18:10:50.318 Core 1  891 Mb memory used including 8 Mb of history data, 512 Mb of tick data

The total time of the test in this case is 37 seconds. Expected test time using two symbols 37 sec. x 2 = 1 min. 14 sec. And for three symbols 37 sec. x 3 = 1 min. 51 sec.

Test results for two characters. Total test time 2 min. 16 sec.


2018.01.27 18:13:49.957 Core 1  EURUSD,M5: 26169180 ticks, 74266 bars generated. Environment synchronized in 0:00:00.031. Test passed in 0:02:16.125 (including ticks preprocessing 0:00:01.344).
2018.01.27 18:13:49.957 Core 1  EURUSD,M5: total time from login to stop testing 0:02:16.156 (including 0:00:00.046 for history data synchronization)
2018.01.27 18:13:49.957 Core 1  53911219 total ticks for all symbols
2018.01.27 18:13:49.957 Core 1  EURUSD: passed to tester 26169180 ticks
2018.01.27 18:13:49.957 Core 1  GBPUSD: generate 27742039 ticks in 0:00:01.344, passed to tester 27742039 ticks
2018.01.27 18:13:49.957 Core 1  1497 Mb memory used including 17 Mb of history data, 1024 Mb of tick data

Test results for three characters. Total test time 5 min. 22 sec.


2018.01.27 18:20:07.658 Core 1  EURUSD,M5: 26169180 ticks, 74266 bars generated. Environment synchronized in 0:00:00.062. Test passed in 0:05:22.360 (including ticks preprocessing 0:00:03.547).
2018.01.27 18:20:07.658 Core 1  EURUSD,M5: total time from login to stop testing 0:05:22.422 (including 0:00:00.062 for history data synchronization)
2018.01.27 18:20:07.658 Core 1  86509916 total ticks for all symbols
2018.01.27 18:20:07.658 Core 1  EURUSD: passed to tester 26169180 ticks
2018.01.27 18:20:07.658 Core 1  GBPUSD: passed to tester 27742039 ticks
2018.01.27 18:20:07.658 Core 1  USDJPY: generate 32598697 ticks in 0:00:03.547, passed to tester 32598697 ticks
2018.01.27 18:20:07.658 Core 1  2090 Mb memory used including 26 Mb of history data, 1472 Mb of cached tick data (total memory for tick data 1663 Mb)


Anatoli Kazharski  

Now let's try to find out if and how much trading affects the test duration. Let's completely disable the block for checking conditions and making trades in the Expert Advisor and again conduct a series of tests for one and several symbols. Let us leave the indicator handles and requesting data on bars and indicators.

When testing a single symbol, the test duration has decreased by 13 seconds compared to the previous test for the data year(2017.01.01 - 2018.01. 01). The expected test time with two symbols is 24 sec. x 2 = 48 sec. And for three characters 24 sec. x 3 = 1 min. 12 sec.


2018.01.27 16:20:50.271 Core 1  EURUSD,M5: 26169180 ticks, 74266 bars generated. Environment synchronized in 0:00:00.047. Test passed in 0:00:23.640.
2018.01.27 16:20:50.271 Core 1  EURUSD,M5: total time from login to stop testing 0:00:23.687 (including 0:00:00.047 for history data synchronization)
2018.01.27 16:20:50.271 Core 1  823 Mb memory used including 8 Mb of history data, 512 Mb of tick data

When testing two characters, the test duration decreased by 31 seconds compared to the previous test for the data year(2017.01.01 - 2018.01.01).


2018.01.27 16:24:23.759 Core 1  EURUSD,M5: 26169180 ticks, 74266 bars generated. Environment synchronized in 0:00:00.047. Test passed in 0:01:44.469 (including ticks preprocessing 0:00:01.422).
2018.01.27 16:24:23.759 Core 1  EURUSD,M5: total time from login to stop testing 0:01:44.516 (including 0:00:00.047 for history data synchronization)
2018.01.27 16:24:23.759 Core 1  53911219 total ticks for all symbols
2018.01.27 16:24:23.759 Core 1  EURUSD: passed to tester 26169180 ticks
2018.01.27 16:24:23.759 Core 1  GBPUSD: generate 27742039 ticks in 0:00:01.422, passed to tester 27742039 ticks
2018.01.27 16:24:23.759 Core 1  1409 Mb memory used including 17 Mb of history data, 1024 Mb of tick data

When testing three characters, the test duration decreased by 1 min. 7 sec. compared to the previous test for the data year(2017.01.01.01 - 2018.01. 01).


2018.01.27 16:30:07.790 Core 1  EURUSD,M5: 26169180 ticks, 74266 bars generated. Environment synchronized in 0:00:00.062. Test passed in 0:04:21.141 (including ticks preprocessing 0:00:04.312).
2018.01.27 16:30:07.790 Core 1  EURUSD,M5: total time from login to stop testing 0:04:21.203 (including 0:00:00.062 for history data synchronization)
2018.01.27 16:30:07.790 Core 1  86509916 total ticks for all symbols
2018.01.27 16:30:07.790 Core 1  EURUSD: passed to tester 26169180 ticks
2018.01.27 16:30:07.790 Core 1  GBPUSD: passed to tester 27742039 ticks
2018.01.27 16:30:07.790 Core 1  USDJPY: generate 32598697 ticks in 0:00:04.312, passed to tester 32598697 ticks
2018.01.27 16:30:07.790 Core 1  1863 Mb memory used including 26 Mb of history data, 1408 Mb of cached tick data (total memory for tick data 1663 Mb)

//---

The expected test times are not met in this series either.

Anatoli Kazharski  

Now let's try to disable the blocks for getting indicator handles and requesting data. Basically now it's just a blank Expert Advisor, which tests only one condition on a new bar formation event.

When testing one symbol, the test duration has decreased by 8 seconds compared to the previous test for the data year(2017.01.01 - 2018.01.01). The expected test time with two symbols is 16 sec. x 2 = 32 sec. For three characters 16 sec. x 3 = 48 sec. For four characters 16 sec. x 4 = 1 min. 4 sec.


2018.01.27 17:49:39.855 Core 1  EURUSD,M5: 26169180 ticks, 74266 bars generated. Environment synchronized in 0:00:00.062. Test passed in 0:00:16.438 (including ticks preprocessing 0:00:01.281).
2018.01.27 17:49:39.855 Core 1  EURUSD,M5: total time from login to stop testing 0:00:16.500 (including 0:00:00.062 for history data synchronization)
2018.01.27 17:49:39.855 Core 1  787 Mb memory used including 8 Mb of history data, 512 Mb of tick data

For the two-character test, the test duration decreased by 40 seconds relative to the previous test for the data year(2017.01.01 - 2018.01. 01).


2018.01.27 17:51:35.343 Core 1  EURUSD,M5: 26169180 ticks, 74266 bars generated. Environment synchronized in 0:00:00.032. Test passed in 0:01:04.593 (including ticks preprocessing 0:00:01.359).
2018.01.27 17:51:35.343 Core 1  EURUSD,M5: total time from login to stop testing 0:01:04.625 (including 0:00:00.048 for history data synchronization)
2018.01.27 17:51:35.343 Core 1  53911219 total ticks for all symbols
2018.01.27 17:51:35.343 Core 1  EURUSD: passed to tester 26169180 ticks
2018.01.27 17:51:35.343 Core 1  GBPUSD: generate 27742039 ticks in 0:00:01.359, passed to tester 27742039 ticks
2018.01.27 17:51:35.343 Core 1  1336 Mb memory used including 17 Mb of history data, 1024 Mb of tick data

When testing three characters, the test duration decreased by 1 minute 38 seconds compared to the previous test for the data year(2017.01.01.01 - 2018.01. 01.01).


2018.01.27 17:55:00.938 Core 1  EURUSD,M5: 26169180 ticks, 74266 bars generated. Environment synchronized in 0:00:00.047. Test passed in 0:02:41.000 (including ticks preprocessing 0:00:02.766).
2018.01.27 17:55:00.938 Core 1  EURUSD,M5: total time from login to stop testing 0:02:41.047 (including 0:00:00.063 for history data synchronization)
2018.01.27 17:55:00.938 Core 1  86509916 total ticks for all symbols
2018.01.27 17:55:00.938 Core 1  EURUSD: passed to tester 26169180 ticks
2018.01.27 17:55:00.938 Core 1  GBPUSD: passed to tester 27742039 ticks
2018.01.27 17:55:00.938 Core 1  USDJPY: generate 32598697 ticks in 0:00:02.766, passed to tester 32598697 ticks
2018.01.27 17:55:00.938 Core 1  1892 Mb memory used including 26 Mb of history data, 1536 Mb of cached tick data (total memory for tick data 1663 Mb)

Let's try another test on four characters for the data year(2017.01.01.01 - 2018.01. 01).


2018.01.27 18:00:24.607 Core 1  EURUSD,M5: 26169180 ticks, 74266 bars generated. Environment synchronized in 0:00:02.266. Test passed in 0:04:30.140 (including ticks preprocessing 0:00:05.125).
2018.01.27 18:00:24.607 Core 1  EURUSD,M5: total time from login to stop testing 0:04:32.406 (including 0:00:02.375 for history data synchronization)
2018.01.27 18:00:24.607 Core 1  107227636 total ticks for all symbols
2018.01.27 18:00:24.607 Core 1  AUDUSD: generate 20717720 ticks in 0:00:05.125, passed to tester 20717720 ticks
2018.01.27 18:00:24.607 Core 1  EURUSD: passed to tester 26169180 ticks
2018.01.27 18:00:24.607 Core 1  GBPUSD: passed to tester 27742039 ticks
2018.01.27 18:00:24.607 Core 1  USDJPY: passed to tester 32598697 ticks
2018.01.27 18:00:24.607 Core 1  1680 Mb memory used including 35 Mb of history data, 1280 Mb of cached tick data (total memory for tick data 2047 Mb)

//---

The expected test times are not met in this series as well.

Anatoli Kazharski  

Question:

Is it possible to create a multisymbol EA scheme in MQL so that the duration of the tests does not increase repeatedly when characters are added to the test?

//---

If this is not possible, one of the options for the developers of the terminal is to add one more mode, when you can run the test symbol by symbol, rather than all symbols at once. This would produce the expected test time in the end. The point is that multisymbol EAs are very often used simply for those cases where:

  1. More data is needed for tests.
  2. To test the trading algorithm on a larger variety of price behaviour, conditions (spread, stop/limit levels), etc., with the same parameters.

It is for such cases we need a new mode that would allow us to significantly reduce the duration of tests and optimize parameters. And already for the final test to test all symbols simultaneously.

fxsaber  

Expert Advisor

#include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int AmountSymbols = 1;

double Sum2 = 0;
const bool Init = EventSetTimer(1);

double GetBid( const string Symb )
{
  static MqlTick Tick;      

  return(SymbolInfoTick(Symb, Tick) ? Tick.bid : 0);
}

void OnTimer()
{
  static const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD"};
  
  for (int i = 0; i < AmountSymbols; i++)    
    Sum2 += GetBid(Symbols[i]);
}

void OnTick()
{
}

void OnDeinit( const int )
{
  Print(Sum2);
}

EURUSD M1 MetaQuotes-Demo, Hedge, USD, no lag, Core1-agent only, real ticks 01.09.2017 - 26.01.2018.


One symbol

i = 0 Pass = 0 OnTester = 3.728 s.: Count = 9753093, 2616173.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 3.727 s.: Count = 9753093, 2616875.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Two symbols

i = 0 Pass = 0 OnTester = 7.946 s.: Count = 9753093, 1227421.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 7.614 s.: Count = 9753093, 1280942.1 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Three symbols.

i = 0 Pass = 0 OnTester = 10.300 s.: Count = 9753093, 946902.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 10.236 s.: Count = 9753093, 952822.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Seems to be doing fine with scalability.

Anatoli Kazharski  
fxsaber:

...

Everything seems to be fine with scalability.

Need an EA where all the ticks come in. Through custom events from indicators on each symbol.

Forum on trading, automated trading systems and trading strategy testing

Multicurrency testing in MT5

fxsaber, 2016.11.13 14:04

It's exactly about the OnTick call. For multicurrency EAs there are only two variants of correct spelling (the second one is flawed)

  1. Multicurrency OnTick. It is implemented by first sending the indicator for each symbol. Where the indicator sends a custom Event to OnCalculate. In the Expert Advisor itself OnChartEvent catches the custom Event from all indicators and carries out the trading logic. The standard OnTick in this Expert Advisor is simply not there.
  2. ...


Anatoli Kazharski  

Put the indicator in MQL5/Indicators

//+------------------------------------------------------------------+
//|                                            EventsSpyTickOnly.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2018, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//---
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Перечисление событий                                             |
//+------------------------------------------------------------------+
enum ENUM_CHART_EVENT_SYMBOL
  {
   CHARTEVENT_INIT =0,         // Событие "инициализация" 
   CHARTEVENT_NO   =0,         // События отключены
   CHARTEVENT_TICK =0x00200000 // Событие "новый тик"
  };
//--- Внешние параметры
input long                    chart_id;                 // идентификатор графика-получателя события
input ushort                  custom_event_id;          // идентификатор события  
input ENUM_CHART_EVENT_SYMBOL flag_event=CHARTEVENT_NO; // флаг, определяющий тип события.
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double& price[])

  {
   if(prev_calculated==0)
     {
      EventCustom(CHARTEVENT_INIT);
      return(rates_total);
     }
//--- New tick
   if(flag_event==CHARTEVENT_TICK)
      EventCustom(CHARTEVENT_TICK);
//--- Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Пользовательское событие                                         |
//+------------------------------------------------------------------+
void EventCustom(ENUM_CHART_EVENT_SYMBOL event)
  {
   EventChartCustom(chart_id,custom_event_id,(long)event,0.0,_Symbol);
  }
//+------------------------------------------------------------------+
Anatoli Kazharski  

Test examiner:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2018, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//+------------------------------------------------------------------+
//| Перечисление событий                                             |
//+------------------------------------------------------------------+
enum ENUM_CHART_EVENT_SYMBOL
  {
   CHARTEVENT_INIT =0,         // Событие "инициализация" 
   CHARTEVENT_NO   =0,         // События отключены
   CHARTEVENT_TICK =0x00200000 // Событие "новый тик"
  };
//--- Внешние параметры
input int AmountSymbols=1;
//---
static const string symbols[]={"EURUSD","GBPUSD","AUDUSD","USDJPY","USDCAD"};
long spy_indicator_handles[];
//---
double     sum2 =0;
const bool init =EventSetTimer(1);
//+------------------------------------------------------------------+ 
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   GetSpyHandles();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int)
  {
   Print(sum2);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer(void)
  {
   //Strategy();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(void)
  {
   //Strategy();
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Если было событие "тик"
   if(lparam==CHARTEVENT_TICK)
     {
      Strategy();
      return;
     }
  }
//+------------------------------------------------------------------+
//| Get bid price                                                    |
//+------------------------------------------------------------------+
double GetBid(const string Symb)
  {
   static MqlTick Tick;
   return(SymbolInfoTick(Symb, Tick)? Tick.bid : 0);
  }
//+------------------------------------------------------------------+
//| Strategy                                                         |
//+------------------------------------------------------------------+
void Strategy(void)
  {
   for(int i=0; i<AmountSymbols; i++)
      sum2+=GetBid(symbols[i]);
  }
//+------------------------------------------------------------------+
//| Получает хэндлы агентов по указанным символам                    |
//+------------------------------------------------------------------+
void GetSpyHandles(void)
  {
   string path="EventsSpyTickOnly.ex5";
//---
   ::ArrayResize(spy_indicator_handles,AmountSymbols);
//--- Пройдемся по всем символам
   for(int s=0; s<AmountSymbols; s++)
     {
      //--- Получим хэндл индикатора
      spy_indicator_handles[s]=::iCustom(symbols[s],::Period(),path,::ChartID(),0,CHARTEVENT_TICK);
      //--- Если не удалось получить хэндл индикатора
      if(spy_indicator_handles[s]==INVALID_HANDLE)
         ::Print("Failed to install agent on "+symbols[s]+"");
     }
  }
//+------------------------------------------------------------------+
Anatoli Kazharski  

Results.

1 character:

2018.01.28 11:10:29.325 Core 1  EURUSD,M5 (MetaQuotes-Demo): every tick generating
2018.01.28 11:10:29.325 Core 1  EURUSD,M5: testing of Experts\Test.ex5 from 2017.01.01 00:00 to 2018.01.01 00:00 started with inputs:
2018.01.28 11:10:29.325 Core 1    AmountSymbols=1

2018.01.28 11:10:49.279 Core 1  final balance 10000.00 USD
2018.01.28 11:10:49.279 Core 1  2017.12.29 23:59:59   64793248.54125572
2018.01.28 11:10:49.279 Core 1  EURUSD,M5: 26169180 ticks, 74266 bars generated. Environment synchronized in 0:00:00.032. Test passed in 0:00:26.015.
2018.01.28 11:10:49.279 Core 1  EURUSD,M5: total time from login to stop testing 0:00:26.047 (including 0:00:00.032 for history data synchronization)
2018.01.28 11:10:49.279 Core 1  778 Mb memory used including 8 Mb of history data, 512 Mb of tick data

2 characters:

2018.01.28 11:11:49.343 Core 1  EURUSD,M5 (MetaQuotes-Demo): every tick generating
2018.01.28 11:11:49.343 Core 1  EURUSD,M5: testing of Experts\Test.ex5 from 2017.01.01 00:00 to 2018.01.01 00:00 started with inputs:
2018.01.28 11:11:49.343 Core 1    AmountSymbols=2

2018.01.28 11:13:18.421 Core 1  final balance 10000.00 USD
2018.01.28 11:13:18.421 Core 1  2017.12.29 23:59:59   411044644.6801022
2018.01.28 11:13:18.421 Core 1  EURUSD,M5: 26169180 ticks, 74266 bars generated. Environment synchronized in 0:00:00.032. Test passed in 0:01:35.203 (including ticks preprocessing 0:00:01.360).
2018.01.28 11:13:18.421 Core 1  EURUSD,M5: total time from login to stop testing 0:01:35.235 (including 0:00:00.047 for history data synchronization)
2018.01.28 11:13:18.421 Core 1  53911219 total ticks for all symbols
2018.01.28 11:13:18.421 Core 1  EURUSD: passed to tester 26169180 ticks
2018.01.28 11:13:18.421 Core 1  GBPUSD: generate 27742039 ticks in 0:00:01.360, passed to tester 27742039 ticks
2018.01.28 11:13:18.421 Core 1  1330 Mb memory used including 17 Mb of history data, 1024 Mb of tick data

3 characters:

2018.01.28 11:14:27.847 Core 1  EURUSD,M5 (MetaQuotes-Demo): every tick generating
2018.01.28 11:14:27.847 Core 1  EURUSD,M5: testing of Experts\Test.ex5 from 2017.01.01 00:00 to 2018.01.01 00:00 started with inputs:
2018.01.28 11:14:27.847 Core 1    AmountSymbols=3

2018.01.28 11:17:43.325 Core 1  final balance 10000.00 USD
2018.01.28 11:17:43.325 Core 1  2017.12.29 23:59:59   1009249102.577681
2018.01.28 11:17:43.325 Core 1  EURUSD,M5: 26169180 ticks, 74266 bars generated. Environment synchronized in 0:00:00.047. Test passed in 0:03:21.750 (including ticks preprocessing 0:00:01.047).
2018.01.28 11:17:43.325 Core 1  EURUSD,M5: total time from login to stop testing 0:03:21.797 (including 0:00:00.156 for history data synchronization)
2018.01.28 11:17:43.325 Core 1  74628939 total ticks for all symbols
2018.01.28 11:17:43.325 Core 1  AUDUSD: generate 20717720 ticks in 0:00:01.047, passed to tester 20717720 ticks
2018.01.28 11:17:43.325 Core 1  EURUSD: passed to tester 26169180 ticks
2018.01.28 11:17:43.325 Core 1  GBPUSD: passed to tester 27742039 ticks
2018.01.28 11:17:43.325 Core 1  1750 Mb memory used including 26 Mb of history data, 1408 Mb of tick data

4 characters:

2018.01.28 11:19:02.758 Core 1  EURUSD,M5 (MetaQuotes-Demo): every tick generating
2018.01.28 11:19:02.758 Core 1  EURUSD,M5: testing of Experts\Test.ex5 from 2017.01.01 00:00 to 2018.01.01 00:00 started with inputs:
2018.01.28 11:19:02.758 Core 1    AmountSymbols=4

2018.01.28 11:25:57.059 Core 1  final balance 10000.00 USD
2018.01.28 11:25:57.059 Core 1  2017.12.29 23:59:59   63985236406.09325
2018.01.28 11:25:57.059 Core 1  EURUSD,M5: 26169180 ticks, 74266 bars generated. Environment synchronized in 0:00:00.078. Test passed in 0:07:00.531 (including ticks preprocessing 0:00:06.719).
2018.01.28 11:25:57.059 Core 1  EURUSD,M5: total time from login to stop testing 0:07:00.609 (including 0:00:00.078 for history data synchronization)
2018.01.28 11:25:57.059 Core 1  107227636 total ticks for all symbols
2018.01.28 11:25:57.059 Core 1  AUDUSD: passed to tester 20717720 ticks
2018.01.28 11:25:57.059 Core 1  EURUSD: passed to tester 26169180 ticks
2018.01.28 11:25:57.059 Core 1  GBPUSD: passed to tester 27742039 ticks
2018.01.28 11:25:57.059 Core 1  USDJPY: generate 32598697 ticks in 0:00:06.719, passed to tester 32598697 ticks
2018.01.28 11:25:57.059 Core 1  1985 Mb memory used including 35 Mb of history data, 1600 Mb of cached tick data (total memory for tick data 2047 Mb)

5 characters:

2018.01.28 11:27:00.683 Core 1  EURUSD,M5 (MetaQuotes-Demo): every tick generating
2018.01.28 11:27:00.683 Core 1  EURUSD,M5: testing of Experts\Test.ex5 from 2017.01.01 00:00 to 2018.01.01 00:00 started with inputs:
2018.01.28 11:27:00.683 Core 1    AmountSymbols=5

2018.01.28 11:38:47.355 Core 1  final balance 10000.00 USD
2018.01.28 11:38:47.355 Core 1  2017.12.29 23:59:59   94559190795.58774
2018.01.28 11:38:47.355 Core 1  EURUSD,M5: 26169180 ticks, 74266 bars generated. Environment synchronized in 0:00:00.266. Test passed in 0:11:54.015 (including ticks preprocessing 0:00:08.734).
2018.01.28 11:38:47.355 Core 1  EURUSD,M5: total time from login to stop testing 0:11:54.281 (including 0:00:00.500 for history data synchronization)
2018.01.28 11:38:47.355 Core 1  130637614 total ticks for all symbols
2018.01.28 11:38:47.355 Core 1  AUDUSD: generate 20717720 ticks in 0:00:01.078, passed to tester 20717720 ticks
2018.01.28 11:38:47.355 Core 1  EURUSD: generate 26169180 ticks in 0:00:01.281, passed to tester 26169180 ticks
2018.01.28 11:38:47.355 Core 1  GBPUSD: generate 27742039 ticks in 0:00:01.406, passed to tester 27742039 ticks
2018.01.28 11:38:47.355 Core 1  USDCAD: generate 23409978 ticks in 0:00:01.188, passed to tester 23409978 ticks
2018.01.28 11:38:47.355 Core 1  USDJPY: generate 32598697 ticks in 0:00:03.781, passed to tester 32598697 ticks
2018.01.28 11:38:47.355 Core 1  2735 Mb memory used including 44 Mb of history data, 2304 Mb of cached tick data (total memory for tick data 2495 Mb)
fxsaber  
Haven't run it yet, but it seems to be missing a highlight here

Forum on trading, automated trading systems and strategy testing

Analysis of Testing and Optimization Results in MetaTrader 5 Strategy Tester

Anatoli Kazharski, 2018.01.28 09:09

Test Expert Advisor:

void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Если было событие "тик"
   if(lparam==CHARTEVENT_TICK + CHARTEVENT_CUSTOM)
     {
      Strategy();
      return;
     }
  }
Anatoli Kazharski  
fxsaber:
I haven't run it yet, but it seems to be missing the highlighted

The long parameter (lparam) is checked. The identifier of the tick event is contained in it.

The identifier of the user event (int id) is zero.

It may be written in this way to make it clearer:

//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Если было пользовательское событие
   if(id>=CHARTEVENT_CUSTOM)
     {
      //--- Если было событие "тик"
      if(lparam==CHARTEVENT_TICK)
        {
         Strategy();
         return;
        }
      return;
     }
  }
Reason: