SL/TP注文の受付 - ページ 4

 
Enrique Dangeroux:

https://www.mql5.com/ru/forum/341117 は現在も問題になっている

前回、この問題は言及されたブローカーで解決されました。

 

開発者の皆様、アーキテクチャに関する以下の質問にお答えください。戦闘用のアプリケーションに必要な情報です。ノークレーム。


同じ価格でロットの異なる2つの指値があります。起動トリガーの順番はどうなっているのでしょうか?

この問いには、いくつか答えがあります。

  1. 敷地内に
  2. チケット番号について。
  3. 始値の 最終修正から。
  4. 注文の最後の変更から(例えば、Limit注文でTake Levelが更新された場合)。

もし私の理解が正しければ、始値を変更した後、そのリミッターはサーバーのすべてのリミッターのリストテーブルに適切に挿入され、始値でソートされることになるのです。そうすると、質問の答えは、同じ価格の注文のリストの最初に埋め込まれているのか、最後に埋め込まれているのか、ということになる。


同じ質問は、制限ではなく、トークンのことです。同一のテイクをトリガーする順番は、何に依存するのでしょうか?IDポジションか何かでしょうか?


これが戦闘にどう役立つかを説明しよう。例えば、同じレベルのリミッター(またはポジションティー)を2つ持っているが、ロットが異なる。リミット(ティー)の実行が最後の修正に依存するのであれば、ロットを上げることでリミッターを修正するだけでFillRateを上げることができますね。


おそらく、対応するMT5サーバー部分の実装を書いた人でないと、この答えはわからないと思います。

 
Andrei Trukhanovich:

ブローカーと連携し、ボトルネックを発見する

なんだ、ミツバチ対ハチミツか(笑)
 
fxsaber:

同じ価格でロットの異なる2つの指値があります。起動トリガーの順番はどうなっているのでしょうか?

この問いには、いくつか答えがあります。

  1. 敷地内に
  2. チケット番号について。
  3. 始値の 最終修正から。
  4. 注文の最終修正から(例えば、指値でテイクレベルが更新されたなど)。

バリアント4は4作目で使われたような気がします。つまり、何らかの修正があれば、その注文は対応する価格水準の待ち行列の最後尾に移動したのである。

 
secret:
ミツバチ対ハチミツみたいなもんかな?)

この瞬間に、この状況で、お互いに利益があり、それが実現した。

 

MT5のTP注文は、FillRate(注文のどの部分が満たされたか)を調べることができるのが特徴です。

このような数万件の注文を分析した結果、FillRateはシンボルに非常に大きく依存することがわかりました。TP注文のパックが同時にトリガされた場合、パック内の注文数が増えるにつれてFillRateが減少します。

その他、具体的なニュアンスも明らかになった。しかし、これはすでにブローカーと話し合っている。


FillRateを増やすためのレシピ:同じティックとリミッターを1つの共通のMT5リミッターにまとめる。


しかし、このデータはこの話題のオマケに過ぎない。ブローカーに依存しない問題は、MT5がティックで遅れ、その結果、保留中の注文(SL/TPレベルを含む)の受付で遅れをとっていることです。


そしてリダイレクト後、MT5は次のティックまで毎回待機し、価格がTPレベル(またはリミット)を満たすかどうかをチェックします。最大で数秒かかることもあります。また、チェックは必ずリジェクト(またはパーシャルフィル)の直後に行う必要があります。

ファイル:
 
fxsaber:

OnTickは、ティックがトレードサーバーに書き込まれるより数ミリ秒後にトリガーされます。

// Измеряет размер лага между приходом тика на MT5-сервер и MT5-Терминал.
// Запускать на той же машине, на которой установлен MT5-сервер.

#include <WinAPI\WinAPI.mqh>

input int inPeriod = 10;  // EMA-period
input int inAmount = 100; // Количество тиков для анализа

// Локальное время в миллисекундах.
long TimeLocalMsc()
{
  SYSTEMTIME SystemTime;
  
  kernel32::GetLocalTime(SystemTime);

  MqlDateTime time;
  
  time.year = SystemTime.wYear;
  time.mon = SystemTime.wMonth;
  time.day = SystemTime.wDay;
  time.hour = SystemTime.wHour;
  time.min = SystemTime.wMinute;
  time.sec = SystemTime.wSecond;


  return((StructToTime(time) * 1000 + SystemTime.wMilliseconds));
}

double EMA = 0;
int MaxValue = 0;
int MinValue = INT_MAX;
int Amount = 0;

void OnTick()
{
  static const double Alpha = 1.0 / inPeriod; // EMA-коэффициент для расчета среднего значения.

  MqlTick Tick;
  
  const long time = TimeLocalMsc(); // Локальное время в миллисекундах

  if (SymbolInfoTick(_Symbol, Tick))
  {
    const int Value = (int)(time - Tick.time_msc); // На сколько локальное время отличается от тика.
    
    MaxValue = MathMax(Value, MaxValue); // Максимальное значение.
    MinValue = MathMin(Value, MinValue); // Минимальное значение.
    
    EMA += (Value - EMA) * Alpha; // Среднее значение
    
    if (++Amount >= inAmount) // Если посчитали все тики - распечатываем и выходим.
    {
    #define  TOSTRING(A) #A + " = " + (string)(A) + "\n"      
      Print(TOSTRING(Amount), TOSTRING(MinValue) + TOSTRING(MaxValue) + TOSTRING(EMA) +
            TOSTRING(TerminalInfoInteger(TERMINAL_PING_LAST)));
      
      ExpertRemove();
    }
  }
}


結果

Amount = 100
MinValue = 1
MaxValue = 8
EMA = 4.344007436833947
TerminalInfoInteger(TERMINAL_PING_LAST) = 42


100本のダニを処理した。サーバーとティック端末の間の到着遅れは、1ミリ秒から8ミリ秒の間で変化する。平均は4ミリ秒強です。これはちょうど、このブランチの始まりであるTP注文のトリガーラグと同じです。


ラグ自体はMT5サーバーの中にある。Server->Terminalのチャンネルは関係ありません。


このラグをなくすよう、開発者に強く要望します。これで、Pingがゼロになると、端末だけでなく、サーバーにも一定の遅延ティックが入力されるようになります。特に、注文は受け付けています。


ZS アービトラージでキッチンブローカーを剥がす人にとって、この内蔵されたラグは天からのマナのようなものです。つまり、ブローカーは相当な追加リスクを負うことになる。

 
どのサーバーで確認しましたか?

どのようなツールで、どのようなゲートウェイ/データフィードで初期データを形成したのでしょうか?

時刻がMT5サーバー自体ではなく、そのリモート側(例:取引所ゲートウェイ)で見積もりプロバイダーによって生成された場合、ギャップが生じる可能性があります。

何万、何十万という並列取引による ストレステストなど、どのようなバックグラウンドのプロセスを忘れてしまうのでしょうか。
 

Renat Fatkhullin:
На каком сервере проверяли?

多くのサーバーで確認。MQ-Demoを 含む。

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

SL/TP注文の受付

fxsaber, 2020.11.25 00:47

MQ-Demoで実行した結果。

Total Orders (from 2020.09.01 00:00:00) = 58493, calculated = 439
Calculation time = 00:00:11.328, Performance = 38.0 orders/sec.

ServerName: MetaQuotes-Demo

Last Tick 2020.09.30 19:07:32.917 1.80181 1.80205
Accepted Tick 2020.09.30 19:07:32.716 1.80178 1.80202
Accepted Length = 357 ms.
Order 726444166 ORDER_TYPE_BUY GBPAUD 2020.09.30 19:07:33.073 1.80206 ORDER_REASON_TP ORDER_STATE_FILLED 2020.09.30 19:07:33.082, Position created 2020.09.30 17:21:17.933, StopLevel = 0

Orders (2) before 726444166 with PositionID = 725926764:
------------------------
Checked Orders = 0
------------------------


このスクリプトは、TPオーダーとその作成のきっかけとなったティックを見つけたと主張しています(テキスト内で色分けされています)。取引サーバー(特にデモ)で価格がオープンポジションのTPレベルに達した場合、対応するTP注文が直ちに作成される(必ずしも執行されない)ように思われるのですが。しかし、この状況では、すぐには起きず、357ミリ秒後に起きたのです


どの機器で、どのゲートウェイ/データフィードで初期データが形成されたのか?

FXツール、RannForex-Server、AMTS-gatewayを確認しました。その他の構成については、明確にする必要がある。

時間がMT5サーバー自体ではなく、そのリモート側(例えば、取引所ゲートウェイ)の見積もりプロバイダーによって形成された場合、そのギャップはあり得ます。

MT5サーバーはPingがゼロのマシンに形成されていたと思います。しかし、100%保証のためには明確な説明が必要です。しかし、上記は、あなたのサーバーでも問題があることを示しました。

 
fxsaber:

TP注文の執行を調査していると、一部のTP注文が、それを受け付けたティックから大きく遅れて作成されていることに気づきました。

報告会では、異なるブローカーだけでなく、取引サーバーと同じマシンにあるターミナルで取引を行う場合にも、この状況が繰り返されることがわかりました。I.e.非常に低いpingで、Trading Server用の単一の取引アカウントを使用します。

ぜひ、皆さんのアカウントから結果を共有してください。MT5をより良くするために

58,000件のオーダーをチェックし、300msでオーバーシュートしたケースを1件だけ見つけたという、非常に細かい点を「忘れて」います。この1点(58000分の1)は、このチェックの際に明確に強調されるべきでした。

以前の100万円チェックの時も、一人の異常値を探して正常な動作であるかのように装っていたのと同じです。


サーバーのログを確認したところ、約1500万件の口座と約200万件のオープンポジション があり、その間に近隣の仮想サーバーやハイパーバイザーで何かが起きていたため、MetaQuotes-Demoサーバーとの仮想化がその数秒間(2020.09.30 19:07 4秒間)物理的に病んでいることが分かりました。

いずれにせよ、どのようなシステムにも必ず単一の異常値は存在するが、さらに調べてみることにする。

理由: