Análise dos resultados dos testes e otimização no testador de estratégia MetaTrader 5

 

Vejamos os resultados dos testes em um e poucos caracteres. Os testes serão conduzidos no modo Todos os carrapatos. Você pode usar seus próprios esquemas multisímbolos EA para reproduzir o problema e compartilhar seus resultados.

Denotemos o problema. Por exemplo, se você testar um símbolo, o tempo de teste leva 1 minuto. Se outro personagem for adicionado, o teste leva 4 minutos, não 2 como esperado. Se adicionarmos mais um personagem (total de 3), o teste leva 8 vezes mais tempo do que para mais um personagem, e assim por diante.

Vamos tentar descobrir a razão pela qual o teste leva menos tempo do que o esperado. Uma das razões pode ser o manuseio incorreto do histórico da conta. Se solicitarmos todo o histórico, isso pode retardar significativamente o tempo de teste à medida que ele cresce. Neste caso, o tempo gasto no início do teste será significativamente diferente do tempo gasto no final do teste. Isto pode ser visto muito bem quando há muitas transações em um único teste (dezenas de milhares).

Se tudo for feito corretamente em relação ao caso acima, o resultado será o mostrado na tabela abaixo. O tempo de teste inicial é fixo(2017.01.01). E então, cada teste aumenta o intervalo de tempo em um mês. A diferença entre os resultados atuais e os anteriores ( coluna Diferença) será aproximadamente a mesma. Não há dependência da quantidade de negócios no histórico da conta.

Um Expert Advisor foi usado no teste, no qual os indicadores estão funcionando, os dados das barras e indicadores são solicitados para verificar as condições, e as negociações são executadas.

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

O tempo total do teste, neste caso, é de 37 segundos. Tempo de teste esperado usando dois símbolos 37 seg. x 2 = 1 minuto. 14 seg. E por três símbolos 37 seg. x 3 = 1 minuto. 51 seg.

Resultados de teste para dois caracteres. Tempo total de teste 2 min. 16 seg.


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

Resultados de teste para três caracteres. Tempo total de teste 5 min. 22 seg.


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)


 

Agora vamos tentar descobrir se e em que medida a comercialização afeta a duração do teste. Vamos desativar completamente o bloco para verificar as condições e fazer negócios no Expert Advisor e novamente conduzir uma série de testes para um e vários símbolos. Deixemos as alças dos indicadores e solicitemos dados sobre barras e indicadores.

Ao testar um símbolo, a duração do teste diminuiu 13 segundos em relação ao teste anterior para o ano de dados(2017.01.01.01 - 2018.01. 01). O tempo de teste esperado com dois símbolos é de 24 segundos. x 2 = 48 seg. E por três caracteres 24 segundos. x 3 = 1 minuto. 12 seg.


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

Ao testar dois caracteres, a duração do teste diminuiu em 31 segundos em relação ao teste anterior para o ano de dados(2017.01.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

Ao testar três caracteres, a duração do teste diminuiu em 1 minuto. 7 seg. em relação ao teste anterior para o ano de dados(2017.01.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)

//---

Os tempos de teste esperados também não são atendidos nesta série.

 

Agora vamos tentar desativar os blocos para obter alças indicadoras e solicitar dados. Basicamente, agora é apenas um Expert Advisor em branco onde apenas uma condição é testada para um novo evento de formação de barra.

Ao testar um símbolo, a duração do teste diminuiu 8 segundos em comparação com o teste anterior para o ano de dados(2017.01.01 - 2018.01. 01). O tempo de teste esperado com dois símbolos é de 16 segundos. x 2 = 32 seg. Para três caracteres 16 seg. x 3 = 48 seg. Por quatro caracteres 16 seg. x 4 = 1 minuto. 4 seg.


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

Para o teste de dois caracteres, a duração do teste diminuiu em 40 segundos em relação ao teste anterior para o ano de dados(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

Ao testar três caracteres, a duração do teste diminuiu 1 minuto e 38 segundos em comparação com o teste anterior para o ano de dados(2017.01.01.01 - 2018.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)

Vamos tentar outro teste com quatro caracteres para o ano de dados(2017.01.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)

//---

Os tempos de teste esperados também não são atendidos nesta série.

 

Pergunta:

É possível criar um esquema EA de múltiplos símbolos em MQL para que a duração dos testes não aumente repetidamente quando os caracteres são adicionados ao teste?

//---

Se isto não for possível, uma das opções para os desenvolvedores do terminal é adicionar mais um modo, quando você pode executar o teste símbolo por símbolo, em vez de todos os símbolos de uma vez. Isto produziria o tempo de teste esperado no final. A questão é que os EAs com múltiplos símbolos são muito freqüentemente usados simplesmente para aqueles casos em que:

  1. Mais dados são necessários para os testes.
  2. Para testar o algoritmo de negociação em uma maior variedade de comportamento de preços, condições (spread, níveis de parada/limite), etc., com os mesmos parâmetros.

É para tais casos que precisamos de um novo modo que nos permita reduzir significativamente a duração dos testes e otimizar os parâmetros. E já para o teste final para testar todos os símbolos simultaneamente.

 

Consultor especializado

#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, sem defasagem, apenas agente Core1, carrapatos reais 01.09.2017 - 26.01.2018.


Um símbolo

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


Dois símbolos

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


Três símbolos.

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


Parece estar indo bem com a escalabilidade.

 
fxsaber:

...

Tudo parece estar bem com a escalabilidade.

Precisa de um EA onde todos os carrapatos entrem. Através de eventos personalizados a partir de indicadores em cada símbolo.

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Teste Multimoedas em MT5

fxsaber, 2016.11.13 14:04

É exatamente sobre a chamada OnTick. Para EAs com várias moedas, existem apenas duas variantes de ortografia correta (a segunda tem falhas)

  1. Multimoedas OnTick. Ele é implementado enviando primeiro o indicador para cada símbolo. Onde o indicador envia um Evento personalizado para a OnCalculate. No próprio Expert Advisor OnChartEvent captura o Evento personalizado de todos os indicadores e executa a lógica comercial. O OnTick padrão neste Expert Advisor simplesmente não está lá.
  2. ...


 

Colocar o indicador em MQL5/Indicadores

//+------------------------------------------------------------------+
//|                                            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);
  }
//+------------------------------------------------------------------+
 

Examinador de testes:

//+------------------------------------------------------------------+
//|                                                         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]+"");
     }
  }
//+------------------------------------------------------------------+
 

Resultados.

1 personagem:

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 caracteres:

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 caracteres:

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 caracteres:

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 caracteres:

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)
 
Ainda não foi executado, mas parece estar faltando um destaque aqui

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Análise dos resultados de testes e otimização no MetaTrader 5 Strategy Tester

Anatoli Kazharski, 2018.01.28 09:09

Consultor Especialista em Testes:

void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Если было событие "тик"
   if(lparam==CHARTEVENT_TICK + CHARTEVENT_CUSTOM)
     {
      Strategy();
      return;
     }
  }
 
fxsaber:
Eu ainda não o executei, mas parece faltar o destaque

O parâmetro longo (lparam) é verificado. O identificador do evento do tick está contido nele.

O identificador do evento do usuário (int id) é igual a zero.

Pode ser escrito desta forma para torná-lo mais claro:

//+------------------------------------------------------------------+
//| 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;
     }
  }
Razão: