При большом количестве MT5-сделок/ордеров в ByPass-режиме (использую, например, в CustomReport) первое обращение к истории может занимать много времени.
#define MT4ORDERS_BYPASS_MAXTIME 1000000// Максимальное время (в мкс.) на ожидание синхронизации торгового окружения #include <MT4Orders.mqh>
#define PRINT(A) Print(#A + " = " + (string)(A))
voidOnStart()
{
for (int i = 0; i < 3; i++)
{
constulong StartTime = GetMicrosecondCount();
PRINT(OrdersHistoryTotal());
PRINT(GetMicrosecondCount() - StartTime);
}
PRINT(HistoryDealsTotal());
PRINT(HistoryOrdersTotal());
}
Наглядный пример, что частая работа с массивами должна быть с умом. В данном случае static позволяет не выделять в ArrayCopy каждый раз память под массив. И получаем кратный рост производительности в реальной задачи, который ощущается невооруженным взглядом.
На просторах интернета можно видеть довольно частые сценарии торговли. Управляющий ПАММ-счетом набрал инвесторов. Хорошо торговал, но с какого-то момента прибыльность сильно уменьшилась, вплоть до
При большом количестве MT5-сделок/ордеров в ByPass-режиме (использую, например, в CustomReport) первое обращение к истории может занимать много времени.
Обновленный ByPass.mqh позволил ускорить эту процедуру в 15 раз на тестах.
Hello author, while using the OrderSendAsync function, I noticed that MT4ORDERS::LastTradeResult.retcode equals TRADE_RETCODE_DONE . However, in your code, it checks whether MT4ORDERS::LastTradeResult.retcode == TRADE_RETCODE_PLACED . Could this be a mistake, or is it my misunderstanding?
hini #: I forgot to mention that I am using the MT5 tester. It should have nothing to do with the server, right?
In live trading, MT4ORDERS::LastTradeResult.retcode == TRADE_RETCODE_PLACED is indeed correct, while in the MT5 tester it is TRADE_RETCODE_DONE . This was my mistake.
Проверка.
Результат.
1.62 mcs/unit.При большом количестве MT5-сделок/ордеров в ByPass-режиме (использую, например, в CustomReport) первое обращение к истории может занимать много времени.
14 секунд!
Оказалось, что тормоза исходят от ArrayCopy-функции.
Такая правка в Include\fxsaber\TradesID\ByPass.mqh
увеличивает производительность в 4.5 раза - ~3 секунды.
Наглядный пример, что частая работа с массивами должна быть с умом. В данном случае static позволяет не выделять в ArrayCopy каждый раз память под массив. И получаем кратный рост производительности в реальной задачи, который ощущается невооруженным взглядом.
При большом количестве MT5-сделок/ордеров в ByPass-режиме (использую, например, в CustomReport) первое обращение к истории может занимать много времени.
Hello author, while using the OrderSendAsync function, I noticed that MT4ORDERS::LastTradeResult.retcode equals TRADE_RETCODE_DONE . However, in your code, it checks whether MT4ORDERS::LastTradeResult.retcode == TRADE_RETCODE_PLACED . Could this be a mistake, or is it my misunderstanding?
while using the OrderSendAsync function, I noticed that MT4ORDERS::LastTradeResult.retcode equals TRADE_RETCODE_DONE
Server name?
I forgot to mention that I am using the MT5 tester. It should have nothing to do with the server, right?
I forgot to mention that I am using the MT5 tester. It should have nothing to do with the server, right?
В Тестере для первого удачного выполнения MT5-OrderSend/OrderSendAsync всегда MqlTradeResult.request_id == 0.
Считаю это поведение недоработкой со стороны MQ, т.к. request_id должен начинаться с единицы.
Это одна из причин, почему в MT4Orders реализация OrderSendAsync для Тестера не сделана. Есть и другая менее веская причина (из книги).