Особенности языка mql5, тонкости и приёмы работы - страница 60

fxsaber
14303
fxsaber  
Alexey Kozitsyn:
Не знаю, про какой GUI Вы говорите, но на вкладке параметры окна тестера можно задать поля старт и стоп. И тестер корректно определяет количество значений параметра.

Поле шаг.

Alexey Kozitsyn
9784
Alexey Kozitsyn  
fxsaber:

Поле шаг.

Извиняюсь, не внимательно прочитал.
Alexey Kozitsyn
9784
Alexey Kozitsyn  
fxsaber:

Поле шаг.

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

fxsaber
14303
fxsaber  
Alexey Kozitsyn:

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

Да, это не баг, поэтому и речь завелась в этой ветке. А шаг Оптимизации, если очень нужно, задается через MQL для enum.

fxsaber
14303
fxsaber  

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

Библиотеки: TesterBenchmark

fxsaber, 2017.11.22 16:54

Вставляем в каждый из MT5-вариантов всего одну строку

#define Comment(A)

Полноценный ускорился на 67%, кустарный - 108%!


Но главное не в этом. Одной строкой получилось ускорить советники! И это в Оптимизаторе, где Comment никакой роли не играет.

fxsaber
14303
fxsaber  
// Возвращает true только в случае, если выбран (в тестере) режим по реальным тикам
// Перед использованием должен быть хотя бы один OnTick вызван тестером
bool IsRealTicks( void )
{
  MqlTick Tick;
  
  return(SymbolInfoTick(_Symbol, Tick) && (Tick.volume || !(Tick.flags & TICK_FLAG_LAST)));
}


Пример использования

// Советник будет тестироваться только в режиме по реальным тикам
void OnTick()
{
  static bool IsRemove = true;
  
  if (IsRemove)
  {
    IsRemove = MQLInfoInteger(MQL_TESTER) && !IsRealTicks();
    
    if (IsRemove)
    {
      Print("Real ticks mode is needed!");
      
      ExpertRemove();
      
      return;
    }
  }
  
  //........
}
Как это сделать в OnInit (без OnTick) - не знаю.
fxsaber
14303
fxsaber  

Кусок из диалога по упомянутой теме

fxsaber 2017.11.24 08:35
Не используйте выражения в параметрах принта (или коммента). Указывайте параметры через запятую. Тогда точно все строковые преобразования будут перекрыты

Могли бы Вы на примере пояснить, чем эти две строки отличаются в режиме Оптимизации?

Print((string)i + (string)d);
Print(i, d);
Support Team 2017.11.24 08:44

При оптимизации в первом случае перед принтом будет вычислено строковое выражение. Сам принт вызовется, но не отработает

Во втором случае принт вызовется, но не отработает. И не отработает преобразование в строку i+d

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

Т.е. гораздо дешевле для режимов Оптимизации использовать Print с запятыми, чем формировать для него один входной параметр в виде строки.


С другой стороны, если формировать все в виде одной строки прямо внутри Print, то легко отрубить ее формирование в режиме Оптимизации через

#define Print(A)

но такая конструкция не будет работать, если использовать запятые. Более того, такая конструкция выключит и такое в режиме Оптимизации

Print(SendOrder()); // SendOrder будет проигнорирован при #define Print(A)


Поэтому (и по другим причинам) внутри Print лучше не вызывать, действительно, важные функции. По итогу, если заботиться о производительности в режиме Оптимизации, все равно потребуется делать нечто такое

static const bool IsNotOptim = !MQLInfoInteger(MQL_OPTIMIZATION);

if (IsNotOptim)
{
  const string Str = GetString(); // дорогой вызов
  
  Print(Str);
//  Comment(Str); 
//  Alert(Str);
}
Vladislav Andruschenko
223865
Vladislav Andruschenko  
fxsaber:

Кусок из диалога по упомянутой теме

Т.е. гораздо дешевле для режимов Оптимизации использовать Print с запятыми, чем формировать для него один входной параметр в виде строки.


С другой стороны, если формировать все в виде одной строки прямо внутри Print, то легко отрубить ее формирование в режиме Оптимизации через

но такая конструкция не будет работать, если использовать запятые. Более того, такая конструкция выключит и такое в режиме Оптимизации


Поэтому (и по другим причинам) внутри Print лучше не вызывать, действительно, важные функции. По итогу, если заботиться о производительности в режиме Оптимизации, все равно потребуется делать нечто такое

Извините, может я не понимаю?  А зачем в print вызывать важные функции?
fxsaber
14303
fxsaber  
Vladislav Andruschenko:
Извините, может я не понимаю?  А зачем в print вызывать важные функции?

Это не запрещено.

Vladislav Andruschenko
223865
Vladislav Andruschenko  
fxsaber:

Это не запрещено.

согласен. 

просто хотел узнать какой смысл? 

я сейчас столкнулся с проблемой, когда в истории более 1000 сделок и при вызове функции обработки истории, например посчитать прибыль истории. + добавить прибыль текущих сделок - информация на графике начинает подтормаживать и подвисает сам терминал. Т.е. котировки приходят с задержкой.