Для начала уберите
ArrayFill(iSellBuffer, 0, ArraySize(iSellBuffer), 0); ArrayFill(iBuyBuffer, 0, ArraySize(iBuyBuffer), 0); ArrayFill(iDelta, 0, ArraySize(iDelta), 0); ArrayFill(iDeltaColor, 0, ArraySize(iDeltaColor), 0);
ведь строкой ранее Вы уже инициализируете массивы через ArrayInitialize
В OnInit() у индикаторных буфферов нолевой размер.
Сначала у буферов - а это динамические массивы - нулевая длина. И вот Вы с помощью ArrayInitialize заполняете буфера на всю нулевую длину нулями. Этого Вам показалось мало. и Вы с помощью ArrayFill еще раз на всю нулевую длину заполняете буфера нулями. Обе эти операции дают отсутствующий результат. А потом Вы смотрите, что получилось. Да все что угодно, рандомное содержимое памяти
Кстати это легко проверить если в OnInit выполнить код:
Print("Size iBuyBuffer: ",ArraySize(iBuyBuffer)); Print("Size iSellBuffer: ",ArraySize(iSellBuffer)); Print("Size iDelta: ",ArraySize(iDelta)); Print("Size iDeltaColor: ",ArraySize(iDeltaColor));
Если непонятно сформулировал, то перефразирую - как ОБНУЛИТЬ индикаторный буфер?
Или так, как понять, что в индикаторе отрисовался новый бар с нулевым значением, если по факту с самого начала значение в нем НЕ нулевое, а рандомное?
Возможно IsNewBar, но надо ловить все тики, OnCalculate их и так пропускает, а с проверкой на изменение даты могут дополнительные косяки быть.
Про то, что он имеет нулевую длину в OnInit - знаю, обнуление было добавлено от отчаяния и никакой роли не играет, можете закоментировать этот код, сути не меняет.
Если непонятно сформулировал, то перефразирую - как ОБНУЛИТЬ индикаторный буфер?
Или так, как понять, что в индикаторе отрисовался новый бар с нулевым значением, если по факту с самого начала значение в нем НЕ нулевое, а рандомное?
Возможно IsNewBar, но надо ловить все тики, OnCalculate их и так пропускает, а с проверкой на изменение даты могут дополнительные косяки быть.
Если prev_calculated ==0 значит это или первый заплыв или история была подкачана - в любом случае нужно ПРОЙТИСЬ по всем индексам всех индикаторных буферов. Процедура "ПРОЙТИСЬ" подразумевает ПРИСВОЕНИЕ какого-то значения КАЖДОМУ индексу каждого индикаторного буфера. "Какое-то" значение - зависит от логики индикатора, как правило это рассчитанное значение.
Если OnCalculate==0 значит это или первый заплыв или история была подкачана - в любом случае нужно ПРОЙТИСЬ по всем индексам всех индикаторных буферов. Процедура "ПРОЙТИСЬ" подразумевает ПРИСВОЕНИЕ какого-то значения КАЖДОМУ индексу каждого индикаторного буфера. "Какое-то" значение - зависит от логики индикатора, как правило это рассчитанное значение.
Да, спасибо, это то.
Единственное уточнение, что именно в OnCalculate надо проверять на 0, prev_calculated / total_bars?
Да, спасибо, это то.
Единственное уточнение, что именно в OnCalculate надо проверять на 0, prev_calculated / total_bars?
Извините опечатка (сейчас поправлю). Конечно prev_calculated ==0.
int OnCalculate( const int bars, const int counted, const datetime& time[], const double& open[], const double& high[], const double& low[], const double& close[], const long& ticks[], const long& volume[], const int& spread[] ) { if (bars != counted) { iDelta[0] = 0; iBuyBuffer[0] = 0; iSellBuffer[0] = 0; } return bars; }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
2018.02.06 02:52:22.375 OrderBook (EPM8,M1) -1.302842498424572e+308 : -1.302842498424572e+308
В этот раз сделал такой костыль, но... с этим надо что-то решать... пример пустого индикатора, который возвращает такие значение ниже.