А такой вариант не подходит через ArraySetAsSeries?
double macd_buffer[300]; double signal_buffer[300]; int i,limit=ArraySize(macd_buffer); ArraySetAsSeries(macd_buffer,true); for(i=0; i<limit; i++) macd_buffer[i]=iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PRICE_CLOSE,i); for(i=0; i<limit; i++) signal_buffer[i]=iMAOnArray(macd_buffer,limit,9,0,MODE_SMA,i);
В Вашем примере на каждый бар пересчитывается весь массив на 1 значение , а есть необходимость пересчитывать например предыдущие 10 баров от текущего(i) положения.
Это можно сделать через сдвиг на таймсериях, а т.к. буфер индикатора таковым не является, то приходится копировать данные для обработки.
Если сделать буфера таймсериями - проблема уйдёт.
Ну если для Вас "Истесьно" что c функциями iMAOnArray,iEnvelopesOnArray и т.д. приходится работать через ... т.к. на вход необходимы таймсерии.
функциям iMAOnArray, iEnvelopesOnArray и т.д. совершенно по барабану таймсерия на входе или нет. Так как эти функции проводят обсчёт слева-направо (от более старых данных к более новым). Признак серийности нужен только в MQL4-программах для правильной организации доступа к отдельному элементу массива по индексу.
А все данные в клиентском терминале хранятся единообразно - в начале области памяти старые данные, в конце области памяти новые данные.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
ArrayIsSeries(buffer)==FALSE
Так и задумано ?.. или баг.