现在,让我们试着找出交易 是否以及对测试时间的影响程度。让我们完全禁用专家顾问中检查条件和进行交易的块,并再次对一个和几个符号进行一系列测试。让我们离开指标手柄和请求条形图和指标的数据。
在测试单个符号时,与之前的数据年(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)
//---
在这个系列中也没有达到预期的测试时间。
现在让我们试着禁用获取指标句柄和请求数据的块。从本质上讲,它现在只是一个空白的专家顾问,在一个新的条形图 形成事件中只测试一个条件。
在测试一个符号时,与之前的数据年(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)
//---
在这个系列中也没有达到预期的测试时间。
专家顾问
#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
似乎在可扩展性方面做得很好。
把指标放在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); } //+------------------------------------------------------------------+
测试考官。
//+------------------------------------------------------------------+ //| 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]+""); } } //+------------------------------------------------------------------+
结果。
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)
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; } }
我还没有运行它,但它似乎缺少突出显示的内容
长参数(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; } }
让我们来看看对一个和几个字符的测试结果。测试将在All ticks 模式下进行。你可以使用你自己的多符号EA方案来重现这个问题并分享你的结果。
让我们来表示这个问题。例如,如果你测试一个符号,测试时间需要1分钟。如果再增加一个字符,测试需要4分钟,而不是预期的2分钟。如果我们再增加一个字符(共3个),测试时间是再增加一个字符的8倍,以此类推。
让我们试着找出测试所需时间比预期短的原因。其中一个原因可能是对账户历史的处理不正确。如果我们要求提供整个历史记录,随着历史记录的增加,可能会大大减慢测试时间。在这种情况下,测试开始时花费的时间将与测试结束时花费的时间有显著差异。当一个测试中有大量的交易(数以万计)时,可以很好地看到这一点。
如果在上述情况下一切操作正确,结果将如下表所示。最初的测试时间是固定的(2017.01.01)。然后,每次测试的时间范围都会增加一个月。当前和以前的结果之间的差异(差异 栏)将大致相同。对账户历史中的交易量 没有依赖性。
在测试中使用了一个专家顾问,其中指标正在运行,为检查条件要求提供条形和指标的数据,并执行交易。
在这种情况下,测试的总时间是37秒。使用两个符号的预期测试时间为37秒。x 2 =1分钟。14秒。而 对于三个符号37秒。x 3 =1分钟。51秒。
两个字符的测试结果。总测试时间2分钟。16秒。
三个字符的测试结果。总测试时间5分钟。22秒。