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

 
fxsaber #:

Библиотека (MT4Orders.mqh) не потребляет такого количества памяти. Вы можете запустить, например, этот советник, чтобы убедиться в этом.

Скорее всего, вы неправильно работаете с индикаторами: создаете новые хэндлы индикаторов, но не удаляете старые.

Я не использую никаких индикаторов.

Вы правы, библиотека не потребляет такого количества памяти, однако она ее использует:

HistorySelect(0,INT_MAX);

Согласно этой странице:

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

"Попытка обработать всю торговую историю в большинстве случаев является ошибочной. Когда количество обрабатываемых сделок/ордеров становится порядка тысяч и десятков тысяч, работа программы резко замедляется."

В случае, если сделок более 1М, ваша библиотека хранит их в массиве.

Я ценю, что вы сделали эту библиотеку, связующее звено между mt4 и mt5, и вы поделились ею со всеми, не пытаясь ее испортить. Мне просто жаль, что в сети есть только одно место, где описано, как правильно получать значения свопа и комиссии (учитывая, что брокер действительно предоставляет их), и оно написано таким запутанным способом.

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/ru/articles/211

"Попытка обработать всю торговую историю в большинстве случаев оказывается ошибочной. Когда количество обрабатываемых сделок/ордеров становится порядка тысяч и десятков тысяч, работа программы резко замедляется."

В случае, если сделок более 1М, ваша библиотека хранит их в массиве.

#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


130К сделок + 190К ордеров, потребление памяти терминалом увеличилось на 20 МБ (+10%).

Вы можете сами измерить производительность. Документация давно устарела.

 
Использование библиотеки может увеличить потребление памяти до 10%.
 
fxsaber #:
Использование библиотеки может увеличить потребление памяти до 10%.

С чем это связано?

 
Vitaly Muzichenko #:

С чем это связано?

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

Библиотеки: MT4Orders

fxsaber, 2023.07.07 13:12

  • при OrderSelect идет вычисление абсолютно всех данных выбранного ордера из истории (OrderPrint - бесплатный). Это большая комбинация HistoryOrderGet* и HistoryDealGet* функций, с обработкой любой сложности рыночных ситуаций и большого количества подводных камней. Посмотрите MT4ORDERS::GetHistoryPositionData(). Это единая функция для Терминала и для Тестера, но при этом для Тестера специально сделаны ускорения, т.к. многих подводных камней Терминала в Тестере нет. Примеры конфигураций: один, два, три.
 
fxsaber #:
Использование библиотеки может увеличить потребление памяти до 10%.

Думал, вчера было обновление библиотеки, но не доглядел год :)

Буду ожидать, спасибо за поддержку!

 

саб, на сколько выгодно использовать в передачи функции const?

и за одно, есть смысл создавать член класса внутри функции, или вполне обойтись глобальной, 7 символов в торговле робот

обработка на каждом тике, через индикатор шпион.

обработка на каждом тике, в пустую обычно, не ловит аномалии, это вопрос оптимизации своих функции вопросы..
 
// Список изменений:
// 21.07.2023
//   Fix: Исправлена OrderLotsOpen() для удаленных отложенных ордеров.
//   Add: Обрабатывается ситуация, когда торговая MT5-сделка не имеет MT5-ордера.
//   Fix: Корректное определение OrderClosePriceRequest() при отсутствии цены у SL/TP-ордера.
//   Add: Макрос MT4ORDERS_AUTO_VALIDATION позволяет автоматически проходить проверку Маркет-продуктов.
//   Add: Макрос MT4ORDERS_ORDERS_SORT формирует сортированную по времени закрытия/удаления историю MT4-ордеров.
 

fxsaber #:

/   Add: Макрос MT4ORDERS_ORDERS_SORT формирует сортированную по времени закрытия/удаления историю MT4-ордеров.

Скачал обновление и проверил, сейчас с лимит-ордерами всё работает нормально, лагов пока не замечено.

Спасибо!

 
Vitaly Muzichenko #:

лагов пока не замечено.

Сейчас используется лобовой вариант.

Вот код, который может показать время выполнения такого решения после, если между соседними вызовами OrdersHistoryTotal() была обновлена история торгов.

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/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 - HistoryOrdersTotal()

Хорошо видно, что при 100K MT5-ордеров лаг займет 10 мс (время выполнения OrdersHistoryTotal в случае, если после предыдущего запуска была обновлена торговая история).

В Тестере лага нет совсем. Только в Терминале. Очевидно, что можно ускорить, но не до этого.