Просьба помочь найти баг

 

Здравствуйте,

Приложен простой код-пример расчитывающий значения массива b[ ] на уже сформировавшихся барах на базе бинарного массива a[ ].

Массив b[ ] подсчитывает количество нулей между ближайшими единицами для массива a[ ] - проверка заключается в том что нули массива a[ ] должны сохранятся на тех же местах и в массиве b[ ] при правильном расчете программой.

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

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

Точнее в начале образования бара почему-то возникает ошибка, хотя при начальном запуске расчет происходит верно.

Причину затрудняюсь найти.

Подозреваю что есть какой-то баг либо в этом коде либо в MT4.

Буду благодарен за разъяснение.

Файлы:
avalue_qs.mq4  2 kb
 

код у вас не большой... вставьте его, пожалуйста, в текст через вот эту кнопку...

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

 

у вас проблемы с индексированием. Смотрите:

for(n = 1; n < 59; n++)
         if (Close[n] - Close[n+1] > 0) a[n+1] = 1;
         else                           a[n+1] = 0;

присвоение начинается с индекса n+1=2. Дальше

      for(i=0,j=-1,k=0; i<59; i++,k++){
         if(a[i] == 1){
 

проверка условий осуществляется с индекса i=0

Еще дальше

      for(n = 1; n < 59; n++)
         if (a[n] == 0 && b[n] != 0)
            Alert ("Calculation Error!: a[n] != b[n], n=",n,", Time= ", TimeToStr(TimeCurrent(),TIME_SECONDS));   

алерты начинаем проверять с индекса n=1


Сильвупле, исправляйте

 
alsu >>:

у вас проблемы с индексированием. Смотрите:

присвоение начинается с индекса n+1=2. Дальше

проверка условий осуществляется с индекса i=0

Еще дальше

алерты начинаем проверять с индекса n=1


Сильвупле, исправляйте

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

Непросчитанные индексы по умолчанию нули и поэтому ошибку они не вносят.

Самое главное что есть различие в вычислении в первый раз и после формирования нового бара - в этом весь вопрос.

Скобки не поставил там где они не обязательны по синтаксису.

Файлы:
 
Andrei01 >>:

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

Непросчитанные индексы по умолчанию нули и поэтому ошибку они не вносят.

Самое главное что есть различие в вычислении в первый раз и после формирования нового бара - в этом весь вопрос.

Скобки не поставил там где они не обязательны по синтаксису.

возможно, проблема в переменной LastBar. Давайте попробуем сделать ее static, проинициализировать в init()

LastBar=0;

ну и - хотя бы для порядка - сделаем ее типа datetime

 
я бы еще для верности воспользовался функцией FileFlush()
 

кстати, не могли бы вы сфотографировать и привести вывод ошибки функцией

Alert ("Calculation Error!: a[n] != b[n], n=",n,", Time= ", TimeToStr(TimeCurrent(),TIME_SECONDS));   

чтобы разговор более предметно шел?

 

LastBar не может быть static на глобальном уровне - сомпилятор выдает ошибку.

Приведен пример вывода фунцией Alarm() и соответствующий текстовый файл в котором видно что нули в массиве b[ ] подпорчены как и указывает проверка в Alarm().

Переменная LastBar вроде бы работает правильно - это видно по расчёту точек графического буфера на сформировавшимся баре.

В функции FileFlush() нет необходимости - она выполняется автоматически при закрытии функцией FileClose().

Предполагаю что есть баг в самом МТ4 из-за некорректного обновления данных в момент формирования нового бара, например из-за того что функция start() начинает выполнятся до того как будут обновлены все входные данные.


 
Andrei01 писал(а) >>

Предполагаю что есть баг в самом МТ4 из-за некорректного обновления данных в момент формирования нового бара, например из-за того что функция start() начинает выполнятся до того как будут обновлены все входные данные.

Достаточно сделать обработку ошибки

4066 Запрошенные исторические данные в состоянии обновления

и корректно ее обработать.
 
Vinin >>:

Достаточно сделать обработку ошибки

4066 Запрошенные исторические данные в состоянии обновления
и корректно ее обработать.

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

В чем тут может быть ошибка на запрос исторических данных?

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

Прошу также заметить что все массивы высчитываются заново при каждом входе.

 
Andrei01 писал(а) >>

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

В чем тут может быть ошибка на запрос исторических данных?

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

Прошу также заметить что все массивы высчитываются заново при каждом входе.

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