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

 

今日、ブレントで強い動きがあった

そしてこの瞬間、MT5がこれらの遅延を処理した。

 
Renat Fatkhullin:

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

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

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

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

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

合計時間は11.45ミリ秒です。

わかりやすいコードをありがとうございました!この結果によると、修正すべき点は本当に何もありません。私はミスを犯しました。
 
prostotrader:

今日、ブレントで強い動きがあった。

そしてこの瞬間、MT5がこれらの遅延を処理しました。

即座に画面を録画するためにホットキーを準備しておいてください。あるいは、24時間すべてを記録してください。問題のある部分を切り取って証拠として提示することもできます。今は言葉だけでいい。
 
prostotrader:

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

それはテムニナルの日誌からの抜粋で、私自身の日誌ではないわ!

そう、その通り。すみません、タイムを間違えてカウントしていた仲間と混同してしまいました。

これは取引所への質問なのですが、なぜ最小限の動きで常にそのような動作をするのでしょうか?

あなたは、市場に近い47.56で指値注文を出したかったのでしょうが、取引所は、それにサプライズがないように、わざと近い価格間隔の注文の受付を遅くしたのでしょう:


1分間に320ロットというとんでもない取引量であったため、パフォーマンスの観点からは疑問の余地はない。

平穏なマーケットでの私のパフォーマンスを上に示した。

 
fxsaber:
ホットキーを準備しておけば、すぐに画面録画ができます。24時間すべてを録画することもできます。いつでも問題のある部分を切り取って証拠として提出できる。今は言葉だけでいい。

今日、ブレントで強い動きがありました。

そしてこの瞬間、MT5がこれらの遅れに対処した。

MT5だけがこれらの遅延とは何の関係もない。

長い間対応したのは取引所です。

 
Renat Fatkhullin:

MT5だけがこれらの遅れとは何の関係もない。

対応に時間がかかったのは取引所です。

取引所のブレーキがこのように動作したときに表示される、例のログの行をハイライトしてもらえますか?

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
 

ここから顕著になる可能性が高いが、最後の2つの取引では間違いなく目につくだろう:

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
 
Renat Fatkhullin:

ここから目立つようになる可能性が高いが、最後の2つの取引では間違いなく見えるだろう:

ありがとう。各取引の内部処理については、ヘルプや 記事には ほとんど記載されていません。

あなたの説明では、最初の4行(8ミリ秒)はまだ取引ではないようです。実際に何が起こっているのか、どこで読むことができますか?理解できないし、どこで理解できるのかも不明です。

 
fxsaber:

ありがとう。各取引の内部処理については、ヘルプや 記事を見ても よくわかりません。

あなたの説明では、最初の4行(8ミリ秒)はまだ取引ではない ことがわかりました。実際に何が起こっているのか、どこで読むことができますか?理解できないし、どこを強調すればいいのかもわからないからです。

いや、そうは言っていない。

私は急いでコードをスケッチし、すべてのフィールドを記述しませんでした。私のスクリプトの関数への各入力をデバッガでチェックし、より多くのフィールドを出力してください。

 
fxsaber:

ありがとう。各取引の背後にある内部プロセスについては、ヘルプと 記事は かなりお粗末です。

モスクワ取引所MOEX用の取引ロボットを作成する場合、何から始めればよいかの 記事で、取引イベントのリスナーの例が示されています。

//+------------------------------------------------------------------+
//|TradeTransactionListener.mq5
//| Copyright 2016, MetaQuotes Software Corp.
//|https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   PrintFormat("LAST PING=%.f ms",
               TerminalInfoInteger(TERMINAL_PING_LAST)/1000.);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| エキスパート・ティック機能|
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
| トレード・トランザクション機能|
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//---
   static int counter=0;   // OnTradeTransaction() 呼び出しのカウンタ
   static uint lasttime=0; // 最後に OnTradeTransaction() を呼び出した時刻。
//---
   uint time=GetTickCount();
//--- 最後のトランザクションが1秒以上前の場合
   if(time-lasttime>1000)
     {
      counter=0; // これは新しい取引操作であることを意味し、カウンターをリセットすることができます。
      if(IS_DEBUG_MODE)
         Print(「新しい貿易オペレーション);
     }
   lasttime=time;
   counter++;
   Print(counter,". ",__FUNCTION__);
//--- 取引要求の実行結果
   ulong            lastOrderID   =trans.order;
   ENUM_ORDER_TYPE  lastOrderType =trans.order_type;
   ENUM_ORDER_STATE lastOrderState=trans.order_state;
//--- トランザクションが発生したキャラクターの名前
   string trans_symbol=trans.symbol;
//--- トランザクション・タイプ
   ENUM_TRADE_TRANSACTION_TYPE  trans_type=trans.type;
   switch(trans.type)
     {
      case  TRADE_TRANSACTION_POSITION:   // 位置を変更する
        {
         ulong pos_ID=trans.position;
         PrintFormat("MqlTradeTransaction: Position  #%d %s modified: SL=%.5f TP=%.5f",
                     pos_ID,trans_symbol,trans.price_sl,trans.price_tp);
        }
      break;
      case TRADE_TRANSACTION_REQUEST:     // トレード・リクエストの送信
         PrintFormat("MqlTradeTransaction: TRADE_TRANSACTION_REQUEST");
         break;
      case TRADE_TRANSACTION_DEAL_ADD:    // トランザクションの追加
        {
         ulong          lastDealID   =trans.deal;
         ENUM_DEAL_TYPE lastDealType =trans.deal_type;
         double        lastDealVolume=trans.volume;
         //--- 外部システムにおける取引識別子 - モスクワ取引所によって割り当てられたチケット
         string Exchange_ticket="";
         if(HistoryDealSelect(lastDealID))
            Exchange_ticket=HistoryDealGetString(lastDealID,DEAL_EXTERNAL_ID);
         if(Exchange_ticket!="")
            Exchange_ticket=StringFormat("(MOEX deal=%s)",Exchange_ticket);

         PrintFormat("MqlTradeTransaction: %s deal #%d %s %s %.2f lot   %s",EnumToString(trans_type),
                     lastDealID,EnumToString(lastDealType),trans_symbol,lastDealVolume,Exchange_ticket);
        }
      break;
      case TRADE_TRANSACTION_HISTORY_ADD: // 履歴にオーダーを追加する
        {
         //--- 外部システムにおける注文識別子 - モスクワ取引所によって割り当てられたチケット
         string Exchange_ticket="";
         if(lastOrderState==ORDER_STATE_FILLED)
           {
            if(HistoryOrderSelect(lastOrderID))
               Exchange_ticket=HistoryOrderGetString(lastOrderID,ORDER_EXTERNAL_ID);
            if(Exchange_ticket!="")
               Exchange_ticket=StringFormat("(MOEX ticket=%s)",Exchange_ticket);
           }
         PrintFormat("MqlTradeTransaction: %s order #%d %s %s %s   %s",EnumToString(trans_type),
                     lastOrderID,EnumToString(lastOrderType),trans_symbol,EnumToString(lastOrderState),Exchange_ticket);
        }
      break;
      default: // その他の取引 
        {
         //--- 外部システムにおける注文識別子 - モスクワ取引所によって割り当てられたチケット
         string Exchange_ticket="";
         if(lastOrderState==ORDER_STATE_PLACED)
           {
            if(OrderSelect(lastOrderID))
               Exchange_ticket=OrderGetString(ORDER_EXTERNAL_ID);
            if(Exchange_ticket!="")
               Exchange_ticket=StringFormat("MOEX ticket=%s",Exchange_ticket);
           }
         PrintFormat("MqlTradeTransaction: %s order #%d %s %s   %s",EnumToString(trans_type),
                     lastOrderID,EnumToString(lastOrderType),EnumToString(lastOrderState),Exchange_ticket);
        }
      break;
     }
//--- チケット注文 
   ulong orderID_result=result.order;
   string retcode_result=GetRetcodeID(result.retcode);
   if(orderID_result!=0)
      PrintFormat("MqlTradeResult: order #%d retcode=%s ",orderID_result,retcode_result);
//--- 
  }
//+------------------------------------------------------------------+
//| 回答コードを文字列に変換する。
//+------------------------------------------------------------------+
string GetRetcodeID(int retcode)
  {
   switch(retcode)
     {
      case 10004: return("TRADE_RETCODE_REQUOTE");             break;
      case 10006: return("TRADE_RETCODE_REJECT");              break;
      case 10007: return("TRADE_RETCODE_CANCEL");              break;
      case 10008: return("TRADE_RETCODE_PLACED");              break;
      case 10009: return("TRADE_RETCODE_DONE");                break;
      case 10010: return("TRADE_RETCODE_DONE_PARTIAL");        break;
      case 10011: return("TRADE_RETCODE_ERROR");               break;
      case 10012: return("TRADE_RETCODE_TIMEOUT");             break;
      case 10013: return("TRADE_RETCODE_INVALID");             break;
      case 10014: return("TRADE_RETCODE_INVALID_VOLUME");      break;
      case 10015: return("TRADE_RETCODE_INVALID_PRICE");       break;
      case 10016: return("TRADE_RETCODE_INVALID_STOPS");       break;
      case 10017: return("TRADE_RETCODE_TRADE_DISABLED");      break;
      case 10018: return("TRADE_RETCODE_MARKET_CLOSED");       break;
      case 10019: return("TRADE_RETCODE_NO_MONEY");            break;
      case 10020: return("TRADE_RETCODE_PRICE_CHANGED");       break;
      case 10021: return("TRADE_RETCODE_PRICE_OFF");           break;
      case 10022: return("TRADE_RETCODE_INVALID_EXPIRATION");  break;
      case 10023: return("TRADE_RETCODE_ORDER_CHANGED");       break;
      case 10024: return("TRADE_RETCODE_TOO_MANY_REQUESTS");   break;
      case 10025: return("TRADE_RETCODE_NO_CHANGES");          break;
      case 10026: return("TRADE_RETCODE_SERVER_DISABLES_AT");  break;
      case 10027: return("TRADE_RETCODE_CLIENT_DISABLES_AT");  break;
      case 10028: return("TRADE_RETCODE_LOCKED");              break;
      case 10029: return("TRADE_RETCODE_FROZEN");              break;
      case 10030: return("TRADE_RETCODE_INVALID_FILL");        break;
      case 10031: return("TRADE_RETCODE_CONNECTION");          break;
      case 10032: return("TRADE_RETCODE_ONLY_REAL");           break;
      case 10033: return("TRADE_RETCODE_LIMIT_ORDERS");        break;
      case 10034: return("TRADE_RETCODE_LIMIT_VOLUME");        break;
      case 10035: return("TRADE_RETCODE_INVALID_ORDER");       break;
      case 10036: return("TRADE_RETCODE_POSITION_CLOSED");     break;
      default:
         return("TRADE_RETCODE_UNKNOWN="+IntegerToString(retcode));
         break;
     }
//---
  }
//+------------------------------------------------------------------+