記事"MQL5とQLUAの比較ーなぜMQL5での取引操作は28倍速いのか?"についてのディスカッション - ページ 4

 

この問題を「端末カーネルからMQL5コードが呼び出される頻度」と言い換えれば、すべての測定が間違っていることになる:

  1. 不要なMQL5コードをすべて削除し、1つのむき出しの関数にカウンターをいくつか残して、測定自体のコストを最小限に抑えるべきである。
  2. 適切なOnXXXXのエントリーポイントと、カーネルからの呼び出しを強制的に生成する方法を見つける。ここで、計測用に別のテストビルドを作成する必要がある。

この場合、ポリゴンを 構築することで、MQL5コールのオーバーヘッドをすべて測定し、興味深い特性を得ることができる。我々の習慣として、次にすべてを数回最適化する。

これは興味深い作業であり、これから対処していく。

 
fxsaber:


わかったよ!

そうだ。

すみません、見落としていました。

 
Renat Fatkhullin:

この問題を「端末カーネルからMQL5コードが呼び出される頻度」と言い換えれば、すべての測定が間違っていることになる:

  1. 不要なMQL5コードをすべて削除し、1つのむき出しの関数にカウンターをいくつか残して、測定自体のコストを最小限に抑えるべきである。
  2. 適切なOnXXXXのエントリーポイントと、カーネルからの呼び出しを強制的に生成する方法を見つける。ここで、計測用に別のテストビルドを作成する必要がある。

この場合、ポリゴンを構築することで、MQL5コールのオーバーヘッドをすべて測定し、興味深い特性を得ることができる。我々の習慣として、次にすべてを数回最適化する。

これは面白い作業なので、やってみます。

このようなマニアックなことを放っておかずにいてくれてありがとう!

おそらく、見積もりパケットの到着速度を測定するためには、別のビルドが必要だろう。ちょうど私が測定したかったものです。

削除済み  
レナト・ファトフーリンfxsaber- 明確な説明をありがとう。
 
fxsaber:

リアル口座でのMT5スピードテストを再度お願いします。

取引、自動取引システム、取引戦略のテストに関するフォーラム

CopyTicks」のテスト

fxsaber, 2016.09.13 11:11 AM

OrderSendAsyncを通じてスプレッド内に2つの指値(BuyLimit1_price < BuyLimit2_price)を送信した場合、取引所は同時に(1msの精度で)ビッド価格を改善した2つの連続したティックを生成しますか?

これが何をもたらすかを説明しましょう。

スプレッドの内側で BuyLimit1 が送信されると、取引所からティックがその誕生の時刻とともに送られてきます (新しい Bid が生成されます)。BuyLimit2が送信されると、ティックの誕生時刻とともに別のティックが送信されます。これら2つの時間の違いは、取引所へのMT5取引注文の配信速度特性です。

このような実験による金銭的損失を最小限に抑えるには、2つのBuyLimitを非同期に送信するのではなく、スプレッドの内側にBuyLimitとSellLimitを送信し、流動性の低い取引商品を選択します。

 

比較する前に、複雑な取引操作 全体を「完了」させる必要がある。

(データの受信、取引の正当化、取引の確認の受信)。

ビルド1395追加、リアル

2016.09.14 17:30:03.100 Trades  'xxxxx': sell limit 5.00 BR-12.16 at 47.56
2016.09.14 17:30:06.849 Trades  'xxxxx': accepted sell limit 5.00 BR-12.16 at 47.56
2016.09.14 17:30:06.849 Trades  'xxxxx': sell limit 5.00 BR-12.16 at 47.56 placed for execution in 3750.466 ms
2016.09.14 17:30:06.851 Trades  'xxxxx': cancel order #44309414 sell limit 5.00 BR-12.16 at 47.56
2016.09.14 17:30:10.014 Trades  'xxxxx': deal #29388895 sell 1.00 BR-12.16 at 47.56 done (based on order #44309414)
2016.09.14 17:30:10.014 Trades  'xxxxx': exchange buy 1.00 BR-11.16 at market
2016.09.14 17:30:10.385 Trades  'xxxxx': deal #29388914 sell 4.00 BR-12.16 at 47.56 done (based on order #44309414)
2016.09.14 17:30:12.374 Trades  'xxxxx': accepted exchange buy 1.00 BR-11.16 at market
2016.09.14 17:30:12.375 Trades  'xxxxx': exchange buy 1.00 BR-11.16 at market placed for execution in 2360.902 ms
2016.09.14 17:30:12.398 Trades  'xxxxx': deal #29389024 buy 1.00 BR-11.16 at 47.25 done (based on order #44309578)
2016.09.14 17:30:12.401 Trades  'xxxxx': exchange buy 4.00 BR-11.16 at market
2016.09.14 17:30:13.006 Trades  'xxxxx': accepted exchange buy 4.00 BR-11.16 at market
2016.09.14 17:30:13.007 Trades  'xxxxx': exchange buy 4.00 BR-11.16 at market placed for execution in 606.852 ms
2016.09.14 17:30:13.009 Trades  'xxxxx': deal #29389140 buy 4.00 BR-11.16 at 47.25 done (based on order #44309644)
2016.09.14 17:30:13.015 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.74
2016.09.14 17:30:13.357 Trades  'xxxxx': accepted buy limit 5.00 BR-12.16 at 47.74
2016.09.14 17:30:13.357 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.74 placed for execution in 342.736 ms
2016.09.14 17:30:13.668 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.79
2016.09.14 17:30:13.712 Trades  'xxxxx': accepted buy limit 5.00 BR-12.16 at 47.79
2016.09.14 17:30:13.716 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.79 placed for execution in 48.228 ms
2016.09.14 17:30:13.718 Trades  'xxxxx': deal #29389165 buy 5.00 BR-12.16 at 47.79 done (based on order #44309680)
2016.09.14 17:30:13.721 Trades  'xxxxx': exchange sell 5.00 BR-11.16 at market
2016.09.14 17:30:13.740 Trades  'xxxxx': accepted exchange sell 5.00 BR-11.16 at market
2016.09.14 17:30:13.741 Trades  'xxxxx': exchange sell 5.00 BR-11.16 at market placed for execution in 20.867 ms
2016.09.14 17:30:13.778 Trades  'xxxxx': deal #29389166 sell 5.00 BR-11.16 at 47.29 done (based on order #44309682)
 

取引、自動取引システム、取引戦略のテストに関するフォーラム

FORTS。執行に関する質問

Renat Fatkhullin, 2016.08.23 16:35

5-10ミリ秒待ってからもう一度試してみてください。

取引確認はすぐに得られますが、取引の全詳細はその後に非同期で届くということです。0~Nミリ秒かかることもありますが、通常は1~2ミリ秒以内です(もちろんpingにもよります)。

このような事情から、QLUAとの比較ではMT5が有利とは言えません。
 
prostotrader:

比較する前に、複雑な取引操作 全体を「完了」させる必要がある。

(データの受信、取引の正当化、取引の確認の受信)。

ビルド1395を追加。


同様の操作を手動で行ったところ11.7 ms

2016.09.14 18:17:26.298	Trades	'10321': order #44324961 buy limit 1.00 / 1.00 BR-12.16 at 47.00 done in 11.759 ms
2016.09.14 18:17:26.295	Trades	'10321': buy limit 1.00 BR-12.16 at 47.00 placed for execution
2016.09.14 18:17:26.293	Trades	'10321': accepted buy limit 1.00 BR-12.16 at 47.00
2016.09.14 18:17:26.286	Trades	'10321': buy limit 1.00 BR-12.16 at 47.00
 
Renat Fatkhullin:

あなたは本当の報告書を見ようとせず、独自の不具合のある方法で取引時間を計測している。

そして、自分の間違いを認めようとせず、自分の誤ったスクリプトによるとんでもない数字を信じようとする。

同じような操作を手動でやってみた:11.7ミリ秒。

何を言っているんだ、レナート?

これはTemninalのログからの抜粋であり、私のログではない!

 
fxsaber:
このような事情から、QLUAとの比較ではMT5が有利にならないように若干調整する必要があります。

調整する必要はない。私の表現は、一般的なケースを想定したものであり、「インターネットやpingはどのようなものであってもよく、実際にはネットワークによっては0~N msでトランザクションを得ることができる」というものです。そしてそれは0ミリ秒である可能性が高い。

ここに、非同期モードですべてのトランザクションを制御する検証コードがある:

ulong ExtTicks=0;
//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 取引サーバーへのpingをミリ秒単位で出力する。
   PrintFormat("AsyncTradesTest: last ping %.2f ms, build %d",TerminalInfoInteger(TERMINAL_PING_LAST)/1000.0,TerminalInfoInteger(TERMINAL_BUILD));
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   Print(EnumToString(trans.type)," ",trans.symbol,": ",trans.price," ",result.order," time: ",(GetMicrosecondCount()-ExtTicks)/1000.0," ms");
  }
//+------------------------------------------------------------------+
//| エキスパート・ティック機能|
//+------------------------------------------------------------------+
void OnTick()
  {
   static bool started=false;
//--- 最初のティックでシリーズを1回実行する。
   if(!started)
     {
      started=true;
      //--- お問い合わせ内容をご記入ください。
      MqlTradeRequest req={};
      MqlTradeResult  res={};

      req.volume      =1;
      req.symbol      =_Symbol;
      req.price       =SymbolInfoDouble(_Symbol,SYMBOL_ASK);
      req.sl          =0;
      req.tp          =0;
      req.deviation   =100;
      req.type_filling=ORDER_FILLING_RETURN;
      req.action      =TRADE_ACTION_DEAL;
      req.type        =ORDER_TYPE_BUY;
      req.magic       =2016;
      //--- 操作ループを実行する
      ExtTicks=GetMicrosecondCount();
      Print("Start...");
      OrderSendAsync(req,res);
     }
  }

これが実際の口座での 出力です:

2016.09.14 18:32:53.234 Test (BR-12.16,H1)      TRADE_TRANSACTION_HISTORY_ADD BR-12.16: 0.0 0 time: 11.455 ms
2016.09.14 18:32:53.232 Test (BR-12.16,H1)      TRADE_TRANSACTION_DEAL_ADD BR-12.16: 47.13 0 time: 8.778 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_DELETE BR-12.16: 0.0 0 time: 8.457000000000001 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_UPDATE BR-12.16: 0.0 0 time: 8.202999999999999 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_REQUEST : 0.0 44326441 time: 8.151 ms
2016.09.14 18:32:53.228 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_UPDATE BR-12.16: 0.0 0 time: 5.196 ms
2016.09.14 18:32:53.228 Test (BR-12.16,H1)      TRADE_TRANSACTION_REQUEST : 0.0 44326441 time: 5.171 ms
2016.09.14 18:32:53.227 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_ADD BR-12.16: 0.0 0 time: 4.184 ms
2016.09.14 18:32:53.223 Test (BR-12.16,H1)      Start...
2016.09.14 18:32:49.753 Test (BR-12.16,H1)      AsyncTradesTest: last ping 2.15 ms, build 1417

下から上へ読んでください。

これは、トランザクションのすべての段階を、開始から費やされた時間の累計とともに示している。トランザクションの種類によって、何がいつターミナルに追加されたかがわかる。

合計時間は11.45ミリ秒である。