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

 
traveller00:
念のために言っておくと、ZIP-archivesは私の記憶では修正されていた。しかし、今はまためちゃくちゃで、そこには古いバージョンがあるので、ファイル単位でアップデートしなければならない。
 
// 変更リスト:
// 29.08.2020
// 修正:トレードの履歴に関する作業が加速されました。
 

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

ライブラリ: MT4Orders

fxsaber, 2020.08.29 00:03

2020.08.29 00:57:38.561 HistoryDealsTotal() = 9435
2020.08.29 00:57:38.813 2046.04.30 00:13:20
2020.08.29 00:57:38.813 Time[Bench(LastTimeMQL4)] = 252274
2020.08.29 00:57:38.820 2046.04.30 00:13:20
2020.08.29 00:57:38.820 Time[Bench(LastTimeMQL5)] = 7162

純粋なMQL5は、このタスクで40倍高速でした。MQL5を学びましょう!

アップデート後

        HistoryDealsTotal() = 9435
        2046.04.30 00:13:20
        Time[Bench(LastTimeMQL4)] = 16984
        2046.04.30 00:13:20
        Time[Bench(LastTimeMQL5)] = 4194

このタスクのスピードが15倍速くなりました。HistorySelect関数の特殊性を研究した結果、明らかな操作ではありませんでした。

 
MT4OrdersがMQL5+SBに移行してしまった。
// スクリプトは、すべてのクローズド・ポジションの合計継続時間を計算する。

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

// すべてのクローズドポジションの合計継続時間を返します。
int SumPositionsLengthMQL4( void )
{
  int Res = 0;
  
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
      Res += (int)(OrderCloseTime() - OrderOpenTime());
      
  return(Res);
}

#include <Generic\HashMap.mqh>

// すべてのクローズドポジションの合計継続時間を返します。
int SumPositionsLengthMQL5( void )
{
  int Res = 0;
  
  if (HistorySelect(0, INT_MAX))
  {
    CHashMap<ulong, ulong> DealsIn;  // By PositionID returns DealIn.
    const int TotalDeals = HistoryDealsTotal();
    
    for (int i = 0; i < TotalDeals; i++)
    {
      const ulong TicketDeal = HistoryDealGetTicket(i);
      
      if (HistoryDealGetInteger(TicketDeal, DEAL_ENTRY) == DEAL_ENTRY_IN)
        DealsIn.Add(HistoryDealGetInteger(TicketDeal, DEAL_POSITION_ID), TicketDeal);
      else if (HistoryDealGetInteger(TicketDeal, DEAL_TYPE) <= DEAL_TYPE_SELL)
      {
        ulong TicketDealIn;
        
        if (DealsIn.TryGetValue(HistoryDealGetInteger(TicketDeal, DEAL_POSITION_ID), TicketDealIn))
          Res += (int)(HistoryDealGetInteger(TicketDeal, DEAL_TIME) - HistoryDealGetInteger(TicketDealIn, DEAL_TIME));        
      }        
    }
  }
      
  return(Res);
}

typedef int (*SumPositionsLength)( void );

void Bench( SumPositionsLength GetSumPositionsLength, const int Amount = 100 )
{
  long Tmp = 0;

  for (int i = 0; !IsStopped() && (i < Amount); i++)
    Tmp += GetSumPositionsLength();
  
  Print(Tmp);
}

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

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

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
    PRINT(HistoryDealsTotal());

  BENCH(Bench(SumPositionsLengthMQL4))
  BENCH(Bench(SumPositionsLengthMQL5))
}


結果

        HistoryDealsTotal() = 9435
        3132754100
        Time[Bench(SumPositionsLengthMQL4)] = 871406
        3132754100
        Time[Bench(SumPositionsLengthMQL5)] = 109411


パフォーマンスに9倍の差。MQL5を学ぶ。

 
fxsaber:

結果

差し支えなければ、4kとMT5(ターミナル)のこのテストの実行時間の違いを示してください。

fxsaber:
MQL5+SBの前にMT4Ordersの恥ずかしい損失。

5行のコードとMT5用の数十行のコード - アイデアをテストするなら5-stockが望ましく、最適化するなら間違いなく2番目のオプションです。

 
Igor Makanu:

難しくなければ、4とMT5(ターミナル)の違いは、このテストの実行時間を示しています。

MT4:

OrdersHistoryTotal() = 10291
Time[Bench(SumPositionsLengthMQL4)] = 56548

OrdersHistoryTotal() = 32020
Time[Bench(SumPositionsLengthMQL4)] = 186761

OrdersHistoryTotal() = 41815
Time[Bench(SumPositionsLengthMQL4)] = 249371


MT4x32はMT5x64より、同じクローズポジション 数で4倍以上速い。


ZЫ おそらく、MT4Ordersのメモリセーブを忘れて、履歴を内部配列にセーブすれば、MT4にも勝てる。おそらくそのようにすべきです。

 
fxsaber:

MT4x32はMT5x64の4倍以上速く、クローズポジション 数は同じです。

ありがとう、これはMKの欠点だと思うが、生産性の高いMT5をどのような目的で使うべきか、彼らには彼らのビジョンがある。

fxsaber:

ZЫ おそらく、MT4Ordersのメモリ保存を忘れて、履歴を内部配列に保存すれば、MT4に勝てる。おそらくそのようにするべきだ。

少なくとも、あなたのコードには常にそのような機能がありました。

SZY: ターミナルを殺すために文字列のサイズをテストしましたが、MT5は殺すことができません。一般的には、テストが必要です。


SZYZY:取引履歴データを含む構造体の配列が、どれだけのメモリを占有できるか確認したことはないのか? 構造体の重さを200バイト、取引履歴を100Kレコードとすると、20MBになる。洗練されたタスクでターミナルを停止させなければ、まったく問題ないだろう。一般的には、すべて同じようにテストしてください。

 
Igor Makanu:

ZYZY:確認したことはありませんが、取引履歴データを含む構造体の配列は、どれくらいのメモリを占有するのでしょうか?

        sizeof(MT4_ORDER) = 280
 

夏の日々から体調が戻らないんだ...。

fxsaber:

MT4:

MT4x32はMT5x64の4倍以上速く、クローズポジション 数は同じ。

このテストを仮想環境で 確認できますか?( Virtual.mqhライブラリ )

 
Igor Makanu:

この テストを仮想環境で確認できますか?(仮想.mqhライブラリ)

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006
#include <fxsaber\Virtual\Virtual.mqh>

// すべてのクローズドポジションの合計継続時間を返します。
int SumPositionsLengthMQL4( void )
{
  int Res = 0;
  
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
      Res += (int)(OrderCloseTime() - OrderOpenTime());
      
  return(Res);
}

typedef int (*SumPositionsLength)( void );

void Bench( SumPositionsLength GetSumPositionsLength, const int Amount = 100 )
{
  long Tmp = 0;

  for (int i = 0; !IsStopped() && (i < Amount); i++)
    Tmp += GetSumPositionsLength();
  
  Print(Tmp);
}

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

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

bool CreateHistory( const int Amount = 10000 )
{
  const bool Res = VIRTUAL::GetHandle();
  
  if (Res)
  {
    MqlTick Tick;
    
    _V(0, SymbolInfoTick(_Symbol, Tick));
    VIRTUAL::NewTick(Tick);
        
    for (int i = 0; i < Amount; i++)
    {      
      const TICKET_TYPE Ticket = OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, 0, 0);
      
      Tick.time_msc += 1000;
      VIRTUAL::NewTick(Tick);
      
      OrderClose(Ticket, 1, Tick.bid, 0);            
    }
  }
  
  return(Res);
}

void OnStart()
{    
  PRINT(OrdersHistoryTotal());
  BENCH(Bench(SumPositionsLengthMQL4))
  
  VIRTUAL::SelectByHandle(VIRTUAL::Create());

  if (CreateHistory())  
  {
    PRINT(OrdersHistoryTotal());
    BENCH(Bench(SumPositionsLengthMQL4))
  }    
}


結果

// MT4
// リアル:
VIRTUAL::VirtualOrdersHistoryTotal() = 10291
Time[Bench(SumPositionsLengthMQL4)] = 63774

// バーチャル
VIRTUAL::VirtualOrdersHistoryTotal() = 10001
Time[Bench(SumPositionsLengthMQL4)] = 158218

// MT5
// バーチャル
VIRTUAL::VirtualOrdersHistoryTotal() = 10001
Time[Bench(SumPositionsLengthMQL4)] = 43343

MT4のヒストリーがMT4の仮想環境より3倍速いことがよくわかります。同時にMT5では、同じ仮想環境がMT4の4倍速くなっています。

つまり、MT5の仮想環境はMT4の実環境よりも高速です。