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

 
fxsaber:
コンピュータの前にいて、何も計算しなかった。CPUに何も負荷をかけていない。

19ms、SymbolInfoTickの実行は48msです。数百マイクロ秒というケースも数十件あった。でも、引き合いに出してはいないんです。


どうやら再現するためには、コンバットアドバイザーを24時間稼働させ、あとは見るだけにする必要があるようです。何が原因でこのようなラグが発生するのかを解明するのは非現実的だと私は思います。

コンピュータが更新プログラムをダウンロードしたり、何らかのサービスタスクを実行していることがあります。また、主電源電圧の変動が影響することもあります。この方法では、ボットロジックがすべてハードウェアレベルで記述されるプログラマブルネットワークカードを実現することができます :) しかし、そこでも量子場のゆらぎによる遅延が発生します。
 
Maxim Dmitrievsky:
時々、コンプはポンピングアップデートや何らかのサービス作業をしていることがあります。また、主電源電圧の変動も影響することがあります。この方法で、すべてのボットロジックがハードワイヤードされているプログラマブルネットワークカードに到達することができます :) しかし、そこでも量子場の揺らぎによる遅延が発生します。

開発者は最善を尽くしました。また、それでなくとも、ティックがMarket Watchに遅れをとっていること、またその逆であることを示すコードが、このブランチから提供されているのです。ティックの到着シーケンスがどのように壊れているか、そしておそらく他の何かです。すべてにおいて、他の状況を再現するために厄介な有効なコードが掲載されています。

 
Anton:

SymbolInfoTick は、ブローカーのサーバーから受信したデータを送信する。サーバーが送信するものが、あなたが受け取るものです。

SymbolInfoTick() ブロッキングモードで実行されますか、それともノンブロッキングモードで実行されますか?

例えば、whileループのボディで、接続がないとか、週末でマーケットが閉じているとか、
、ループを停止してブロックするのか、非同期に実行するのか。

 
fxsaber:

マーケットウォッチがどのように遅れているか、逆にどのように遅れているか。

SymbolInfoTickが 新しいティックをキャッチし、Market Watchイベントを通じて(Market Watchの変更を待たずに)異なるAskとBidを取得する場合などですか?1年ほど前にはできなかったことです。SymbolInfoTickとCopyTickとVintageは常に同じtickを導きます。様々なOnXXX関数を通してティックを取得する場合、当然、ある関数を通して何かを取得し、別の関数を通して何かを取得することになるのですが...。

 
pivomoe:

つまり、SymbolInfoTick が新しいティックをキャッチし、カップをポーリングすることで(カップの変更イベントを待たずに)異なる Ask と Bid を取得するのですか?

これです。

 

やはり、MarketBookGetとSymbolInfoTickではなく、OnBookEventとOnTickをテストしているのですね。この方式でテストすれば、すべてが一致するはずです。

While(1)
{
 Sleep(1)
 Запрос тика через SymbolInfoTick
 Запрос тика через стакан MarketBookGet
 Проверка на совпадение. 
}

p.s 以下の皆さんの投稿を読んでみてください。あなたも理解しているはずです。なぜOnBookEventとOnTickが 全く必要ないのですか?私の例では、Sleep(1)は1-2ミリ秒かかり、SymbloInfoTickによるリクエストとティックはマイクロ秒未満で完了します。ティックがなければ、プロセッサはすでに99.9%休んでいます。OnBookEventとOnTickを 使用するメリットは何ですか?

 
pivomoe:

やはり、MarketBookGetとSymbolInfoTickではなく、OnBookEventとOnTickをテストしているのですね。この方式でテストしていれば、すべて合致しているはずです。

p.s 以下の皆さんの投稿を読んでみてください。あなたも理解しているはずです。なぜOnBookEventとOnTickが 全く必要ないのですか?私の例では、Sleep(1)は1-2ミリ秒かかり、SymbloInfoTickによるリクエストとティックはマイクロ秒未満で完了します。ティックがなければ、プロセッサはすでに99.9%休んでいます。OnBookEventとOnTickを 使用するメリットは何ですか?

外交的な気配もなく、ナンセンスなことを言っている。Sleep(1)は10分の1ミリ秒です。セオリー通りしか見えません。

OnTick のユーザーは、少し前に Terminal に到着したものではなく、新鮮なティックを見たいと思っています。ソースコードでMarketBookGetの直後にSymbolInfoTickを 記述すればよい。


開発者は、その沈黙の中で2つの問題点を完全に認めている。

 
fxsaber:

外交的な気配もなく、無意味なことを言っている。Sleep(1)は十数ミリ秒です。セオリー通りしか見えません。

ユーザーは、OnTick で新鮮なティックを見たいのであって、少し前に Terminal に到着したティックを見たいわけではありません。ソースコードでMarketBookGetの直後にSymbolInfoTickを記述すればよい。


開発者は、その沈黙によって、2つの問題を完全に認めたことになる。

常にではありませんし、10分の1秒単位でもありません。簡単なスクリプトで確認

//+------------------------------------------------------------------+
//|                                                    TestSleep.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#define  ITERATIONS 10000
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ulong t1=GetMicrosecondCount();
   for(int i=0; i<ITERATIONS; i++)
     {
      Sleep(1);
     }
   ulong t2=GetMicrosecondCount()-t1;
   PrintFormat("total %I64u microseconds (%.3f ms per iteration)",t2,double(t2)/(ITERATIONS*1000.0));
  }
//+------------------------------------------------------------------+

以下は私のログです。

2020.11.04 13:14:31.590 TestSleep (EURUSD,H1)   total 17058138 microseconds (1.706 ms per iteration)

OnTickのユーザーは、常に新鮮なティックを見ることができます。

OnBookEventのユーザーは、常に新鮮なティックを見ることができます。

しかし、OnTickで受け取ったティックとOnBookEventで受け取ったティックを比較したい場合、イベントは 並列ではなく逐次処理されるため、失望を味わうことになる。ユーザーのpivomoeさんが伝えようとしたことです

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Slava:

常に、どこでも10分の1ミリ秒というわけではありません。簡単なスクリプトで確認

以下は私のログです。

そして、これが私のログです。

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

void OnStart()
{
  for (int i = 0; i < 5; i++)
    _BV(Sleep(1), 1);
}

結果

2020.11.04 15:19:32.565 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 5326 mcs.
2020.11.04 15:19:32.580 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 14928 mcs.
2020.11.04 15:19:32.596 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 15930 mcs.
2020.11.04 15:19:32.611 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 14910 mcs.
2020.11.04 15:19:32.627 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 15941 mcs.

OnTickのユーザーは、常に新鮮なティックを見ることができます。

OnBookEventのユーザーは、常に新鮮なティックを見ることができます。

何もしていないマシンから1枚のチャートでEAを 実行した結果です。

2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       Alert: OnBook-lag! - 6564 mcs.
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)             [bid]   [ask] [onTick] [Interval]
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [0] 1.17192 1.17192     true     108150
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [1] 1.17192 1.17192    false         30
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [2] 1.17189 1.17191     true      88210
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [3] 1.17189 1.17191    false       6564
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       Alert: OnBook-lag! - 3888 mcs.
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)             [bid]   [ask] [onTick] [Interval]
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [0] 1.17192 1.17192    false     117471
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [1] 1.17192 1.17192     true         11
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [2] 1.17192 1.17193     true     882710
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [3] 1.17192 1.17193    false       3888
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       Alert: OnTick-lag! - 4653 mcs.
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)             [bid]   [ask] [onTick] [Interval]
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [0] 1.17195 1.17195     true      86660
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [1] 1.17195 1.17195    false         11
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [2] 1.17194 1.17194    false     220122
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [3] 1.17194 1.17194     true       4653

異なるOn関数で対応するメソッドによって受信される同一のティックをマークする。1つのチャートではなく、6つのチャートで実行した場合、最大で数十ミリ秒のラグが発生することがあります。

しかし、OnTickで受け取ったティックとOnBookEventで受け取ったティックを比較したい場合は、イベントが 並列ではなく、順次処理 されるため、失望することになります。ユーザーpivomoeが伝えようとしたこと

ほぼ空のOnBookEvent/OnTickが、対応するほぼ空のOnTick/OnBookEventより20ミリ秒後にトリガーされる場合、それは問題ないですか?


ZS スレッドに注目している間に、ここにもリプロダクションコードが。そこでは、Market Watchでは、その前のMarket Watchの時間よりも早い時間でティックが入る。

 
fxsaber:

ほぼ空のOnBookEvent/OnTickが、対応するほぼ空のOnTick/OnBookEventより20ミリ秒後にトリガーされる場合、それは問題ないですか?


EAキューはロック可能なリソースである。イベントがキューに書き込まれると、Expert Advisor は待機します(Expert Advisor が現在イベント処理中でない限り)。

Expert Advisor のイベントは、対応するチャートのイベントキューから発生し、そのイベントキューは、対応するシンボルの処理サイクルから発生します。そして、この処理のループは、イベントを自分のチャートに配信するだけでなく、他にも様々なことを行っています。

WindowsがリアルタイムOSでないことは、すでにお伝えしたとおりです。