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

 
Может просто прогнать пару тестов, и вопросы отпадут?
 
traveller00:
Может просто прогнать пару тестов, и вопросы отпадут?

Может. Жаль, что я очень сильно ограничен по времени и сам не имею возможности провести тесты :(

 
traveller00:
Может просто прогнать пару тестов, и вопросы отпадут?

Тесты показывают разницу только при запуске в первый раз.

 
Slava:

Записи Symbol(), _Symbol - эквивалентны NULL (там, где допускется NULL вместо имени символа)

В данном случае не производится лишняя проверка на существование текущего символа, на присутствие текущего символа в Обзоре рынка и лишний вызов свойств текущего символа, так как свойства текущего символа кешируются

То есть, если указан обычный строковый параметр вместо Symbol(), _Symbol или NULL, то производятся проверки по полной программе и ещё запрос свойств

Ворос:

   string symbol=_Symbol;
   SymbolInfoInteger(symbol,...)
   SymbolInfoInteger(NULL,...)

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

symbol==_Symbol

?

 
traveller00:

К слову сказать, из свежих сегодняших логов с последней релизной версии МТ5:

Это висели 3 советника на 1 символе, каждый на своём чарте. При том, что запрос идёт на каждом тике. Такие выбросы бывают, конечно, нечасто, но по сути 1 запрос новых тиков, пришедших с прошлого тика, выполнялся 700 мс.

Мониторю около 12 часов, но уже заметны лаги, переходящие все границы.

Time[Main.mqh 162 in ProcessTicks: CopyTicksRange(_Symbol,OldTicks,COPY_TICKS_INFO,LastTickParsed.time_msc)] = 8589203 mcs.

3 советника, каждый на своём чарте, все на 1 символе, запрашивают на новом пришедшем тике старые тики с прошлого тика через CopyTicksRange. И лаг составляет почти 9 секунд. И, похоже, это не предел. Скорее всего хранилище тиков является общем ресурсом, к которому синхронизируется доступ, но даже при очень ужасной синхронизации не должны быть такие времена.

Кто-то скажет, что это разовый глюк. За эти 12 часов мониторинга к сожалению выходов за 1 секунду было больше сотни. И это уже не похоже на разовые всплески. Похоже, что в это время приходило часто подряд несколько тиков, что и вызывает такие всплески.

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

ProcessTicks: CopyTicksRange(_Symbol,OldTicks,COPY_TICKS_INFO,LastTickParsed.time_msc)] = 1401285 mcs.

Тут на символе был только 1 советник. И всё равно полторы секунды. Он был уже не один, на других символах были и другие, но вроде же многопоточность? Или тики для разных символов всё равно могут тормозить друг друга?

Это базовый функционал для базовых советников. Платформа же позиционируется как алготрейдерская. При этом базовый функционал вызывает сильные вопросы. Большая просьба посмотреть ещё раз на это.  Практически уверен, что где-то можно улучшить. Либо был бы очень благодарен за возможность получить последние тики с момента вызова функции, как предлагается тут 

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

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

fxsaber, 2021.03.01 07:28

Просьба подумать о такой функции.

int SymbolInfoTicks( const string Symb, MqlTick &Ticks[] ); // Возвращает свежие тики (не более сотни), пришедшие с предыдущего вызова этой функции.


Проблема получения СВЕЖИХ тиков без пропусков сейчас решается только через CopyTicks*. Это очень громоздкий механизм для данной распространенной задачи. Как из пушки по воробьям.

Отсюда тормоза, удержание огромных кешей и т.д.

 

Минимизировал количество вызовов SymbolInfoTick и CopyTicksRange:

  • снепшот SymbolInfoTick - не вызывается чаще, чем раз в 100 мкс.
  • CopyTicksRange для свежих тиков вызывается только в случае, если, действительно, пришел новый тик в Обзор рынка.


Терминал и машина (файл подкачки отключен) с такой нагрузкой.


По итогу удалось значительно сократить количество сообщений о лагах (меньше же вызовов стало) штатных функций.


Лог за 50 минут:

2021.03.05 19:31:45.429 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 154 mcs.
2021.03.05 19:32:58.939 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 161 mcs.
2021.03.05 19:33:01.583 ::SymbolInfoTick(_Symbol,Tick)] = 158 mcs.
2021.03.05 19:36:01.682 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 143 mcs.
2021.03.05 19:36:31.229 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 234 mcs.
2021.03.05 19:36:31.229 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 913 mcs.
2021.03.05 19:39:08.716 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 139 mcs.
2021.03.05 19:39:30.994 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 315 mcs.
2021.03.05 19:39:32.858 ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 114 mcs.
2021.03.05 19:40:41.437 ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 101 mcs.
2021.03.05 19:42:26.104 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 116 mcs.
2021.03.05 19:42:28.849 ::SymbolInfoTick(_Symbol,Tick)] = 109 mcs.
2021.03.05 19:43:10.977 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 481 mcs.
2021.03.05 19:43:53.945 ::SymbolInfoTick(_Symbol,Tick)] = 130 mcs.
2021.03.05 19:49:20.352 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 101 mcs.
2021.03.05 19:51:31.242 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 102 mcs.
2021.03.05 19:51:44.986 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 107 mcs.
2021.03.05 19:52:05.590 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 219 mcs.
2021.03.05 19:53:56.013 ::SymbolInfoTick(_Symbol,Tick)] = 236 mcs.
2021.03.05 19:55:41.453 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 105 mcs.
2021.03.05 19:55:47.109 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 148 mcs.
2021.03.05 19:55:47.110 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 265 mcs.
2021.03.05 19:59:26.011 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 186 mcs.
2021.03.05 20:00:01.569 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 117 mcs.
2021.03.05 20:01:19.704 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 109 mcs.
2021.03.05 20:02:07.285 ::SymbolInfoTick(_Symbol,Tick)] = 177 mcs.
2021.03.05 20:02:07.286 ::SymbolInfoTick(_Symbol,Tick)] = 198 mcs.
2021.03.05 20:02:07.286 ::SymbolInfoTick(_Symbol,Tick)] = 202 mcs.
2021.03.05 20:04:40.170 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 364 mcs.
2021.03.05 20:04:45.905 ::SymbolInfoTick(_Symbol,Tick)] = 143 mcs.
2021.03.05 20:04:45.906 ::SymbolInfoTick(_Symbol,Tick)] = 158 mcs.
2021.03.05 20:04:45.907 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 504 mcs.
2021.03.05 20:04:48.259 ::SymbolInfoTick(_Symbol,Tick)] = 104 mcs.
2021.03.05 20:04:54.727 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 104 mcs.
2021.03.05 20:05:39.642 ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 101 mcs.
2021.03.05 20:07:40.189 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 101 mcs.
2021.03.05 20:09:21.844 ::SymbolInfoTick(_Symbol,Tick)] = 115 mcs.
2021.03.05 20:09:32.422 ::SymbolInfoTick(_Symbol,Tick)] = 107 mcs.
2021.03.05 20:10:02.423 ::SymbolInfoTick(_Symbol,Tick)] = 128 mcs.
2021.03.05 20:15:48.838 ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 149 mcs.
2021.03.05 20:16:36.001 ::SymbolInfoTick(_Symbol,Tick)] = 105 mcs.
2021.03.05 20:17:51.499 ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 480 mcs.
2021.03.05 20:17:51.638 ::SymbolInfoTick(_Symbol,Tick)] = 342 mcs.
2021.03.05 20:17:52.802 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 429 mcs.
2021.03.05 20:17:53.340 ::SymbolInfoTick(_Symbol,Tick)] = 142 mcs.
2021.03.05 20:19:21.512 ::SymbolInfoTick(_Symbol,Tick)] = 122 mcs.
2021.03.05 20:20:35.836 ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 116 mcs.


Вроде, не сильно страшно. При этом отсутствовали торговые транзакции. Как с ними - посмотрю.


ЗЫ Выделенный кусок показывает, что сразу три советника (разные символы) получили лаг почти одновременно. Т.е. лаг всеобщий для Терминала.

 
Slava:

Записи Symbol(), _Symbol - эквивалентны NULL (там, где допускется NULL вместо имени символа)

В данном случае не производится лишняя проверка на существование текущего символа, на присутствие текущего символа в Обзоре рынка и лишний вызов свойств текущего символа, так как свойства текущего символа кешируются

То есть, если указан обычный строковый параметр вместо Symbol(), _Symbol или NULL, то производятся проверки по полной программе и ещё запрос свойств

Просьба еще раз пояснить, т.к. разные трактовки Ваших слов у форумчан.

 

В Терминале с одним советником/чартом/символом.


2021.03.05 23:02:02.860 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 189 mcs.
2021.03.05 23:02:24.152 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 339 mcs.
2021.03.05 23:02:53.540 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 915 mcs.
2021.03.05 23:05:35.325 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 223 mcs.
2021.03.05 23:05:41.398 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 245 mcs.
2021.03.05 23:05:44.585 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 376 mcs.
2021.03.05 23:06:35.210 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 173 mcs.
2021.03.05 23:07:38.298 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 290 mcs.
2021.03.05 23:08:50.342 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 102 mcs.
2021.03.05 23:14:58.216 ::SymbolInfoTick(_Symbol,Tick)] = 447 mcs.

Такой лог за 15 минут. Похоже, дело все же в тормозной Windows. В данном случае это.

2021.03.05 23:49:20.792 Terminal        MetaTrader 5 x64 build 2815 started for MetaQuotes Software Corp.
2021.03.05 23:49:20.792 Terminal        Windows Server 2019 build 17763, Intel Core i7-7700K  @ 4.20GHz, 17 / 31 Gb memory, 3698 / 3725 Gb disk, IE 11, RDP, UAC, GMT+2
 

Наглядный пример, какие тормоза вызывает Обзор рынка.

Смотреть на значения в столбце Процессор (второй справа).

 
К лагу Сервера добавляется еще лаг Терминала.

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

Индикаторы: Ping

fxsaber, 2021.03.12 10:56

Вспомнил про этот замечательный индикатор.

Это - картинка с машины с нулевым пингом. Получается, что внутренний лаг Терминала в среднем ~2 мс. Скачет в диапазоне 0-9 мс.


Например, на сервер пришло два тика: сначала один, через 10 мс - второй. Так вот в Терминале второй тик можете получить не через 10 мс после первого, а через 10-19 мс. В среднем через 12 мс.

Если торгуете с рынка (маркеты или отложки по текущей цене), то особенно тяжко будет успевать. Сложно сказать, смогут ли Разработчики здесь что-то улучшить.

Посмотрел московскую биржу, там ситуация аналогичная. Фактически, торгуя через MT5 алго, будете почти гарантированно находиться в конце очереди исполнения, не успевая забрать вкусное, к сожалению.

Акцептирование SL/TP-ордеров
Акцептирование SL/TP-ордеров
  • 2020.11.24
  • www.mql5.com
В этой ветке пойдет речь об ордерах, которые создаются в результате срабатывания SL/TP-уровней открытых позиций...