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

 
fxsaber:

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

int CTickSeriesCollection::IndexTickSeries(const string symbol)
  {
   const CTickSeries *obj=new CTickSeries(symbol==NULL || symbol=="" ? ::Symbol() : symbol);
   ...
   ...
   ...
  }

Дополнительно проверяю на "". Сам же всегда при вызове методов для текущего символа использую NULL.

 
Artyom Trishkin:

Ваш код не даст ускорение.

 
fxsaber:
Мне сложно объяснять очевидные вещи. В этом коде возможно ускорить GetMarketWatchTick.
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);
}

Вы считаете, что если даже параметром Symbol передать _Symbol, то в функцию SymbolInfoTick() будет передана строка?

Не думаю, что нет проверок внутри стандартных функций на равенство строки текущему символу, и при таких явных параметрах начинаются проверки "по полной программе" при наличии под рукой кэша для текущего символа.

 

Ускорение происходит на этапе компиляции, а не во время выполнения.

Компилятор делает такую замену:

SymbolInfoTick(_Symbol, Tick) -> SymbolInfoTickInside(Tick);
SymbolInfoTick(NULL, Tick) -> SymbolInfoTickInside(Tick);
SymbolInfoTick(::Symbol(), Tick) -> SymbolInfoTickInside(Tick);

Во всех остальных случаях замена не делается.

 
fxsaber:

Ускорение происходит на этапе компиляции, а не во время выполнения.

Компилятор делает такую замену:

Во всех остальных случаях замена не делается.

Ну. О чём я и говорил - ваш код НЕ ускорит штатную функцию для НЕ текущего символа. Равно, как и НЕ ускорит для текущего.

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

 
Artyom Trishkin:

Ну. О чём я и говорил - ваш код НЕ ускорит штатную функцию для НЕ текущего символа. Равно, как и НЕ ускорит для текущего.

Возможно, Вам кто-то более доходчиво объяснит. У меня не получилось.

 
fxsaber:

Возможно, Вам кто-то более доходчиво объяснит. У меня не получилось.

Что вы колдовством ускоряете штатные функции?

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

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

Так всё-таки, где ускорение штатной функции? Если оно есть, то это более чем интересно и полезно.

 
fxsaber:

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

С CopyTicks аналогично?

 
fxsaber:

Возможно, Вам кто-то более доходчиво объяснит. У меня не получилось.

Скорее всего, у вас не получилось понять мой вопрос. Я его повторял несколько раз (и этот вопрос был НЕ про "ускорение штатной функции").

 
Slava:

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

В этом объяснении по какой-то причине не написано, что если строковый параметр равен текущему символу, то проверки по полной не делаются.