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

 
fxsaber #:

ライブラリ(MT4Orders.mqh)はそれほどメモリを消費しません。たとえば、この EA を 実行して、ご自分の目で確かめてみてください。

新しいインジケータハンドルを作成し、古いハンドルを削除していません。

私はインジケーターを使用していません。

あなたの言う通り、ライブラリはそれほど大量のメモリを消費しませんが、それでもこれだけのメモリを消費します:

HistorySelect(0,INT_MAX);

このページによると

https://www.mql5.com/ja/articles/211

「取引履歴をすべて処理しようとする試みは、ほとんどの場合、間違っています。処理される取引/注文の数が数千、数万程度になると、プログラムの動作は劇的に遅くなります。"

1M以上の取引がある場合、ライブラリはそれらをすべて配列に格納します。

mt4とmt5の架け橋となるこのライブラリを作成し、皆と共有したことに感謝します。ただ、スワップや手数料の値を適切に取得する方法(ブローカーが実際に提供しているものであることを前提に)を説明している場所がオンライン上に1つしかなく、しかも難解な方法で書かれているのが残念です。

Orders, Positions and Deals in MetaTrader 5
Orders, Positions and Deals in MetaTrader 5
  • www.mql5.com
Creating a robust trading robot cannot be done without an understanding of the mechanisms of the MetaTrader 5 trading system. The client terminal receives the information about the positions, orders, and deals from the trading server. To handle this data properly using the MQL5, it's necessary to have a good understanding of the interaction between the MQL5-program and the client terminal.
 
pcdeni #:

あなたの言う通り、ライブラリーはそれほどメモリを消費しないが、しかし、これは使用する:

このページによると

https://www.mql5.com/ja/articles/211

「取引履歴をすべて処理しようとする試みは、ほとんどの場合、間違っています。処理される取引/注文の数が数千、数万程度になると、プログラムの動作は急激に遅くなります。"

1M以上の取引がある場合、ライブラリはそれらをすべて配列に格納します。

#define  MT4ORDERS_BYPASS_MAXTIME 1000000
#include <MT4Orders.mqh> //https://www.mql5.com/ru/code/16006

double GetSummaryCommissionMQL5()
{
  double Res = 0;
  
  if (HistorySelect(0, INT_MAX))
    for (uint i = HistoryDealsTotal(); (bool)i--; )
      Res += HistoryDealGetDouble(HistoryDealGetTicket(i), DEAL_COMMISSION);

  return(NormalizeDouble(Res, 2));
}

double GetSummaryCommissionMQL4()
{
  double Res = 0;
  
  for (uint i = OrdersHistoryTotal(); (bool)i--; )
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      Res += OrderCommission();

  return(NormalizeDouble(Res, 2));
}

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

void OnStart()
{
  PRINT(MQLInfoInteger(MQL_MEMORY_USED));
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));

  PRINT(GetSummaryCommissionMQL5());

  PRINT(MQLInfoInteger(MQL_MEMORY_USED));
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));

  PRINT(GetSummaryCommissionMQL4());

  PRINT(MQLInfoInteger(MQL_MEMORY_USED));
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));

  PRINT(HistoryDealsTotal());
  PRINT(HistoryOrdersTotal());
  PRINT(PositionsTotal());
}


その結果

MQLInfoInteger(MQL_MEMORY_USED) = 1
TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1203

GetSummaryCommissionMQL5() = -43568.97
MQLInfoInteger(MQL_MEMORY_USED) = 1
TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1404

GetSummaryCommissionMQL4() = -43568.97
MQLInfoInteger(MQL_MEMORY_USED) = 45
TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1424

HistoryDealsTotal() = 130330
HistoryOrdersTotal() = 190241
PositionsTotal() = 0


130K 取引 + 190K 注文、端末のメモリ消費量は 20 MB 増加(+10%)。

パフォーマンスを自分で測定できます。ドキュメントはとっくに古くなっています。

 
このライブラリを使用すると、メモリ消費量が最大10%増加する 可能性がある。
 
fxsaber #:
ライブラリを使用すると、メモリ消費量が最大10%増加する 可能性があります。

その理由は何ですか?

 
Vitaly Muzichenko #:

それと何の関係があるんだ?

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

ライブラリ: MT4Orders

fxsaber, 2023.07.07 13:12

  • OrderSelectは、履歴から選択された注文の全データを計算します(OrderPrintは無料です)。これは、HistoryOrderGet*関数とHistoryDealGet*関数の素晴らしい組み合わせで、どんな複雑な相場状況や多くの落とし穴にも対応します。MT4ORDERS::GetHistoryPositionData()をチェックしてください。これはターミナル用とテスター用の単一の関数ですが、ターミナルの多くの落とし穴がテスターには存在しないため、テスター用に特別に高速化されています。設定の例:123
 
fxsaber #:
ライブラリを使用すると、メモリ消費量が最大10%増加する 可能性があります。

昨日、ライブラリーのアップデートがあったと思っていたんだけど、1年も追いつかなかったよ :)

楽しみにしているよ!

 

サブでは、機能移譲でconstを使うことはどの程度有利なのでしょうか?

また同時に、関数の中にクラスメンバーを 作ることは合理的なのでしょうか、それともロボットトレードではグローバル、7文字でできるのでしょうか?

スパイ・インジケータを使用して、各ティックで処理を行います。

各ティックでの処理は、空の通常では、異常をキャッチしません、それはあなたの関数の質問の最適化の問題です...
 
// 変更リスト:
// 21.07.2023
// 修正: 削除された未決注文の OrderLotsOpen() を修正しました。
// 追加: MT5 取引に MT5 注文がない場合の処理を行います。
// SL/TP注文に価格がない場合のOrderClosePriceRequest()の定義を修正。
// 追加: MT4ORDERS_AUTO_VALIDATION マクロを使用すると、マーケット商品を自動的に検証できます。
// 追加: MT4ORDERS_ORDERS_SORT マクロは、終了/削除時間順に並べ替えられた MT4 注文履歴を生成します。
 

fxsaber #:

/ 追加: MT4ORDERS_ORDERS_SORTマクロは、MT4の注文履歴を終了/削除時刻順にソートして生成します。

アップデートをダウンロードして確認したところ、指値注文ですべて問題なく機能している。

ありがとうございます!

 
Vitaly Muzichenko #:

ラグはまだない。

現在、前方変種が 使用されている。

以下は、OrdersHistoryTotal() の隣接する呼び出しの間に取引履歴が更新された場合に、そのようなソリューションの実行時間を表示できるコードです。

#include <fxsaber\Benchmark\Benchmark.mqh> //https://www.mql5.com/ja/code/31279

ulong OrdersMQL5()
{
  ulong Res = 0;

  if (HistorySelect(0, INT_MAX))
  {
    const int Total = HistoryOrdersTotal();
    ulong Array[][2];
    
    ArrayResize(Array, Total);
    
    for (int i = 0; i < Total; i++)
    {
      const ulong Ticket = HistoryOrderGetTicket(i);

      Array[i][0] = HistoryOrderGetInteger(Ticket, ORDER_TIME_DONE_MSC);
      Array[i][1] = Ticket;
    }
          
    ArraySort(Array);      
    
    Res = Array[Total - 1][1];
  }
  
  return(Res);
}

void OnStart()
{
  OrdersMQL5(); // ウォーミングアップ。
  
  for (int i = 0; i < 3; i++)
    _B(OrdersMQL5(), 1);
    
  Print(HistoryOrdersTotal());
}


いくつかの取引口座で結果を実行する。HistoryOrdersTotal() の横軸。

X - 履歴オーダー合計()

100KのMT5注文で、ラグが10ミリ秒(取引履歴が前回の実行後に更新された場合のOrdersHistoryTotalの実行時間)かかることがはっきりとわかります。

Testerではまったくラグがありません。ターミナルのみ。もちろん、高速化することは可能ですが、そこまでではありません。