程序库: MT4Orders - 页 52

 
traveller00:
以防万一,我想说的是,在我的记忆中,ZIP 压缩文件已经修复。但现在又乱套了,那里有一个旧版本,你必须按文件更新。
 
// 更改列表:
// 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;  // 按位置 ID 返回 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 是更好的选择,如果您优化,那么肯定是第二种选择。

 
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 快四倍多。


ZЫ 也许,如果您忘记在 MT4Orders 中保存内存,将历史记录保存到内部数组中,那么您也可以战胜 MT4。也许应该这样做。

 
fxsaber:

平仓 数量相同的情况下,MT4x32 比 MT5x64 快四倍多。

谢谢,我认为这是 MK 的缺陷,但他们对 MT5 的生产用途有自己的看法。

fxsaber:

ZЫ 也许,如果我们忘记 MT4Orders 中的内存保存,将历史保存到内部数组中,那么我们就可以战胜 MT4。也许应该这样做。

您肯定可以通过禁用选项做到这一点,至少您的代码一直都有这样的功能。

SZY:我测试了杀死终端的字符串大小,MT5 是杀不死的 - 它总是能分配内存,我认为只有在多个内核的测试仪中,当分配大量内存时才会出现故障.....。一般来说,你需要测试


SZYZY:从来没有检查过包含交易历史数据的结构数组能占用多少内存? 好吧,让结构重 200 字节,交易历史记录 100K - 结果是 20 Mb...在我看来,如果不是因为复杂的任务导致终端死机,这根本不是问题......一般来说,测试都是一样的 - 这样就清楚了

 
Igor Makanu:

ZYZY:没查过,包含交易历史数据的结构数组能占用多少内存?

        sizeof(MT4_ORDER) = 280
 

夏日过后,我似乎无法恢复体形...

fxsaber:

MT4:

平仓 数量相同的情况下,MT4x32 比 MT5x64 快四倍多。

@fxsaber 能否在虚拟环境中检查一下这个测试?( Virtual.mqh 库 )

 
Igor Makanu:

@fxsaber 你能在虚拟环境中检查一下这个测试吗?( Virtual.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
// Real:
VIRTUAL::VirtualOrdersHistoryTotal() = 10291
Time[Bench(SumPositionsLengthMQL4)] = 63774

// 虚拟
VIRTUAL::VirtualOrdersHistoryTotal() = 10001
Time[Bench(SumPositionsLengthMQL4)] = 158218

// MT5
// 虚拟
VIRTUAL::VirtualOrdersHistoryTotal() = 10001
Time[Bench(SumPositionsLengthMQL4)] = 43343

您可以清楚地看到 MT4 历史记录比 MT4 中的虚拟环境快三倍。同时,在 MT5 中,同样的虚拟环境比 MT4 快四倍。

也就是说,MT5 中的虚拟环境比 MT4 中的真实环境快。