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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
loopsider
38
loopsider  

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

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

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

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

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


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

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

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

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

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

Vitalie Postolache
7145
Vitalie Postolache  
Обновляйте терминал, 1052 доступен давно уже.
Andrey Khatimlianskii
57680
Andrey Khatimlianskii  
Воспроизводимые глюки целесообразнее сразу в сервис-деск постить. Сразу и исправят.
Stanislav Dray
5454
Stanislav Dray  
старый баг версии 1045. 
Vitaly Muzichenko
14106
Vitaly Muzichenko  
Stanislav Dray:
старый баг версии 1045. 
Да, старый баг в новой билде имеет место. У меня вот такая борода в индикаторе, может пол-дня работать, а потом вот такой косяк вылазит.
loopsider
38
loopsider  

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

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

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

Результат

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

Evgeny Chernyshev
153
Evgeny Chernyshev  
loopsider:

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

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

Результат

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

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

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

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

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

loopsider
38
loopsider  
Evgeny Chernyshev:

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

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

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

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

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

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

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

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

loopsider
38
loopsider  
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.

loopsider
38
loopsider  

Нашел способ сделать проблему воспроизводимой. Для этого достаточно в тестере запустить любой советник, например 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. Проверяем вывод в журнал - проблема на месте.

Alexey Viktorov
27940
Alexey Viktorov  
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)
  {
   
  }
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий