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

 
fxsaber:

@Anton, во многих штатных функциях можно вместо символа указывать NULL. Влияет ли это на скорость выполнения?

Или никакой разницы для Терминала/Тестера?

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

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

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

 
Slava:

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

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

Слава, можете прокомментировать: на акциях цена тика в спецификации символа выставлена '0'. И вот, что говорит поддержка:

"Получили подтверждение от технического отдела. Сообщаем, что параметр "Цена тика" для акций нет возможности заполнить. Значение будет указано по умолчанию - 0.
Спасибо за обращение!"


Это действительно так? Именно в Спефицикации символа цена тика стоит ноль именно для акций?

 
Vladimir Karputov:

Слава, можете прокомментировать: на акциях цена тика в спецификации символа выставлена '0'. И вот, что говорит поддержка:

"Получили подтверждение от технического отдела. Сообщаем, что параметр "Цена тика" для акций нет возможности заполнить. Значение будет указано по умолчанию - 0.
Спасибо за обращение!"


Это действительно так? Именно в Спефицикации символа цена тика стоит ноль именно для акций?

Да. Есть нюансы.

При выставленном нуле надо считать самостоятельно. Спросите вашего брокера про формулу

 
fxsaber:

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

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

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

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

 
Renat Fatkhullin:

Не является.

Вы всегда в любом месте любой программы будете ловить рандомные задержки. Начните следить за всем и ужаснетесь реалиям Windows. Я это уже несколько раз объяснял в деталях.

Мы тоже в свое время удивлялись, когда ловили рандомные выбросы 60-80 мс вместо 0 мс на системных WinAPI функциях.


Сейчас мы массово переводим большую часть своих Windows решений на специально обезжиренные Windows Server 2019 Core версии, а .NET Core веб-проекты на Линукс. Это дает громадную экономию по системным ресурсам и серьезно снижает системные задержки.

Первым этапом обезжиривания MataTrader 5 терминалов начали внедрять таск менеджер, чтобы на лету следить за потреблением ресурсов. Для себя у нас больше информации собирается.

Уже выяснилось, что мы:

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

Вот еще бы не плохо и терминал под линя )))

 
Slava:

Да. Есть нюансы.

При выставленном нуле надо считать самостоятельно. Спросите вашего брокера про формулу

Через SymbolInfoXXXX все корректно. Вопрос был почему утверждают, что для акций именно в Спецификации выставляется '0'. Говорят мол и так понятно - что один тик равен одному центу. Но ведь это не повод лепить в Спецификацию '0'?

 
fxsaber:

Внутри функции еще нужно перейти к соответствующему символу тику. Это время на анализ string-переменной. С NULL такого делать ненужно.

Я тогда еще проверял - никакой существенной разницы по быстродействию не обнаружил. Можете сами перепроверить

 
Slava:

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

Спасибо за информацию! Получается, что лучше делать так:

// Быстрый SymbolInfoTick.
bool SymbolInfoTickFast( const string &Symb, MqlTick &Tick )
{
  return((Symb == _Symbol) ? SymbolInfoTick(_Symbol, Tick)
                           : SymbolInfoTick(Symb, Tick));
}
 
fxsaber:

Спасибо за информацию! Получается, что лучше делать так:

Даже без технических подробностей и представить не мог как можно иначе делать в своих функциях...

Чем эта конструкция должна быть быстрее штатного SymbolInfoTick() ?

 
Artyom Trishkin:

Чем эта конструкция должна быть быстрее штатного SymbolInfoTick() ?

Быстрее.