在MetaTrader 5策略测试器中分析测试结果并进行优化

Anatoli Kazharski  

让我们来看看对一个和几个字符的测试结果。测试将在All ticks 模式下进行。你可以使用你自己的多符号EA方案来重现这个问题并分享你的结果。

让我们来表示这个问题。例如,如果你测试一个符号,测试时间需要1分钟。如果再增加一个字符,测试需要4分钟,而不是预期的2分钟。如果我们再增加一个字符(共3个),测试时间是再增加一个字符的8倍,以此类推。

让我们试着找出测试所需时间比预期短的原因。其中一个原因可能是对账户历史的处理不正确。如果我们要求提供整个历史记录,随着历史记录的增加,可能会大大减慢测试时间。在这种情况下,测试开始时花费的时间将与测试结束时花费的时间有显著差异。当一个测试中有大量的交易(数以万计)时,可以很好地看到这一点。

如果在上述情况下一切操作正确,结果将如下表所示。最初的测试时间是固定的(2017.01.01)。然后,每次测试的时间范围都会增加一个月。当前和以前的结果之间的差异(差异 栏)将大致相同。对账户历史中的交易量 没有依赖性。

在测试中使用了一个专家顾问,其中指标正在运行,为检查条件要求提供条形和指标的数据,并执行交易。

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

在这种情况下,测试的总时间是37秒。使用两个符号的预期测试时间为37秒。x 2 =1分钟。14秒。而 对于三个符号37秒。x 3 =1分钟。51秒。

两个字符的测试结果。总测试时间2分钟。16秒。


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

三个字符的测试结果。总测试时间5分钟22秒。


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  

现在,让我们试着找出交易 是否以及对测试时间的影响程度。让我们完全禁用专家顾问中检查条件和进行交易的块,并再次对一个和几个符号进行一系列测试。让我们离开指标手柄和请求条形图和指标的数据。

在测试单个符号时,与之前的数据年(2017.01.01 - 2018.01. 01)的测试相比,测试时间减少了13秒。两个符号的预期测试时间为24秒。x 2 =48秒。 而对于三个字符24秒。x 3 =1分钟。12秒。


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

在测试两个字符时,与之前的数据年(2017.01.01 - 2018.01. 01)的测试相比,测试时间减少了31秒


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

当测试三个字符时,测试时间减少了1分钟。7秒,与之前的数据年(2017.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)

//---

在这个系列中也没有达到预期的测试时间。

Anatoli Kazharski  

现在让我们试着禁用获取指标句柄和请求数据的块。从本质上讲,它现在只是一个空白的专家顾问,在一个新的条形图 形成事件中只测试一个条件。

在测试一个符号时,与之前的数据年(2017.01.01 - 2018.01.01)的测试相比,测试时间减少了8秒。两个符号的预期测试时间为16秒。x 2 =32秒。 对于三个字符16秒。x 3 =48秒。 对于四个字符16秒。x 4 =1分钟。4秒。


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

对于双字测试,相对于数据年(2017.01.01-2018.01. 01)的前一次测试,测试时间减少了40秒


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

在测试三个字符时,与之前的数据年(2017.01.01-2018.01. 01)的测试相比,测试时间减少了1分38秒


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)

让我们再试试对数据年(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)

//---

在这个系列中也没有达到预期的测试时间。

Anatoli Kazharski  

问题。

是否有可能在MQL中创建一个多符号EA方案,以便在测试中添加字符时,测试的持续时间不会重复增加?

//---

如果这是不可能的,终端的开发者的选择之一是增加一种模式,这时你可以逐个符号 运行测试,而不是一次性运行所有符号。这将在最后产生预期的测试时间。问题是,多符号的EA很多时候只是用于那些情况。

  1. 需要更多的数据进行测试。
  2. 在更多的价格行为、条件(价差、止损/限价水平)等方面测试交易算法,参数相同。

正是在这种情况下,我们需要一种新的模式,使我们能够大大减少测试的时间并优化参数。而已经为最后的测试,同时测试所有的符号。

fxsaber  

专家顾问

#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。


一个符号

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


两个符号

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


三个符号。

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


似乎在可扩展性方面做得很好。

Anatoli Kazharski  
fxsaber:

...

在可扩展性方面,一切似乎都很好。

需要一个所有蜱虫进来的EA。通过每个符号上的指标的自定义事件。

关于交易、自动交易系统和交易策略测试的论坛

MT5中的多币种测试

fxsaber, 2016.11.13 14:04

这正是关于OnTick的调用。对于多币种的EA来说,只有两种正确的拼写方式(第二种是有缺陷的)。

  1. 多币种OnTick。它是通过首先发送每个符号的指标来实现的。其中,指标向OnCalculate发送一个自定义事件。在专家顾问本身中,OnChartEvent从所有指标中捕捉自定义事件并执行交易逻辑。这个专家顾问中的标准OnTick根本不存在。
  2. ...


Anatoli Kazharski  

把指标放在MQL5/指标中

//+------------------------------------------------------------------+
//|                                            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.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  

结果。

1个字符。

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个字符。

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个字符。

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个字符。

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个字符。

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  
还没有运行它,但这里似乎缺少一个亮点

关于交易、自动交易系统和策略测试的论坛

分析MetaTrader 5策略测试仪的测试和优化结果

Anatoli Kazharski, 2018.01.28 09:09

测试专家顾问。

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:
我还没有运行它,但它似乎缺少突出显示的内容

长参数(lparam)被检查。滴答事件的标识符被包含在其中。

用户事件的 标识符(int id)为零。

可以这样写,使之更加清晰。

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