MT5とスピードの関係

 

MT5は軽快なプラットフォームです。しかし、高速取引の努力を否定するようなボトルネックがある。

ここで問題点を集めて、どこかで自力で、どこかで開発者の力を借りて、議論し、解決していきたいと思います。

 

HistorySelect.


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


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

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


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

void OnTick()
{
  MqlTick Tick;

  if (SymbolInfo(_Symbol, Tick) && HistorySelect(Tick.time, INT_MAX)) // Взяли история торгов со времени текущего тика.
    // Проверяем актуальность тика через сравнение Tick.time_msc и DEAL_TIME_MSC.
}


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


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


履歴と連動するような機能の導入も考えてください。

HistoryDealsSelect( const int Index, const int Count = WHOLE_ARRAY );  // Из внутренней таблицы сделок взять сделки, начиная с заданного индекса в таблице.
HistoryOrdersSelect( const int Index, const int Count = WHOLE_ARRAY ); // Из внутренней таблицы ордеров взять ордера, начиная с заданного индекса в таблице.

HistorySelectのブレーキを完全に閉じてしまうのである。最新の情報を非常に安く手に入れることができるという問題が解決されるからです。今は、戦闘実行で一苛めです。


OnTradeTransactionで 最後の取引を制御できない場合があるため、履歴の迅速な処理が急務である。

 

ChartEvent および TradeTransaction イベントへのアクセス
.


アイデアと可能な実装の1つが提案されています。だから、ここにコピーしているだけなんです。

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

エラー、バグ、質問

セルゲイ・デジブリク, 2020.05.20 00:47

開発者への提案です。
OnChartEventに蓄積された「メッセージ」の処理を、ユーザーが独自にカスタムコードから呼び出せるような機能をMQLに追加することを検討してください。
1) これによって、時間のかかる計算の反復の間にOnChartEvent処理を呼び出すことができ、タスクプール、データ転送、状態の同期、コンテキストの保存と復元などの菜園を構築せずに、ユーザーGUIを少なくともある程度反応するようにすることができます...
2) これにより、スクリプトでOnChartEventを使用することができるようになります。

ありがとうございます。

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

バグ、バグ、質問

イリヤス さん 2020.05.20 09:09

GetNextEventという関数を追加するということでしょうか?

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

バグ、バグ、質問

セルゲイ・デジブリク, 2020.05.20 13:39

ちょっと違う、むしろこの関数をHandleNextEventとして呼びたい、可能性のあるシグネチャです。

bool HandleNextEvent (ENUM_EVENT_TYPE);


呼び出されると、GetNextEventと同様に、指定されたENUM_EVENT_TYPEがキューに存在するかどうかをチェックします。
、このイベントが存在する場合、自動的に対応するハンドラ(OnChartEvent、OnTrade、OnTradeTransaction、など)のユーザーコードに制御が渡されます。(追加してくれたfxsaberに 感謝))
キューにイベントがあった場合はtrueを,そうでない場合はfalseを返す.


想定される使用例

//....
for(int i = 0; i < 10^6; ++i){
   // .... Data Calculations

   if((i % 10^3) == 0){
       while(HandleNextEvent(EVENT_TYPE_ALL));
   }
}
//....

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

エラー、バグ、質問

セルゲイ・デジブリク, 2020.05.20 14:38

2)その通りです。システム内のすべてのイベントではなく、ある特定のイベントの処理に興味がある場合、他のイベントの処理は通常のモードにして、このタイプのイベントのみを 処理できるようになればいいと思うのです。
3) 処理中に再度HandleNextEventが呼び出された場合 - 呼び出して処理する。スタックオーバーフローだけが起こる可能性がありますが、これはユーザーとコードの問題であり、開発者の問題ではありません。
4) フィルタに該当しないイベントは、そのままの順序で、ユーザーがシステムに制御を戻したときに、通常通り呼び出されます。


ここで、実行中のコード内で同じTradeTransaction-eventsにアクセスするための松葉杖を 作らなければなりません。

Expert Advisorは、戦闘用アプリケーションのためにこの機能がどうしても必要なのです。

 
fxsaber:

OnTradeTransactionで最近の取引を監視することは常に可能とは限り ません。 したがって、履歴で素早く作業することが重要 です。

制御できない場合の例を教えてください。

 
prostotrader:

コントロールできない場合の例を教えてください。

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

mql5の特性、ヒントとコツ

fxsaber, 2020.04.23 19:51

MT5がリアルタイムで自動的に配置する開閉矢印は、TradeTransactionのイベントに基づいています。


これらのイベント(十数ポジションのオープン、クローズ)が、一瞬の接続中断でターミナルに届かなかった--あまりの偶然に、PCの前に座っていた私は、直接見てしまったのです。そのため、対応する矢印はありません。


また、ここで時々言われているように、戦闘用EAではOnTradeTransactionは 当てになりません。OrderSendAsyncを扱うための信頼できるパブリックなメカニズムがないのは残念です。


また、コード内に複数のOrderSendが配置されている場合。あるOrderSendが前のOrderSendに依存する場合。

 
fxsaber:

また、コード内に複数のOrderSendを配置する場合。あるOrderSendが前のOrderSendに依存する場合。

通信が途絶えると、履歴にも何も残らないのです

私は5年以上前からOrderSendAsync(当時はOrderSendに問題があった)+OnTradeTransaction( 戦闘モード)だけを使って いますが、問題なしです。

接続が切れた場合は、各注文に割り当てられたウィザードで発見します(FOREXではシンボル名が統一されていないので難しいのです)。

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

通信が途絶えると、履歴にも何も残らないのです

私は5年以上前からOrderSendAsync(当時はOrderSendに問題があった)+OnTradeTransaction( 戦闘モード)だけを使って いますが、問題なしです。

Async+OnTradeに何年も牙を剥くのは仕方ないでしょう。この仕組みでデータ化を行えば、あとは何も問題ない。

ここで「料理ができないだけ」なんて、せめて言わないでくださいよ。

 
fxsaber:

散々Async+OnTradeを推し進めてるんだから仕方ないだろ。また、データの更新もこの仕組みで行うなど、すべてにおいて問題がないからです。

少なくともここで「お前は料理ができないだけだ」と主張するのはやめてください。

マイクロ秒を争うと同時に、大量のコードを書くことになり、これもまた時間を食う。

と99%必要ない。

 
建設的な発言にとどめることをお勧めします。
 
fxsaber:

ChartEvent と TradeTransaction イベントへのアクセス。

アイデアと可能な実装の1つが提案されています。だから、ここにコピーしているんだ。

さて、実行中のコード内でこれらのTradeTransaction-eventsにアクセスするためには、松葉杖をつく 必要があります。

間違った方向で松葉杖をついている。

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

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

 
A100:

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

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

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

理由: