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

 
Anatoli Kazharski:

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

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

このように書くと、より分かりやすくなります。

すべてを書き換えて、正しく動作するようにすることが必要なのは理解しています。今、お見せします。

 
fxsaber:

正しく動作させるためには、すべてを書き換える必要があることに気づきました。これからです。

そして、このクソが起こっているため、私はできません。

2018.01.28 12:37:23.692 Tester  EURUSD: preliminary downloading of history ticks started, it may take quite a long time
2018.01.28 12:37:24.692 Tester  EURUSD: preliminary downloading of history ticks completed, 89 bytes in 0:00.998 (0.09 Kb/sec)
2018.01.28 12:37:24.692 Tester  EURUSD: ticks data begins from 2017.09.01 00:00
2018.01.28 12:37:24.692 Core 1  agent process started
2018.01.28 12:37:33.425 Core 1  connecting to 127.0.0.1:3000
2018.01.28 12:37:50.450 Core 1  tester agent authorization error
2018.01.28 12:37:50.456 Core 1  connection closed
で、テスターが実行できない。
 

インジケーター

#property indicator_chart_window
#property indicator_plots 0

input long Chart = 0; // идентификатор графика-получателя события
input int Index = 0;

int OnCalculate( const int rates_total, const int prev_calculated, const int, const double &[] )
{
  if (prev_calculated)
    EventChartCustom(Chart, 0, Index, 0, NULL);
  
  return(rates_total);
}


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

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

input int AmountSymbols = 1;

const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDJPY", "USDCAD"};

double Sum2 = 0;

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

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

void OnInit()
{
  for (int i = 0; i < AmountSymbols; i++)
    iCustom(Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i); // MQL5\Indicators\Spy.ex5
}

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

void OnTick()
{
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    Sum2 += GetBid(Symbols[(int)lparam]);
}

EURUSD M1 MetaQuotes-Demo, Hedge, USD, ラグなし, Core1-agent only, real ticks 2017.09.01 - 2018.01.28。


1つのシンボル

i = 0 Pass = 0 OnTester = 7.053 s.: Count = 9986677, 1415947.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 6.930 s.: Count = 9986677, 1441078.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


2つのシンボル

i = 0 Pass = 0 OnTester = 25.747 s.: Count = 9986677, 387877.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 26.118 s.: Count = 9986677, 382367.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


3つのシンボル

i = 0 Pass = 0 OnTester = 47.448 s.: Count = 9986677, 210476.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 46.994 s.: Count = 9986677, 212509.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


  1. シングルシンボルモードでは、"スパイ "は純粋なOnTickの2.5倍遅くなります。つまり、空のインジケータ(PERIOD_W1上に構築されているので、バーの履歴は最小です)は、テスターで大きなオーバーヘッドを持っているのです!
  2. 2つのシンボルは1つのシンボルに比べて3.5倍遅くなります。
  3. しかし、3つのシンボルは2つのシンボルより1.8倍しか遅くならない。I.e.2→3への移行はスケーラビリティによるものです。
 

Anatolyさん、Forex Experts, Trading Robots and Expert Advisorsに トピックを移動して、そこのトップに固定することを提案します。

そうすることで、常に視界に入るようになります。ここには、すでに多くの投稿されたトピックがあります

 
Rashid Umarov:

Anatolyさん、Forex Experts, Trading Robots and Expert Advisorsに トピックを移動して、そこのトップに固定することを提案します。

そうすることで、常に視界に入るようになります。ここには、すでに多くの投稿されたトピックがあります

役に立つかもしれない話題で構わない。
 
fxsaber:

...

  1. シングルシンボルモードでは、Spyは純粋なOnTickよりも2.5倍遅くなります。例えば、空のインジケータ(PERIOD_W1上に構築されているので、バーの履歴は最小です)は、テスターで大きなオーバーヘッドを持っています。
  2. 2つのシンボルは1つのシンボルに比べて3.5倍遅くなります。
  3. しかし、3つのシンボルは2つのシンボルより1.8倍しか遅くならない。つまり、2から3への移行はスケーラビリティによるものである。

結果は6, 25, 46となります。6、12、18ではダメなのか?

一文字に対する減速度を見る必要があります。すると、3文字は1文字の8倍近く遅くなり、予想通り3文字ではありません。

質問はまさにこれです。なぜ、スケーラビリティでこのような結果になるのでしょうか?そして、どうしても結果が改善されない場合は、新たなテストモードという選択肢 も提案されました。そうすれば、複数の文字を使用する場合に、テストが長くなるという問題が解決されます。

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

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

アナトーリ・カザルスキー さん 2018.01.27 20:15

質問です。

このようなマルチシンボルExpert AdvisorのスキームをMQLで作成し、テストにシンボルを追加する際にテストの期間が繰り返し増加しないようにすることは可能でしょうか。

//---

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

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

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


 
Anatoli Kazharski:

6, 25, 46という結果が出ていますね。6、12、18ではダメなのか?

減速は1つの記号との関係で見なければならない。

スパイクを持った2人のキャラクターは、1人のキャラクターとは大きく異なるテスターモードとなります。したがって、2つに対する拡張性を見るのは論理的なことである。

しかも、指標となるオーバーヘッドが荒れ放題で、スパイを通した作業がヒヤヒヤものです。スケーラビリティがほぼ完璧であるはずのサービスを、たった1つのシンボルとの相対的な関係で待っている。タイマーの場合と同様です。そこだけ、ティックスキップがない。

 
大幅な加速
#include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int AmountSymbols = 1;

const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDJPY", "USDCAD"};

double Sum2 = 0;

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

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

void OnInit()
{
  for (int i = 0; i < AmountSymbols; i++)
    if (Symbols[i] != _Symbol)
      iCustom(Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i); // MQL5\Indicators\Spy.ex5
}

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

void OnTick()
{
  OnTick(_Symbol); 
}

void OnTick( const string &Symb )
{
  Sum2 += GetBid(Symb);
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    OnTick(Symbols[(int)lparam]);
}


1つのシンボル

i = 0 Pass = 0 OnTester = 2.697 s.: Count = 9986677, 3702883.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 2.657 s.: Count = 9986677, 3758628.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


2桁

i = 0 Pass = 0 OnTester = 17.632 s.: Count = 9986677, 566395.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 17.539 s.: Count = 9986677, 569398.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


3つのシンボル

i = 0 Pass = 0 OnTester = 35.639 s.: Count = 9986677, 280217.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 35.462 s.: Count = 9986677, 281616.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


4つのシンボル

i = 0 Pass = 0 OnTester = 68.459 s.: Count = 9986677, 145878.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 69.429 s.: Count = 9986677, 143840.1 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
 
fxsaber:

スパイがいる2キャラクターは、1キャラクターとは全く異なるテスターの操作モードです。したがって、スケーラビリティを2つに対して見るのは論理的なことです。

しかも、指標となるオーバーヘッドが荒れ放題で、スパイを通した作業がヒヤヒヤものです。スケーラビリティがほぼ完璧であるはずのサービスを、たった1つのシンボルとの相対的な関係で待っている。タイマーの場合と同様です。そこだけ、ティックスキップがない。

fxsaber
大幅な加速

1つのシンボル

2つのシンボル

3キャラクター

4文字

2つのシンボルに対する結果を見る場合、2つのシンボルの結果を2で割ると、17 / 2 = 8.5

そして、シンボルを追加する際には、この値をシンボル数で掛け合わせ、予想されるテスト時間を算出するのである。

  • 3文字:8.5 * 3 = 25 で、実際の時間は35.462 秒です
  • 4文字:8.5 * 4 = 34、実際の時間は68.459 秒です

しかし、いずれにせよこれまでで最高の結果です。興味深いのは、現在のシンボルを OnTick で使用し、残りをカスタムイベントで使用することです。

サービスがない間でも使用することができます。

トレーディング、自動売買システム、ストラテジーテストのためのフォーラムです。

Init()およびDeInit()実行シーケンス

スラバ さん 2017.04.14 10:18

このサービスには、取引機能やオブジェクトの管理機能などが搭載される予定です。チャートも。

マーケットデータプロバイダーは一つの可能性に過ぎない。

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

Init()およびDeInit()実行シーケンス

スラバ さん 2017.04.14 10:21

サービスには、OnTick(string symbol)が含まれます。しかし、特定のシンボルからのティックは、購読する必要があります。

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

Init()およびDeInit()実行シーケンス

fxsaber さん 2017.04.14 10:46

サービスには、ほぼすべてのOn機能が搭載されることが判明しました。OnInit, OnDeinit, OnTick(string),OnTimer,OnTrade,OnTradeTransaction,OnTester, OnTesterInit, OnTesterPass, OnTesterDeinit, OnBookEvent, OnChartEvent(long ChartID, ...),OnCalculate, ...

インジケータ・バッファが不要で、インジケータ/アドバイザの松葉づえを扱いたくない場合は、(MTの旧バージョンからのストレッチ)制限のない新しいタイプのプログラム-サービス-で書き込んでください。

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

Init()とDeInit()の実行シーケンス

スラバ さん 2017.04.14 10:56

その通りです。

OnCalculateはありません。

OnChartEventを用いた解決策はまだありません。

 
理由: