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

 
fxsaber:

Быстрее.

Она делает то же самое - возвращает значение функции. Но предварительно ещё и проверки делает.
Внутри самой функции ведь тоже есть проверки на переданное значение имени символа, а от него - либо "если указан обычный строковый параметр вместо Symbol(), _Symbol или NULL, то производятся проверки по полной программе и ещё запрос свойств", либо используются значения текущего символа из кэша без дополнительных проверок.
Зачем вы их ещё раз делаете, и при этом утверждаете, что это ускоряет получение данных? Не понимаю логику таких рассуждений.

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

 
Artyom Trishkin:

Зачем вы их ещё раз делаете, и при этом утверждаете, что это ускоряет получение данных?

Вы же сами процитировали объяснение.

 
Slava:

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

В MT4 аналогично? И в MT5-Тестере как с этим?

 
Artyom Trishkin:

К слову, я всегда так делаю в своих функциях

Покажите, пожалуйста.

 
fxsaber:

Вы же сами процитировали объяснение.

Именно - это всё делается внутри штатной функции. Зачем дублировать ещё и снаружи?

 
Artyom Trishkin:

Именно - это всё делается внутри штатной функции. Зачем дублировать ещё и снаружи?

Значит, Вы не поняли объяснения. Разная скорость у этих двух вызовов.

void OnTick()
{
  static const string Symb = _Symbol;
  MqlTick Tick;
  
  SymbolInfoTick(_Symbol, Tick);
  SymbolInfoTick(Symb, Tick);  
}
 
fxsaber:

Покажите, пожалуйста.

Все функции и методы, где так делается у меня?

Их слишком много.

 
Artyom Trishkin:

Все функции и методы, где так делается у меня?

Одного достаточно.

 
fxsaber:

Значит, Вы не поняли объяснения. Разная скорость у этих двух вызовов.

Я всё вроде бы понял. Естественно, она разная. Чем же вы её ускорили? Вы передаёте в функцию значение не текущего символа в одном из случаев - если не_Symbol.

Вот в случае передачи в функцию вышеперечисленного значения, функция не проводит проверок, а берёт значение текущего символа из кэша.

В остальных случаях она запрашивает данные указанного символа с проверкой "по полной программе" + его наличие в обзоре рынка. Ваша "быстрая" функция не избавляет от этих проверок при запросе данных от неродного символа. Так и где ускорение?

bool SymbolInfoTickFast( const string &Symb, MqlTick &Tick )
{
  return((Symb == _Symbol) ? SymbolInfoTick(_Symbol, Tick)
                           : SymbolInfoTick(Symb, Tick));
}

Всего два варианта в вашей функции при её вызове if(SymbolInfoTickFast(Symbol(), tick_array)) {}

  1. получение данных текущего символа - вызываете SymbolInfoTick с параметром _Symbol (быстро)
  2. получение данных другого символа - вызываете SymbolInfoTick со строковым параметром символа (медленно)

Другой разговор, если вы (по своей привычке дефайнить всё, что двигается) создаёте строковую переменную для текущего символа, то да - вы тут вынуждены делать проверки и заменять свою макроподстановку на предопределённую переменную, либо на вызов Symbol()

 
Artyom Trishkin:

Чем же вы её ускорили?

Мне сложно объяснять очевидные вещи.
const MqlTick GetMarketWatchTick( const string &Symb )
{
  MqlTick Tick = {0};

  SymbolInfoTick(Symb, Tick);

  return(Tick);
}

void OnTick()
{
  MqlTick Ticks[1];
  
  Ticks[0] = GetMarketWatchTick(_Symbol);
  ArrayPrint(Ticks);
}
В этом коде возможно ускорить GetMarketWatchTick.
Причина обращения: