MT5とスピードの関係 - ページ 2

 
fxsaber:

このアイデアの初歩的なダイアグラム・コードを教えてください。一見すると、完全な誤解のように聞こえます。

OnMain関数の実行中に、現在のリアルキューの状態を知る 方法がない。これを行うための唯一の回避策は、リンク先で紹介されているようなスパイウェア・プログラムです。

最もシンプルな形で。

OnXXX( параметры )
{
        запомнить параметры (поместить в очередь)
        OnMain();
}
On2XX( параметры )
{
/*вычисления*/
        поменять приоритет обработки событий (если нужно)
/*вычисления*/
        промежуточный return (если нужно) 
/*вычисления*/
}
void OnMain()
{
        прочитать приоритет обработки событий
        для каждой группы событий
                извлечь параметры из очереди
                OnTradeXXX( параметры )
                удалить событие из очереди
}

計算のやり方そのものを変えればいいのです(タスクの要求に応じて中間戻りを何度も行う)。しかし、それが困難な場合、1ステップで、あなたにとってOnMainは存在しない(あなたはOnMainではなく、On2XXでメインコードを動かす)と考えて、それぞれOnMainでは何も学ぶ必要はありません。

 
A100:

松葉杖は、間違った方向に作られています。

OnXXX関数は、キュー内のイベント(パラメータ)をコピーして、メインのOnMain関数を呼び出すだけにしておきます。そのコードをすべてOn2XXの機能の複製に移動させる。そして、OnMainからこれらの複製されたOn2XX関数を必要な順序で呼び出し、順番にキューからデータをパラメータとして渡します。

そして、計測を行い、スピードの向上を示すことで、MQLを適切な機能で補完することを提案することができます。しかし、今ここですでに自分ですべてやってしまっているのに、なぜ追加するのか。

そういうことを書いているのではありません。

つまり、TRADE_TRANSACTION_HISTORY_ADD の呼び出しや最終呼び出しでも、多くのフィールドが埋められません。
その結果、すべてのトレーダーはここで、到着した瞬間にこれらの欠落したパラメータをどうにかして決定しようと苦心しているのです。
OntaredeTransaction "の機能が不十分なため、トレーダーが適切に動作するコードの開発に費やす時間と "負荷 "の両方において追加費用が発生します(つまり、コミュニティレベルで膨大な時間損失と非効率が発生します)。
現在の開発者からの回答は、「Marketの実行シンボルがあれば、価格価値はゼロになる、こうあるべき」(リンク)というようなものです。(リンク) - これは、もう一度言いますが、UNNORMALです。
最後の関数呼び出しにおける網羅的な値の欠如は、多くの余分な作業を引き起こします。

Новая версия платформы MetaTrader 5 build 2450: Сервис "Подписки", улучшения в интерфейсе и удобные функции в MetaEditor
Новая версия платформы MetaTrader 5 build 2450: Сервис "Подписки", улучшения в интерфейсе и удобные функции в MetaEditor
  • 2020.05.18
  • www.mql5.com
В пятницу 22 мая 2020 года будет выпущена обновленная версия платформы MetaTrader 5...
 
fxsaber:

HistorySelect.


これは、めちゃくちゃ高い機能です。そして、残念ながら、今はいくらキャッシュしてもそのスピードは許容できない。


例えば、戦場のEAでは、実際のデータを使って作業することが重要です。特に、Market WatchとCopyTicksのティックが可能な限り古くなっていないこと。

そのために、あまり良くないが、現在の価格データの妥当性をチェックする仕組みが強制されている。この仕組みの一つは、あるシンボルの取引が最後のティックより後に経過したことを検出することである。このようなことはめったに起こらないので、現在のティックがまだ最新かどうかを知ることは重要なことです。


この検出のためには、最近の案件の履歴にアクセスできる必要があります。これは、HistorySelectを使用して、以下のような模式的な方法で行われます。


残念ながら、このようなHistorySelectの呼び出しには5〜30ミリ秒 かかります(Release-EX5で自分で計測しました)。Expert Advisor が OnTick でこのような更新を何度も行う場合(例えば OrderSend の後など、一時停止の後に行うべき)、すべてが非常 に高く、長くなってしまうのです。HistorySelectは1回のOnTickでまとめて数秒を食ってしまうことがあります。


開発者の皆さん、どうしてこんなに高いんですか?この機能は、適切に実装することで瞬時に実行することができます。

このようなHistorySelectの呼び出しが 5〜30ミリ秒 続く」ことについての根拠はありますか?

もし私があなたの考えを正しく理解しているなら、テストコードは次のようになるはずです。

void OnStart()
  {
   MqlTick Tick;
   SymbolInfoTick(_Symbol, Tick);
   ulong start=GetMicrosecondCount();
   for(int i=0; i<100000; i++)
     {
      HistorySelect(Tick.time, INT_MAX);
     }
   ulong end=GetMicrosecondCount()-start;
   Print("100000 HistorySelect = ",DoubleToString(end/1000.0,2)," ms");
  }

100000クエリの仕組みはこうだ。

100000 HistorySelect = 141.63 ms
 
Anton:

このようなHistorySelectの呼び出しが 5〜30ミリ秒 続く」ことについての根拠はありますか?

もし私があなたの指摘を正しく理解しているなら、テストコードは次のようになるはずです。

10万回クエリの仕組みはこうだ。

そして、1つのクエリ?コンパイラが最適化する際に、そのようにしても不思議ではありません)))
 
Anton:

このようなHistorySelectの呼び出しが 5〜30ミリ秒 続く」ことについての根拠はありますか?

もし私があなたの指摘を正しく理解しているなら、テストコードは次のようになるはずです。

10万回クエリの仕組みはこうだ。

スクリプトを実行する

        100000 HistorySelect = 19493.96 ms


別のスクリプトを起動する。

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  if (HistorySelect(0, INT_MAX))
  {
    PRINT(HistoryDealsTotal());
    PRINT(HistoryOrdersTotal());
  }
}


HistoryDealsTotal() = 17828
HistoryOrdersTotal() = 22142


通常の戦闘回数です。HFTではありません。


ところで、あなたのスクリプトでは、HistorySelectが毎回すべてを再計算していることがわかりました。そして、入力パラメータは変更されず、履歴テーブルも更新されず、他のHistorySelect関数も呼び出されなかったのです。

 
fxsaber:

スクリプトを実行する

そうすると、詳細が必要になってきます。

私のテストは、最速ではない「Intel Xeon E5-2630 v4 @ 2.20GHz」で、バックグラウンドで他の多くのプロセスを実行したものです。

私のテスト口座の履歴では、2009年以降31315件の注文が多かれ少なかれ均等に あり、そのうち本日の注文は8件です。

スクリプトやExpert Advisorを同時に実行し、端末のデータベースを大量に読み込んでいる可能性があります。きれいな」端末で試してみてください。

より情報量の多いテスト

void OnStart()
  {
   MqlTick Tick;
   SymbolInfoTick(_Symbol, Tick);
//---   
   ulong start=GetMicrosecondCount();
   int count=100000;
   for(int i=0; i<count; i++)
     {
      HistorySelect(Tick.time, INT_MAX);
     }
   ulong end=GetMicrosecondCount()-start;

   Print(count," HistorySelect = ",DoubleToString(end/1000.0,2)," ms");
   Print("Selected = ",HistoryOrdersTotal());
//---   
   Tick.time=(Tick.time/86400)*86400;
   
   start=GetMicrosecondCount();
   count=1000;
   for(int i=0; i<count; i++)
     {
      HistorySelect(Tick.time, INT_MAX);
     }
   end=GetMicrosecondCount()-start;

   Print(count," HistorySelect = ",DoubleToString(end/1000.0,2)," ms");
   Print("Selected = ",HistoryOrdersTotal());
//---   
   HistorySelect(0, INT_MAX);
   Print("Selected = ",HistoryOrdersTotal());
  }

3本です。

2020.05.29 13:53:14.281 TestHistorySelect (EURUSD,H1)   100000 HistorySelect = 141.76 ms
2020.05.29 13:53:14.281 TestHistorySelect (EURUSD,H1)   Selected = 0
2020.05.29 13:53:14.284 TestHistorySelect (EURUSD,H1)   1000 HistorySelect = 2.82 ms
2020.05.29 13:53:14.284 TestHistorySelect (EURUSD,H1)   Selected = 8
2020.05.29 13:53:15.566 TestHistorySelect (EURUSD,H1)   Selected = 31315
2020.05.29 13:53:16.930 TestHistorySelect (EURUSD,H1)   100000 HistorySelect = 138.30 ms
2020.05.29 13:53:16.930 TestHistorySelect (EURUSD,H1)   Selected = 0
2020.05.29 13:53:16.933 TestHistorySelect (EURUSD,H1)   1000 HistorySelect = 2.61 ms
2020.05.29 13:53:16.933 TestHistorySelect (EURUSD,H1)   Selected = 8
2020.05.29 13:53:18.176 TestHistorySelect (EURUSD,H1)   Selected = 31315
2020.05.29 13:53:22.217 TestHistorySelect (EURUSD,H1)   100000 HistorySelect = 142.94 ms
2020.05.29 13:53:22.217 TestHistorySelect (EURUSD,H1)   Selected = 0
2020.05.29 13:53:22.220 TestHistorySelect (EURUSD,H1)   1000 HistorySelect = 2.57 ms
2020.05.29 13:53:22.220 TestHistorySelect (EURUSD,H1)   Selected = 8
2020.05.29 13:53:23.498 TestHistorySelect (EURUSD,H1)   Selected = 31315
 
Anton:

そうすると、詳細が必要になってきます。

私のテストは、最速ではない「Intel Xeon E5-2630 v4 @ 2.20GHz」で、バックグラウンドで他のプロセスがたくさんある状態で実行されました。

テスト口座の履歴は、2009年以降ほぼ均等に31315件の注文があり、そのうち本日の注文は8件でした。

スクリプトやExpert Advisorを同時に実行し、端末のデータベースを大量に読み込んでいる可能性があります。きれいな」端末で試してみてください。

同じアカウントとマシンで空のターミナルを使用します。

        100000 HistorySelect = 19367.01 ms


他のアカウントや端末でも同じ絵が表示されます。コンフィギュレーションです。

2020.05.29 13:53:44.766 Terminal        ICMarkets - MetaTrader 5 x64 build 2453 started for International Capital Markets Pty Ltd.
2020.05.29 13:53:44.766 Terminal        Windows 7 Service Pack 1 build 7601, Intel Core i7-2700 K  @ 3.50 GHz, 6 / 15 Gb memory, 4 / 29 Gb disk, IE 11, Admin, GMT+2


読者の皆様には、このスクリプトの結果をお聞かせください。

void OnStart()
{
  // https://www.mql5.com/ru/forum/342090/page2#comment_16607997
#define  PRINT(A) Print(#A + " = " + (string)(A))
  
  if (HistorySelect(0, INT_MAX))
  {
    PRINT(HistoryDealsTotal());
    PRINT(HistoryOrdersTotal());
  }

   // https://www.mql5.com/ru/forum/342090/page2#comment_16607922
   MqlTick Tick;
   SymbolInfoTick(_Symbol, Tick);
   ulong start=GetMicrosecondCount();
   for(int i=0; i<100000; i++)
     {
      HistorySelect(Tick.time, INT_MAX);
     }
   ulong end=GetMicrosecondCount()-start;
   Print("100000 HistorySelect = ",DoubleToString(end/1000.0,2)," ms");
}
 
Anton:

より情報量の多いテストです。

3回スタート。

        100000 HistorySelect = 18344.01 ms
        Selected = 0
        1000 HistorySelect = 602.77 ms
        Selected = 1169
        Selected = 22142
        100000 HistorySelect = 18331.15 ms
        Selected = 0
        1000 HistorySelect = 446.45 ms
        Selected = 1169
        Selected = 22142
        100000 HistorySelect = 18495.35 ms
        Selected = 0
        1000 HistorySelect = 549.40 ms
        Selected = 1169
        Selected = 22142

空っぽの端子2460。


ZS 空のアカウントで実行する。

        100000 HistorySelect = 28.30 ms
        Selected = 0
        1000 HistorySelect = 0.28 ms
        Selected = 0
        Selected = 0


スピードは注文数ではなく、取引 数に強く影響されるようです。

 
fxsaber:

同じアカウントとマシンで空のターミナルを使用します。


他のアカウントや端末でも同じパターンです。コンフィギュレーションです。


このスクリプトの結果を読者に引用してもらう。

証明するものではありませんが、(別のシンボルで)新たに実行するたびに時間が増えるという事実は憂慮すべきことです......。

2020.05.29 13:59:36.625 test1 (USDJPY,H1)       HistoryDealsTotal() = 1
2020.05.29 13:59:36.626 test1 (USDJPY,H1)       HistoryOrdersTotal() = 0
2020.05.29 13:59:36.642 test1 (USDJPY,H1)       100000 HistorySelect = 16.00 ms
2020.05.29 13:59:53.522 test1 (EURUSD,H1)       HistoryDealsTotal() = 1
2020.05.29 13:59:53.522 test1 (EURUSD,H1)       HistoryOrdersTotal() = 0
2020.05.29 13:59:53.546 test1 (EURUSD,H1)       100000 HistorySelect = 24.36 ms
2020.05.29 14:00:03.640 test1 (USDCHF,H1)       HistoryDealsTotal() = 1
2020.05.29 14:00:03.640 test1 (USDCHF,H1)       HistoryOrdersTotal() = 0
2020.05.29 14:00:03.669 test1 (USDCHF,H1)       100000 HistorySelect = 29.25 ms
2020.05.29 14:00:14.994 test1 (GBPUSD,H1)       HistoryDealsTotal() = 1
2020.05.29 14:00:14.994 test1 (GBPUSD,H1)       HistoryOrdersTotal() = 0
2020.05.29 14:00:15.026 test1 (GBPUSD,H1)       100000 HistorySelect = 31.76 ms
 
Сергей Таболин:

取引履歴の長い口座で運用する必要がある。