Не подскажешь мне почем у при попытке заполнить в цикле индикаторный массив по формуле Mass[ i ]= Mass[ i+1]+А; где А переменная, компиляция проходит без ошибок а при присоединению к окну выходит сообщение array out of range (выход из размера массива)?
Потому что цикл нужно делать с учётом того, в какую ячейку последнюю запись будет делаться. Если размер массива Mass[], допустим, равен 10, цикл от нуля до 9 (это индекс последней ячейки массива), то при i==9, вы пытаетесь писать в ячейку с индексом 9+1. А ячейки 10 у массива нет. Соответственно и получаете выход за пределы массива.
И еще одно. Почему я должен начинать расчеты с бара с номером (prev_calculated - 1), если я уже рассчитывал индикатор prev_calculated раз?
Например, я рассчитал индикатор 5 раз для баров 0, 1, 2, 3 и 4. Мне не нужно снова рассчитывать его на баре 4. Я должен продолжить с бара 5.
Хорошо. Я думаю, что я не прав, потому что 4-й бар мог измениться с момента моего последнего расчета. Так что (prev_calculated - 1) выглядит правильно.
Николай!
Не подскажешь мне почем у при попытке заполнить в цикле индикаторный массив по формуле Mass[ i ]= Mass[ i+1]+А; где А переменная, компиляция проходит без ошибок а при присоединению к окну выходит сообщение array out of range (выход из размера массива)?
Николай, спасибо. Это отличный учебник!
Но я думаю, что переменная
в коде всегда будет иметь нулевое значение. Это важно для расчета?
Николай, спасибо. Это отличный учебник!
Но я думаю, что переменная
в коде всегда будет иметь нулевое значение. Это важно для расчета?
Значение "begin" будет разным в зависимости от того, к какому индикатору применяется. Если вы применяете RSI, то"begin" будет 14, например.
При первой попытке компиляции может возникнуть ошибка буфера. Поэтому, пожалуйста, измените количество буферов:
#property indicator_buffers 2
В дальнейшем вы можете вернуться к 1 (одному) буферу:
#property indicator_buffers 1
Я не понимаю. Предположим,
rates_total == MA_Period - 1
и это первый вызов функции, поэтому
prev_calculated == 0
а также begin == 0
тогда условие в первом if(rates_total < MA_Period - 1 + begin) оценивается как false
тогда
first = MA_Period - 1 будет выполнено
но тогда НЕТ РАСЧЕТОВ, потому что условие в первом цикле for оценивается как ложное.
Я думаю, что первое условие if должно быть следующим
if( rates_total < MA_Period + begin )
Я что-то упустил?
И еще одно. Почему я должен начинать расчеты с бара с номером (prev_calculated - 1), если я уже рассчитал индикатор prev_calculated раз?
Например, я рассчитал индикатор 5 раз для баров 0, 1, 2, 3 и 4. Мне не нужно снова рассчитывать его на баре 4. Я должен продолжить с бара 5.
И еще одно. Почему я должен начинать расчеты с бара с номером (prev_calculated - 1), если я уже рассчитывал индикатор prev_calculated раз?
Например, я рассчитал индикатор 5 раз для баров 0, 1, 2, 3 и 4. Мне не нужно снова рассчитывать его на баре 4. Я должен продолжить с бара 5.