Библиотеки: MT4Orders - страница 51

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: 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+СБ.
// Скрипт вычисляет общую длительность всех закрытых позиций.

#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;  // По PositionID возвращает 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:

Результат.

если не затруднит, то разницу между 4-кой и МТ5 ( терминалы ) покажите время выполнения этого теста

fxsaber:
Позорный проигрыш MT4Orders перед MQL5+СБ.

все относительно....  5 строчек кода и десяток строк для МТ5 - если проверить идею, то предпочтительней 5 сток, если оптимизировать, то однозначно 2-й вариант

 
Igor Makanu:

если не затруднит, то разницу между 4-кой и МТ5 ( терминалы ) покажите время выполнения этого теста

MT4:

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

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

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


MT4x32 быстрее MT5x64 более, чем в четыре раза, при одинаковом количестве закрытых позиций.


ЗЫ Наверное, если забить на экономию памяти в MT4Orders, сохраняя историю во внутренний массив, тогда можно будет уделать и MT4. Возможно, так и надо сделать.

 
fxsaber:

MT4x32 быстрее MT5x64 более, чем в четыре раза, при одинаковом количестве закрытых позиций.

спс, имхо это недоработка МК, но у них свое видение для каких целей должен использоваться производительный МТ5

fxsaber:

ЗЫ Наверное, если забить на экономию памяти в MT4Orders, сохраняя историю во внутренний массив, тогда можно будет уделать и MT4. Возможно, так и надо сделать.

ну Вы точно можете это сделать отключаевой опцией, по крайней мере у Ваших кодов всегжа были такие фичи

ЗЫ: тестировал размеры string чтобы убить терминал, МТ5 не убиваемый - памяти всегда получается у него выделить, думаю, что только в тестере на нескольких ядрах можно суметь получить подлагивания при выделении больших объемов памяти.... в общем тестить нужно


ЗЫЗЫ: никогда не проверял, сколько может занимать памяти массив структур с данными истории торговли ? ну пусть на вскидку структура весит 200 байт, а история торговли 100К записей - получается 20 Мб... имхо вообще не проблема если специально не убивать терминал изощренными задачами... в общем тестить все равно - тогда будет ясно

 
Igor Makanu:

ЗЫЗЫ: никогда не проверял, сколько может занимать памяти массив структур с данными истории торговли ?

        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
VIRTUAL::VirtualOrdersHistoryTotal() = 10001
Time[Bench(SumPositionsLengthMQL4)] = 158218

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

Хорошо видно, что история MT4 быстрее в три раза, чем виртуальное окружение в нем. При этом в MT5 это же виртуальное окружение быстрее в четыре раза, чем в MT4.

Т.е. виртуальное окружение в MT5 работает быстрее, чем реальное окружение в MT4.

 
fxsaber:

Т.е. виртуальное окружение в MT5 работает быстрее, чем реальное окружение в MT4.

... а реальное окружение работы с ордерами в МТ4 работает быстрее реального окружения МТ5


отлично!

я и планировал вести торговлю в виртуальном окружении и копировать копировщиком сделок в реал, сразу разделяешь алгоритм ТС и проблемы исполнения

СПАСИБО!

 
Igor Makanu:

я и планировал вести торговлю в виртуальном окружении и копировать копировщиком сделок в реал, сразу разделяешь алгоритм ТС и проблемы исполнения

Только так и торгую на реале.