ライブラリ: MT4Orders - ページ 43

 
traveller00:
証券取引所と実際の取引、ブローカーOtkrytie上の実際のアカウントで、たとえ10秒間待っても助けにはなりませんでしたが、それでも履歴との同期がとれていないことをallertsポップアップ表示されます。そして、彼らはかなり頻繁にポップアップ表示されます。私の意見では非常に奇妙である、他の特別なラグが見られない、ping 4ミリ秒、注文の実行は、通常15ミリ秒未満である。私は、すべてが正しいかどうか疑いさえ持ち始めました。私はINOUTを使用せず、すべてのINとOUTを別々に使用していますが。このケースを回避する方法はありますか?例えば、自分でチケットを覚えるとか。また、これを解決する優先順位はどの程度なのでしょうか?

両方のログを掲載してください。

 

fxsaberさん、こんにちは、

2020年に向けて頑張ってください!

MT4OrderClose 関数の取引リクエストにマジックナンバーを含めないのは設計上の選択ですか?

現在、MT4OrderClose からのDEAL_ENTRY_OUT は magic == 0 となります。

ポジションIDでDEAL_ENTRY_INからマジックナンバーを追跡できるため、大きな違いはありませんが、履歴分析目的では、DEAL_ENTRY_IN / DEAL_ENTRY_OUTが一致する方が柔軟性が増すと思われます。


Hi fxsaber,

2020年に向けて頑張ってください!

MT4OrderClose 関数の取引リクエストにマジックナンバーを含めないのは設計上の選択ですか?

現在、MT4OrderClose の DEAL_ENTRY_OUT はマジック==0 となります。

ポジションIDを使用すれば、DEAL_ENTRY_INからマジックナンバーをバックトラックすることが可能であるため、大きな問題ではありませんが、履歴分析の目的では、DEAL_ENTRY_IN/DEAL_ENTRY_OUTを一致させた方が柔軟性が増すと思われます。

 
Enrique Dangeroux:

MT4OrderClose 関数の取引リクエストにマジックナンバーを含めないのは、設計上の選択ですか?

現在、MT4OrderClose からのDEAL_ENTRY_OUT は magic == 0 となります。

ポジション ID を使用すれば、DEAL_ENTRY_IN からマジックナンバーを追跡できるため、大きな違いはありませんが、履歴分析目的では、DEAL_ENTRY_IN / DEAL_ENTRY_OUT を一致させた方が、おそらく柔軟性が高まります。

OrderClose では、必要に応じて MagicNumber を設定できます。

MT5 では、ポジションを部分的に決済するときに、オープンポジションの MagicNumber を変更できるので、選択肢が与えられます。

たとえば、MagicNumber = 5 のオープンポジションがあり、手動でポジションをクローズする場合、DEAL_ENTRY_OUT_MAGIC = 0 となります。この場合でも、ライブラリは OrderMagicNumber() = 5 を返します。

 
// 変更リスト:
// 12.01.2020
// 修正: 残高取引の OrderTicketID() が正しい値を返すようになりました。
// 修正:OrderTicketID() (MT5-PositionID)によるSELECT_BY_TICKET選択を修正しました。
// 修正:マクロとの互換性を高めるため、ライブラリーの内部メソッド名を変更。
 
バグなのか機能なのかわかりませんが、先物の場合、利益と始値が正確に計算されません。例えば、12:00 にポジションがオープンさ れ、18:40 にポジションがクリアされて自動的に再オープンされ、20:00 にポジションがクローズされたとします。4 回目の取引(ポジションを決済)のチケットの GetHistoryPositionData は、MT4ORDERS::Order.Profit = ::HistoryDealGetDouble(Ticket, DEAL_PROFIT); として利益を選択します。しかし、MT4ORDERS::Order.OpenPrice = ::HistoryDealGetDouble(OpenTicket, DEAL_PRICE);として始値を返します。つまり、最初の取引の始値が返されます。私の意見では、最初の取引(始値と利益の両方)からすべてを引き出すか、最後の始値(3回目の取引から清算まで)からすべてを引き出すか、どちらかに統一するのが理にかなっていると思います。それとも、これは機能であり、このようになるべきで、私が何かを見逃しているのでしょうか?
 
traveller00:
バグなのか機能なのかわかりませんが、先物の場合、利益と始値が正確に計算されません。例えば、12:00 にポジションがオープンさ れ、18:40 にポジションがクリアされて自動的に再オープンされ、20:00 にポジションがクローズされたとします。4 回目の取引(ポジションを決済)のチケットの GetHistoryPositionData は、MT4ORDERS::Order.Profit = ::HistoryDealGetDouble(Ticket, DEAL_PROFIT); として利益を選択します。しかし、MT4ORDERS::Order.OpenPrice = ::HistoryDealGetDouble(OpenTicket, DEAL_PRICE);として始値を返します。つまり、最初の取引の始値が返されます。私の意見では、最初の取引(始値と利益の両方)からすべてを引き出すか、最後の始値(3回目の取引から清算まで)からすべてを引き出すか、どちらかに統一するのが理にかなっていると思います。それとも、これは機能であり、こうあるべきで、私が何かを見逃しているのでしょうか?

ライブラリーを通してネッティングの履歴を分析しているのですね。これはまさに、ライブラリーが完成していない、最初に声が上がったケースです。そして、完成するかどうかは大きな問題だ。というのも、いじくり回すことが多く、実際にはそのような必要性がないからだ。

私は今でもネッティングで同じライブラリを使っているが、歴史を扱うのは迂遠だ。

 

https://www.mql5.com/ru/blogs/post/733393


ブログの記事から、ある状況でのスピードを測定。

#include <MT4Orders.mqh>

#define  BENCH(A)                                                               \
{                                                                              \
  const ulong _StartTime = GetMicrosecondCount();                              \
  A;                                                                           \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - _StartTime)); \
}

void OnStart()
{
  BENCH(HistorySelectByPosition(270107))
  BENCH(HistorySelectByPosition(270107))

  BENCH(HistorySelect(0, INT_MAX))
  BENCH(HistorySelect(0, INT_MAX))

  BENCH(OrdersHistoryTotal())
  BENCH(OrdersHistoryTotal())

  BENCH(OrderSelect(270107, SELECT_BY_TICKET, MODE_HISTORY))
  BENCH(OrderPrint());

  BENCH(OrderSelect(1000, SELECT_BY_POS, MODE_HISTORY))
  BENCH(OrderPrint());
}


結果。

Time[HistorySelectByPosition(270107)] = 9232 // コールドスタート。
Time[HistorySelectByPosition(270107)] = 8571 // ホットローンチ。

Time[HistorySelect(0,INT_MAX)] = 152856 // コールドスタート。
Time[HistorySelect(0,INT_MAX)] = 94924  // ホットローンチ。

Time[OrdersHistoryTotal()] = 155735 // コールドスタート。
Time[OrdersHistoryTotal()] = 6774   // ホットローンチ。

Time[OrderSelect(270107,1,1)] = 23 // 無料。
#85469 2020.02.05 22:32:12 buy 0.01 USDCNH 6.97767 0.00000 6.98533 2020.02.05 22:32:13 6.97533 0.00 0.00 -0.34 OrderSendTest_Position 0
Time[OrderPrint()] = 20 // 無料。

Time[OrderSelect(1000,0,1)] = 11 // 無料。
#10613 2020.02.06 02:34:32 buy 0.01 EURUSD 1.10049 0.00000 1.11046 2020.02.06 02:34:32 1.10046 0.00 0.00 -0.03 OrderSendTest_Position 0
Time[OrderPrint()] = 13 // 無料。


HistorySelect関数にどれだけコストがかかっているかがよくわかる。

OrdersHistoryTotal on hotは、少ないとはいえ、やはり目立つので、On-eventごとに1回以上呼び出さないようにすることを常に推奨していた。

履歴によるOrderSelectは無料であることが判明した。

Особенности исполнения торговых приказов MT5
Особенности исполнения торговых приказов MT5
  • www.mql5.com
Анализировал с владельцем MT5-сервера тормоза торговых приказов. Запускался OrderSend-Test2.mq5 в том же месте, где MT5-сервер стоит. Т.е. нулевой пинг. Демо, все внутри. Изучались логи MT5-сервера (2170) и MT5-клиента (2280). Логи сервера не буду приводить, просто словами опишу. Думаю, результаты буду интерсны всем, т.к. это поможет раскрыть...
 

成行注文(TP/SLを含む)の約定に費やされた時間の統計を収集できます。

//成行注文(TP/SLを含む)の執行に費やされた時間の統計。
#property script_show_inputs

input datetime inFrom = 0;
input datetime inTo = INT_MAX;

struct ORDER
{
  ulong Ticket;
  
  ulong FillingTime;
  
  string ToString( void ) const
  {
    return((string)Ticket + ": " + ::TimeToString(this.FillingTime / 1000, TIME_SECONDS) +
                            "." + ::IntegerToString(this.FillingTime % 1000, 3, '0'));
  }
};

// 成行注文の執行に費やされた時間に関するデータを収集する。
int GetOrders( ORDER &Orders[], const datetime From = 0, const datetime To = INT_MAX )
{
  int Amount = 0;
  
  if (HistorySelect(From, To)) // 履歴にレコードがある場合
    for (int i = ArrayResize(Orders, HistoryOrdersTotal()) - 1; i >= 0; i--) // オーダーの選択を実行する
    {
      const ulong TicketOrder = HistoryOrderGetTicket(i); // 令状を選択した
      
      if ((HistoryOrderGetInteger(TicketOrder, ORDER_TYPE) <= ORDER_TYPE_SELL) &&   // 成行注文の場合
          (HistoryOrderGetInteger(TicketOrder, ORDER_STATE) == ORDER_STATE_FILLED)) // 注文が実行された場合
      {
        Orders[Amount].Ticket = TicketOrder;
        
        // 実行にかかった時間を覚えている。
        Orders[Amount++].FillingTime = HistoryOrderGetInteger(TicketOrder, ORDER_TIME_DONE_MSC) -
                                       HistoryOrderGetInteger(TicketOrder, ORDER_TIME_SETUP_MSC);
      }
      }
  
  return(ArrayResize(Orders, Amount));
}

// #include <MT4Orders.mqh> //https://www.mql5.com/ja/code/16006

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  ORDER Orders[];
  
  if (GetOrders(Orders, inFrom, inTo))
  {
    ArraySortStruct(Orders, FillingTime); //https://www.mql5.com/ru/forum/170952/page166#comment_15151387
    
    // 最も長く約定した成行注文を出力。
    for (int i = ArraySize(Orders) - 1, k = 0; (i >= 0) && (k < 10); i--, k++)
    {
      Print((string)k + " - " + Orders[i].ToString());

    #ifdef __MT4ORDERS__
      if (OrderSelect(Orders[i].Ticket, SELECT_BY_TICKET))
      {
        OrderPrint();
        
        PRINT(OrderTicketID());
        PRINT(OrderTicketOpen());
  
        Print("-------------------");      
      }
    #endif // __mt4orders__ 
    }
  }
}


結果

0 - 348806: 00:01:57.311
1 - 348530: 00:01:39.027
2 - 348494: 00:01:15.259
3 - 348406: 00:01:07.671
4 - 348950: 00:01:04.869
5 - 348960: 00:01:02.888
6 - 348814: 00:01:00.654
7 - 348392: 00:01:00.642
8 - 348508: 00:00:54.515
9 - 348550: 00:00:54.467


稼働中の口座で最大2分の約定。統計をここで共有してください。このスクリプトはライブラリを使用していませんので、Netting/Hedgeに適しています。

 

MT4/5では、取引履歴を扱うときにデバッグするのはかなり不愉快です。さまざまな松葉杖ソリューションを使用する必要があります。


MT5 では、MT4Orders を介して選択された注文のすべてのフィールドをすぐに確認できます。これを行うには、MT4ORDERS::OrderをMT4ORDERS::Order 観察に追加する必要があります。


こうすると、選択した注文のすべてのプロパティを見ることができます。

 
fxsaber:

統計情報を共有しましょう。このスクリプトは、Netting/Hedgeに適したライブラリを使用していません。

これが本当の姿です:

2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      0 - 34487054: 00:00:06.768
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      1 - 34487223: 00:00:06.166
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      2 - 49869622: 00:00:03.656
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      3 - 34486559: 00:00:02.833
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      4 - 34486482: 00:00:02.051
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      5 - 34486480: 00:00:02.023
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      6 - 34486467: 00:00:01.983
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      7 - 42624984: 00:00:01.589
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      8 - 33738445: 00:00:01.088
2020.02.27 14:53:30.275 ExecutionSpeed (EURUSD,H1)      9 - 42625044: 00:00:00.932