MT5 и скорость в боевом исполнении - страница 23

 
Renat Fatkhullin:

Если кто не понял, это библиотека fxsaber при применении в чужом коде дает тормоза.

Вместо того, чтобы явно это указать, он начал разыгрывать игру про тормоза платформы и подсовывать самоубийственные примеры. И когда была возможность выйти на реальную причину и сгладить вопрос, он не воспользовался ею.

Ради локальной оптимизации он отравлял кеш истории для основного приложения.

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

MT5 и скорость в боевом исполнении

fxsaber, 2020.09.02 00:02

Был воспроизводимый у многих чистый MQL5-код. Хронологию ветки изучите сначала, а не в конспирологию играйте, что вы кому-то столь нужны, что готов тратить на вас время для полива грязью.

С ролью индюка отлично справляетесь. Здесь специально в ветке ни о каких библиотеках не шла речь, т.к. это не конструктивно.

Речь о том, что если кто-то вздумает использовать совместно библиотеки, в которых from-входной параметр не совпадает, то получит тормоза. Об этом нигде в Документации ни слова. Хоть что-то на эту тему вынималось из вас клещами. А когда вынули, пошли обвинения в читинге. 


Данная особенность MQL должна быть выжжена в Документации и ветке об особенностях. Запустите чистые MQL5-скрипты из этой ветки на билдах, соответствующих датам их написания. Видимо, на всякий случай столько исправлений делали вслепую.

 
fxsaber:

С ролью индюка отлично справляетесь. Здесь специально в ветке ни о каких библиотеках не шла речь, т.к. это не конструктивно.

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


Речь о том, что если кто-то вздумает использовать совместно библиотеки, в которых from-входной параметр не совпадает, то получит тормоза. Об этом нигде в Документации ни слова. Хоть что-то на эту тему вынималось из вас клещами. А когда вынули, пошли обвинения в читинге. 


Данная особенность MQL должна быть выжжена в Документации и ветке об особенностях. Запустите чистые MQL5-скрипты из этой ветки на билдах, соответствующих датам их написания. Видимо, на всякий случай столько исправлений делали вслепую.

В документации HistorySelect явно указано:

Функция HistorySelect() создает в mql5-программе список ордеров и список сделок для дальнейшего обращения к элементам списка посредством соответствующих функций. Размер списка сделок можно узнать с помощью функции HistoryDealsTotal(), размер списка ордеров в истории можно получить с HistoryOrdersTotal(). Перебор элементов списка ордеров лучше всего проводить функцией HistoryOrderGetTicket(), для элементов списка сделок соответственно подходит функция HistoryDealGetTicket().

После применения функции HistoryOrderSelect() список ордеров в истории, доступных mql5-программе, сбрасывается и заполняется заново найденным ордером, если поиск ордера по тикету завершился успешно. То же самое относится к списку сделок, доступных mql5-программе – он сбрасывается функцией HistoryDealSelect() и заполняется заново в случае успешного получения сделки по номеру тикета.


Когда вы работаете с громадными объемами (а тысячи и десятки тысяч сделок в истории вы неспроста показывали), требующими атомарного/снепшот доступа, нужно понимать их стоимость.

Тем более, что я детальнейшим образом в этой теме объяснил технические детали работы этих кешей.


Вы зря чтоли пытались рандомизировать каждую выборку и максимально отравить кеш? Ради своей позиции любой самострел в тему?

 
Renat Fatkhullin:

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

99% багов находятся так. Сначала в большом коде находится странное поведение. Затем локализацией находится причина. Меня больше волновали эти тормоза.

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

MT5 и скорость в боевом исполнении

fxsaber, 2020.08.13 17:08

Супер, Спасибо! Наконец, полное подтверждение печальных лагов MT5. И это без каких-либо торговых функций. Проблемы чуть ли не везде.

KD      0       16:00:33.382    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 34: HistoryOrderSelect(0)] = 25 ms.
PE      0       16:00:44.913    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 17: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 24 ms.
DP      0       16:00:44.888    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 46 ms.
FI      0       16:00:49.579    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 28: HistoryDealSelect(0)] = 22 ms.
EE      0       16:01:03.287    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 33: HistoryOrderGetDouble(0,ORDER_PRICE_CURRENT)] = 1 ms.
KE      0       16:01:07.013    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 50: OrderGetDouble(ORDER_PRICE_CURRENT)] = 1 ms.
JM      0       16:01:12.189    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 44: TimeCurrent()] = 39 ms.
MD      0       16:01:13.067    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 81: ResourceFree(NULL)] = 1 ms.
RS      0       16:01:13.572    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 41: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 7 ms.
GL      0       16:01:27.816    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 79: GlobalVariableGet(NULL)] = 22 ms.
PD      0       16:01:33.892    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 58: PositionGetInteger(POSITION_MAGIC)] = 1 ms.
KP      0       16:01:39.864    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 67: OrderCheck(Request,CheckResult)] = 3 ms.
ML      0       16:01:39.970    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 62: AccountInfoInteger(ACCOUNT_MARGIN_MODE)] = 1 ms.
KM      0       16:01:41.045    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 55: PositionSelect(Symb)] = 2 ms.
NS      0       16:01:46.832    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 78: GlobalVariableCheck(NULL)] = 1 ms.
JP      0       16:01:49.211    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 75: SymbolName(0,true)] = 1 ms.
EL      0       16:01:59.101    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 32 ms.
IM      0       16:02:07.462    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 70: AccountInfoInteger(ACCOUNT_TRADE_EXPERT)] = 7 ms.
PJ      0       16:02:11.735    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 37: IsStopped()] = 4 ms.
OG      0       16:03:08.178    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 32: HistoryOrderGetInteger(0,ORDER_MAGIC)] = 14 ms.
JH      0       16:03:16.385    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 5 ms.
FM      0       16:03:16.601    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 59: PositionGetString(POSITION_SYMBOL)] = 1 ms.
GH      0       16:03:21.841    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 72: TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)] = 1 ms.
FJ      0       16:03:25.782    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 46: TimeTradeServer()] = 1 ms.
EO      0       16:03:26.772    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 45: TimeLocal()] = 10 ms.
HD      0       16:03:36.595    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 13: SymbolInfoTick(Symb,Tick)] = 13 ms.
...
Человек решил помочь и запустил чистый MQL5-код на своей машине. Маленькая выборка выше. Почитайте названия функций выше.


В документации HistorySelect явно указано:

Функция HistorySelect() создает в mql5-программе список ордеров и список сделок для дальнейшего обращения к элементам списка посредством соответствующих функций. Размер списка сделок можно узнать с помощью функции HistoryDealsTotal(), размер списка ордеров в истории можно получить с HistoryOrdersTotal(). Перебор элементов списка ордеров лучше всего проводить функцией HistoryOrderGetTicket(), для элементов списка сделок соответственно подходит функция HistoryDealGetTicket().

После применения функции HistoryOrderSelect() список ордеров в истории, доступных mql5-программе, сбрасывается и заполняется заново найденным ордером, если поиск ордера по тикету завершился успешно. То же самое относится к списку сделок, доступных mql5-программе – он сбрасывается функцией HistoryDealSelect() и заполняется заново в случае успешного получения сделки по номеру тикета.

Интересно, кто в этом тексте увидел что-то между строк? Лично я понял (до этой ветки), что HistoryDealSelect и HistoryOrderSelect обязательно нужно писать вот так.

  static bool HistorySelectOrder( const ulong Ticket )
  {
    return((::HistoryOrderGetInteger(Ticket, ORDER_TICKET) == Ticket) || ::HistoryOrderSelect(Ticket));
  }

  static bool HistorySelectDeal( const ulong &Ticket )
  {
    return((::HistoryDealGetInteger(Ticket, DEAL_TICKET) == Ticket) || ::HistoryDealSelect(Ticket));
  }

Иначе гарантировано нарветесь на тормоза.

Когда вы работаете с громадными объемами, требующими атомарного/снепшот доступа, нужно понимать их стоимость.

Тем более, что я детальнейшим образом в этой теме объяснил технические детали работы этих кешей.

Вынимал клещами нужную инфу в этой ветке.

 
Renat Fatkhullin:

Вы зря чтоли пытались рандомизировать каждую выборку и максимально отравить кеш? Ради своей позиции любой самострел в тему?

В этой ветке хронологически все можно видеть. Изначально была показана проблема без какого-либо рэндома.

Эта ветка является отличным свидетельством того, как можете перевирать слова оппонента. Все исходники и результаты их выполнения сохранены здесь.

 

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

 
Aleksey Vyazmikin:

Почему терминал не может просто увеличивать кэш при повторном запросе полной истории, получать и кэшировать недостающий диапазон?

Это уже сделали.

Но если между вызовами HistorySelect( 0, INT_MAX ) сделать вызов HistorySelect( other_time, ... ), кэш будет перестроен, начиная с other_time, и следующий запрос HistorySelect( 0, ... ) приведет к новому построению кэша (будет медленнее).

 
Andrey Khatimlianskii:

Это уже сделали.

Но если между вызовами HistorySelect( 0, INT_MAX ) сделать вызов HistorySelect( other_time, ... ), кэш будет перестроен, начиная с other_time, и следующий запрос HistorySelect( 0, ... ) приведет к новому построению кэша (будет медленнее).

Если сделали, то хорошо, вопрос лишь тогда в удобстве работы с полученными данными, при условии наращивания кэша.

Я в торговых операциях так глубоко не разбирался, но если меняется диапазон запроса, то значит нет возможности быстрого поиска данных внутри истории без полного перебора?

 
Aleksey Vyazmikin:

Я в торговых операциях так глубоко не разбирался, но если меняется диапазон запроса, то значит нет возможности быстрого поиска данных внутри истории без полного перебора?

Зачем эти знания, если их не использовать?

Нет практической задачи = нет вопроса.

 
Renat Fatkhullin:

OrderExist и PositionExist - это специальные оптимизированные функции, которые позволяют избежать тупых переборов в цикле всех ордеров или позиций в поисках записей по символу, типу операции и меджику.

Результатом получаете массив с тикетами.


Программы могут серьезно сэкономить, используя эти функции. Особенно, когда массово, постоянно и многократно обращаются к открытым позициям и ордерам в переборных циклах.

В будущем мы реализуем более эффективные функции доступа к массивным данным торговых операций.

Язык тоже кардинально усилится и упростится с более мощным функционалом.

" OrderExist и PositionExist " - в документации не нашел, где про них почитать?
 
HimOrik:
" OrderExist и PositionExist " - в документации не нашел, где про них почитать?

Скорее всего - после выхода очередной релизной версии (сейчас беты)