глюк ChartSymbol в советнике

 

Натолкнулся на глюк ChartSymbol при вызове из советника. Время от времени ChartSymbol возвращает пустую строку вместо символа графика.

Максимально упрощенный пример кода привожу.

void init() {
   long curr = ChartFirst();     
   while(curr != -1) {
      string sym = ChartSymbol(curr);
      Print(curr," ",sym);
      curr = ChartNext(curr);
   }
}

Обращаю внимание, что это советник. В варианте скрипта проблем не обнаружил.

Прикрепляем советник на график и получаем в журнале


Из первого графика символ выводится, из остальных нет.

Прикрепляем советник на другой график - в этом случае все нормально

В целом, полный бардак. Иногда работает нормально, иногда как на первом скрине.

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

ПС: ChartSymbol не обязательно ставить в init, в start будет то же самое.

 
Обновляйте терминал, 1052 доступен давно уже.
 
Воспроизводимые глюки целесообразнее сразу в сервис-деск постить. Сразу и исправят.
 
старый баг версии 1045. 
 
Stanislav Dray:
старый баг версии 1045. 
Да, старый баг в новой билде имеет место. У меня вот такая борода в индикаторе, может пол-дня работать, а потом вот такой косяк вылазит.
 

В обновленных билдах баг вроде изчез, а теперь опять появился.

Код советника

void init() {
   long curr = ChartFirst(); 
   while(curr != -1) {
      if (curr != ChartID()) {      
         Print(curr," - " ,ChartSymbol(curr));
      }
      curr = ChartNext(curr);
   }
}

Результат

Баг тот же: ChartSymbol иногда возвращает пустую строку вместо символа графика.

 
loopsider:

В обновленных билдах баг вроде изчез, а теперь опять появился.

Код советника

Результат

Баг тот же: ChartSymbol иногда возвращает пустую строку вместо символа графика.

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

Попробуйте вывести в журнал ошибку с помощью функции GetLastError()

Установлены какие-либо эксперты/индикаторы на других чартах?

К слову, результат на вашем скриншоте не соответствует приложенному коду - информация по текущему чарту вообще не должна была выводиться.

 
Evgeny Chernyshev:

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

Попробуйте вывести в журнал ошибку с помощью функции GetLastError()

Установлены какие-либо эксперты/индикаторы на других чартах?

К слову, результат на вашем скриншоте не соответствует приложенному коду - информация по текущему чарту вообще не должна была выводиться.

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

 Проверил - результат на скриншоте получен именно этим кодом. Но вы правы - текущий чарт должен пропускаться. Странно.

 Эксперты и индикаторы были. 

 Когда в следующий раз встречусь, попробую исследовать более тщательно.

 
Evgeny Chernyshev:

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

Попробуйте вывести в журнал ошибку с помощью функции GetLastError()

Установлены какие-либо эксперты/индикаторы на других чартах?

К слову, результат на вашем скриншоте не соответствует приложенному коду - информация по текущему чарту вообще не должна была выводиться.

Еще раз поймал проблему. 

Код

void init() {
   long curr = ChartFirst(); 
   while(curr != -1) {
      if (curr != ChartID()) {      
         Print(curr," - " ,ChartSymbol(curr),"  ChartID = ",ChartID());
      }
      curr = ChartNext(curr);
   }
   Print("Last error: ",GetLastError());
}


void start() {
}

Результат

Билд 1090.

 

Нашел способ сделать проблему воспроизводимой. Для этого достаточно в тестере запустить любой советник, например emptyEA.mq4:

void init() {
   Print("Hi");
}

Итак, последовательность действий:

1. Перезапускаем терминал

2. Прикрепляем к графику советник:

void init() {
   long curr = ChartFirst(); 
   while(curr != -1) {
      if (curr != ChartID()) {      
         Print(curr," - " ,ChartSymbol(curr),"  ChartID = ",ChartID());
      }
      curr = ChartNext(curr);
   }
   Print("Last error: ",GetLastError());
}


void start() {
}

Проверяем вывод в журнал - все норм.

3. Запускаем в тестере emptyEA

4. Прикрепляем еще раз к графику советник из пункта 2. Проверяем вывод в журнал - проблема на месте.

 
loopsider:

Нашел способ сделать проблему воспроизводимой. Для этого достаточно в тестере запустить любой советник, например emptyEA.mq4:

Итак, последовательность действий:

1. Перезапускаем терминал

2. Прикрепляем к графику советник:

Проверяем вывод в журнал - все норм.

3. Запускаем в тестере emptyEA

4. Прикрепляем еще раз к графику советник из пункта 2. Проверяем вывод в журнал - проблема на месте.

А если написать так как должен быть написан советник? Я полагаю никто из модераторов и разработчиков не станет проверять работу кода написанного с нарушением рекомендаций документации по языку.

int OnInit(void)
{
   long curr = ChartFirst(); 
   while(curr != -1) {
      if (curr != ChartID()) {      
         Print(curr," - " ,ChartSymbol(curr),"  ChartID = ",ChartID());
      }
      curr = ChartNext(curr);
   }
   Print("Last error: ",GetLastError());
   return(INIT_SUCCEEDED);
}


void OnTick(void)
  {
   
  }