Ошибка выделения памяти
Добрый день.
Пишу мультитаймфреймовый советник. Для получения котировок с разных ТФ использую функцию АrrауCopyRates
Индикаторы с ТФ расчитываются и хранятся в советнике в массивах, для ускорения доступа к их значениям.
Размеры индикаторных массивов приводятся в соответствие с количеством баров на каждом ТФ конструкцией
После запуска советник работает нормально. Однако спустя несколько часов в журнале терминала появляется вот такая ошибка:
2010.04.14 12:51:17 Memory handler: cannot allocate 3089960 bytes of memory
С чем это связано, и как с этим бороться?
посмотрите на загрузку оперативы, у вас наверно слишком большие массивы.
Оперативки не хватает.
Может где-то что-то надо освобождать принудительно?
Массивы порядочные, но инициализируются на весь объем в init эксперта. Потом к ним по мере появления добавляются только значения для новых баров. Однако ошибка появляется не сразу, а спустя несколько часов после старта эксперта. При этом объем памяти занимаемой терминалом медленно растет. Если терминал перезагрузить, то ошибки выделения памяти пропадут на несколько часов, хотя все массивы проинициализировались на новое значение количества баров.
Может где-то что-то надо освобождать принудительно?
Добрый день.
Пишу мультитаймфреймовый советник. Для получения котировок с разных ТФ использую функцию АrrауCopyRates
Индикаторы с ТФ расчитываются и хранятся в советнике в массивах, для ускорения доступа к их значениям.
Размеры индикаторных массивов приводятся в соответствие с количеством баров на каждом ТФ конструкцией
После запуска советник работает нормально. Однако спустя несколько часов в журнале терминала появляется вот такая ошибка:
2010.04.14 12:51:17 Memory handler: cannot allocate 3 089 960 bytes of memory
С чем это связано, и как с этим бороться?
Зачем вам ВСЕ значения по всей истории в советнике?
По коду. Ресайз лучше делать не на каждом тике, а только на новом поступившем баре соотв. тф. На память это влиять, по идее, не должно, но на быстродействие - точно.
Еще. Если вы перенесете в индикаторы то, что вы делаете сейчас в советнике, то проблема, скорее всего, будет устранена.
#define num 60 //количество элементов в массиве, 60 -вроде как 60 сек или мин :)
static double Mass[num];
ArrayCopy(Mass,Mass,0,1,WHOLE_ARRAY); //сдвигаем массив на одну позицию
.......................
Пишу мультитаймфреймовый советник. Для получения котировок с разных ТФ использую функцию АrrауCopyRates
Индикаторы с ТФ расчитываются и хранятся в советнике в массивах, для ускорения доступа к их значениям.
Размеры индикаторных массивов приводятся в соответствие с количеством баров на каждом ТФ конструкцией
После запуска советник работает нормально. Однако спустя несколько часов в журнале терминала появляется вот такая ошибка:
2010.04.14 12:51:17 Memory handler: cannot allocate 3089960 bytes of memory
С чем это связано, и как с этим бороться?