Библиотеки: Expert - страница 12

 

Хотелось бы уточнить семантику кода возврата метода Parameters. Сейчас при ошибке получения строки с шаблоном, метод возвращает 0. Это предполагает, что 0 означает ошибку.

Во всех остальных случаях возврат дает строка:

Res = (int)EXPERT::StringBetween(Str, EXPERT_FLAGS, STRING_END);

то есть туда попадает значение expertmode из шаблона, которое может быть равно 0 совершенно легально. При этом в других проектах, в частности в Tester, EXPERT используется так:

void OnTimerReal()
{
  ...
  if ((this.Symb += BeginTick) && EXPERT::Parameters(0, Params, Names))
  {
    ... открытие рабочего чарта
  }
}

В результате, если метод возвращает 0, то Tester не работает. А почему? Если флаг реальной торговли сброшен, это не значит, что тестирование должно быть запрещено, имхо. Тем более, Tester в этом случае молча ничего не делает.

 
Stanislav Korotky:

Хотелось бы уточнить семантику кода возврата метода Parameters. Сейчас при ошибке получения строки с шаблоном, метод возвращает 0. Это предполагает, что 0 означает ошибку.

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

Во всех остальных случаях возврат дает строка:

то есть туда попадает значение expertmode из шаблона, которое может быть равно 0 совершенно легально. При этом в других проектах, в частности в Tester, EXPERT используется так:

В результате, если метод возвращает 0, то Tester не работает. А почему? Если флаг реальной торговли сброшен, это не значит, что тестирование должно быть запрещено, имхо. Тем более, Tester в этом случае молча ничего не делает.

По коду, что Вы привели, действительно, работать не будет при отключенной автоторговле. При этом не помню уже, это ошибка или сделано специально. Скорее всего, специально, чтобы можно было DLL подключать.


ЗЫ Надо будет обновить библу. Там сильный выкрутас для совместного использования с Sequence. Поскольку такая возможность нужна только мне, то не в приоритете обновление.

 

Единственный раз, когда конструкция обнаружения бесконечных циклов сработала.

ME      3       15:22:12.123    Message Endless loop:
KS      3       15:22:12.123    Message Expert.mqh
IP      3       15:22:12.123    Message 169
DG      3       15:22:12.123    Message bool EXPERT::TemplateApply(const long,const string&,const bool)
FQ      3       15:22:12.123    Message Condition: !::IsStopped()&&::ChartGetInteger(Chart_ID,CHART_COLOR_STOP_LEVEL,0,Value)&&(!(bool)((int)Value>>24))


Произошло это в Expert.mqh в этом месте.

      while (_CS(!::IsStopped() && ::ChartGetInteger(Chart_ID, CHART_COLOR_STOP_LEVEL, 0, Value) && (!(bool)((int)Value >> 24))))
        ::Sleep(1); // https://www.mql5.com/ru/forum/170952/page190#comment_18830346


Каждый день активно использую Expert.mqh, но первый раз нарвался. Видимо, существует какая-то очень редкая ситуация. Имейте в виду.

Причина обращения: