Странный баг индикатора при смене инструмента

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

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

Начала копать глубже и разбираться. Вот что выяснилось:

На первой отрисовке индикатора количество баров равно 512, а bars_counted = 0. Все норм, рисует.

На втором проходе: баров 512, а bars_counted 511 - тоже все ок.

На третьем или четвертом тике: баров 1024, а bars_counted 0 и тогда вылетает ошибка выхода за пределы массива.

Насколько я поняла, проблема в том, что первая прорисовка идет до того, как бары дозагрузятся с сервера, поэтому на следующих тиках, когда в истории появились новые бары то все и глючит. Как избежать этой ошибки? Может есть какая-то фишка

Ihor Herasko
21869
Ihor Herasko  
Olga Miakhovich:


На третьем или четвертом тике: баров 1024, а bars_counted 0 и тогда вылетает ошибка выхода за пределы массива.

Посмотрите, к какому именно массиву идет обращение. Исходя из этого и нужно делать выводы. То, что bars_counted (я так понимаю, что речь идет о prev_calculated) равно нулю, явно указывает на то, что нужно произвести повторный перерасчет всех показаний индикатора. Ведь баров стало намного больше.

Dmitry Fedoseev
57660
Dmitry Fedoseev  
Обычно наоборот, такая проблем может случаться при первом расчете. Так что, случай нестандартный.
SeriousRacoon
1124
SeriousRacoon  
Такое может быть, если в алгоритме делаются допущения на обычное поведение данных. Исключите допущения, делайте все необходимые проверки на индексы массивов.
Alexsandr San
3123
Alexsandr San  
Olga Miakhovich:

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

Начала копать глубже и разбираться. Вот что выяснилось:

На первой отрисовке индикатора количество баров равно 512, а bars_counted = 0. Все норм, рисует.

На втором проходе: баров 512, а bars_counted 511 - тоже все ок.

На третьем или четвертом тике: баров 1024, а bars_counted 0 и тогда вылетает ошибка выхода за пределы массива.

Насколько я поняла, проблема в том, что первая прорисовка идет до того, как бары дозагрузятся с сервера, поэтому на следующих тиках, когда в истории появились новые бары то все и глючит. Как избежать этой ошибки? Может есть какая-то фишка

а можно скинуть файл индикатора?

если вам не жалко

Файлы:
Olga Miakhovich
525
Olga Miakhovich  
Aleksandr Klapatyuk:

а можно скинуть файл индикатора?

если вам не жалко

не, нельзя)

Evgeniy Zhdan
16901
Evgeniy Zhdan  
Olga Miakhovich:

не, нельзя)

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

Алексей Тарабанов
10042
Алексей Тарабанов  
Olga Miakhovich:


Насколько я поняла, проблема в том, что первая прорисовка идет до того, как бары дозагрузятся с сервера, поэтому на следующих тиках, когда в истории появились новые бары то все и глючит. Как избежать этой ошибки? Может есть какая-то фишка

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

Olga Miakhovich
525
Olga Miakhovich  
Алексей Тарабанов:

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

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

Artyom Trishkin
Модератор
56741
Artyom Trishkin  
Olga Miakhovich:

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

Сделайте проверку на минимальное количество баров истории в самом начале OnCalculate():

if(rates_total<нужное_минимально_возможное_количество_баров_для_правильного_расчёта)
   return 0;

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

В самом конце OnCalculate() возвращаете посчитанное количество баров:

return(rates_total);
Olga Miakhovich
525
Olga Miakhovich  
Artyom Trishkin:

Сделайте проверку на минимальное количество баров истории в самом начале OnCalculate():

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

В самом конце OnCalculate() возвращаете посчитанное количество баров:

Совет отличный, спасибо. Но я нашла ошибку: ошибка была в том, что мои буферы после первого расчета были со значениями, а counted bars сбрасывается в 0 при изменении кол-ва баров не смотря на то, что в буферах все же что-то есть, ну я их и наполнила значениями EMPTY_VALUE через ArrayInitialize()

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