MetaTrader 5のストラテジーテスターにおけるテスト結果の分析と最適化

 

1文字と数文字でのテスト結果を見てみましょう。テストはAll ticks モードで実施されます。ご自身のマルチシンボルEAスキームで問題を再現し、結果を共有することができます。

問題を表すとします。例えば、1つのシンボルをテストする場合、テスト時間は1分です。もう1文字追加された場合、テストは予想通り2分ではなく、4分かかります。さらに1文字(合計3文字)増やすと、テストにかかる時間は8倍、というように。

では、テストにかかる時間が予想より短い理由を探ってみましょう。その理由のひとつに、アカウント履歴の不適切な取り扱いが考えられます。全履歴を要求すると、履歴が大きくなるにつれてテスト時間が大幅に遅くなる可能性があります。この場合、テスト開始時の滞在時間とテスト終了時の滞在時間は大きく異なることになる。これは、1回のテストで多くのトランザクション(数万件)が発生する場合によくわかります。

上記のケースについて、すべてが正しく行われた場合、下表のような結果になります。初回テスト時間は固定です(2017.01.01)。そして、テストをするたびに1ヶ月ずつ時間幅が広がっていきます。今回の結果と前回の結果の差(Difference 欄)は、ほぼ同じになります。口座履歴の取引量 に依存することはありません。

テストではExpert Advisorを使用し、インジケータを動作させ、バーとインジケータのデータを要求して条件を確認し、トレードを実行しました。

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秒です。2シンボル使用時のテスト予定時間 37秒x 2 =1分14秒そ して、3つのシンボル37秒のために。x 3 =1分51秒

2キャラクターのテスト結果。総テスト時間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

3キャラクターのテスト結果。総テスト時間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)


 

では、トレードが テスト期間に影響を与えるかどうか、またどの程度影響を与えるかについて試してみましょう。Expert Advisor の条件チェックとトレードを行うブロックを完全に無効にして、再度、1 つのシンボルと複数のシンボルについて一連のテストを実施してみましょう。インジケーターハンドルや、バーやインジケーターのデータ要求などは置いておくとして。

1つのシンボルをテストする場合、データ年度(2017.01.01~2018.01.01)の前回テストと比較して、テスト時間が13 秒減少しています。2シンボルでのテスト時間は24秒です。x 2 =48秒 そして、3文字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

2キャラクターをテストした場合、データ年度(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

3キャラクターをテストする場合、テスト時間は1分 短くなりました。データ年度(2017.01.01~2018. 01.01)の前回テストと比較して、7秒


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)

//---

このシリーズでも、期待されるテスト時間は満たされていない。

 

では、インジケータハンドルの取得とデータの要求のブロックを無効にしてみます。基本的に今は空白のExpert Advisorで、新しいバー 形成イベントに対して1つの条件だけがテストされます。

1つのシンボルをテストする場合、データ年度(2017.01.01~2018.01.01)の前回テストと比較して、テスト時間が8秒減少しています。2シンボルでの予想テスト時間は16秒です。x 2 =32秒 3文字の場合 16秒x 3 =48秒 4文字の場合 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

2文字テストでは、データ年度(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

3キャラクターをテストした場合、データ年度(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~2018.01. 01)の4文字で再度テストしてみましょう。


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)

//---

このシリーズでも、期待されるテスト時間は満たされていない。

 

質問です。

MQLでマルチシンボルEA方式を作成し、文字が追加されてもテスト時間が繰り返し増加しないようにすることは可能でしょうか?

//---

これが不可能な場合、ターミナルの開発者のオプションの1つは、すべてのシンボルを一度に実行するのではなく、シンボル ごとにテストを実行できるモードを1つ追加することである。そうすれば、最終的に期待通りのテスト時間が得られる。ポイントは、マルチシンボルEAが単にそのような場合に使われることが非常に多いということです。

  1. テストにはより多くのデータが必要です。
  2. より多くの種類の価格挙動、条件(スプレッド、ストップ/リミットレベル)などについて、同じパラメータで取引アルゴリズムをテストするため。

そのような場合にこそ、試験時間を大幅に短縮し、パラメーターを最適化できる新しいモードが必要なのです。そして、すでに最終テストでは、すべてのシンボルを同時にテストしています。

 

エキスパートアドバイザー

#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, ラグなし, Core1-agent only, real ticks 2017.09.01 - 2018.01.26。


1つのシンボル

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


2つのシンボル

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


3つのシンボル

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


拡張性は問題ないようだ。

 
fxsaber:

...

スケーラビリティについては、すべて問題ないようです。

全てのティックが入るEAが必要。各シンボルのインジケータからカスタムイベントを介して。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

MT5での多通貨テスト

fxsaber, 2016.11.13 14:04

まさにOnTickの呼び出しについてです。多通貨EAの場合、正しいスペルは2種類しかありません(2つ目は欠陥があります)。

  1. 多通貨のOnTick。まず、各シンボルのインジケータを送信することで実装されます。インジケータがOnCalculateにカスタムイベントを送信するところ。Expert Advisor 自体では、OnChartEvent がすべてのインジケータからのカスタムイベントをキャッチし、取引ロジックを実行します。このExpert Advisorに標準搭載されているOnTickは、単純に無いだけです。
  2. ...


 

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

試験官

//+------------------------------------------------------------------+
//|                                                         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)
 
まだ実行していませんが、ここにハイライトがないようです

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

MetaTrader 5 Strategy Testerにおけるテストと最適化の結果分析

アナトーリ・カザルスキー さん 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;
     }
  }
 
fxsaber:
まだ実行していませんが、ハイライトされた部分が欠落しているようです

ロングパラメータ(lparam)をチェックする。ティックイベントの識別子が含まれる。

ユーザーイベントの 識別子(int id)は0に等しい。

このように書くとわかりやすいかもしれません。

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