Проблема оказалось в том, что у меня мало опыта с С++. Я забыл заранее инициализировать размеры не буферных массивов. Поэтому когда я не указывал массив как буферный, а пытался работать с ним сам, то он обращался к несуществующим индексам и перезаписывал участки памяти.
А что бы они не выходили за рамки разумных размеров, сделал их перезаписывание каждые сутки, так удалось работать с двумерным массив размером примерно [1500][20000]
Если использовать структуру, точно можно применять SetIndexBuffer(). Структура содержит массив double, потом объявляем массив этих структур. В SetIndexBuffer() отдаем массив из структуры (в цикле для каждого элемента массива структур). Максимальное количество буферов не 1000, а кажется 512. Использование класса вместо структуры - это стрельба из пушки по воробьям.
Стоило бы поискать другой алгоритм решения вашей задачи.
Посмотрите в сторону классов с массивом в качестве поля класса, которые будут объединенные неким контейнером (CList или CArray....)
+++
лучшее решение
Если использовать структуру, точно можно применять SetIndexBuffer(). Структура содержит массив double, потом объявляем массив этих структур. В SetIndexBuffer() отдаем массив из структуры (в цикле для каждого элемента массива структур). Максимальное количество буферов не 1000, а кажется 512. Использование класса вместо структуры - это стрельба из пушки по воробьям.
Стоило бы поискать другой алгоритм решения вашей задачи.
SetIndexBuffer не подошел именно из-за того что мне в любом случае может понадобиться до 2000 буферов. Поэтому я просто использую массив структур без указания их как буферных. А что бы памяти хватало заполняю его информацией только последнего дня. Так отрисовывается и на весь график и достаточно быстро (4 секунды если минутный график и быстрее на остальных).
Задача решена, всем спасибо за участие.
Кстати, получилось вот так
Это индикатор распределения дневной горизонтальной волатильности
Зеленые пунктиры - границы дневной волатильности
Оранжевая линия - пик волатильности
Синяя - средневзвешенная волатильность
Зеленные - первое и второе стандартные отклонения
Не знаю насколько ценны эти потуги, но если это представляет интерес для сообщества, могу выложить в codebase.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте!
Дорос до написания пользовательских индикаторов и сразу столкнулся с препятствием:(
Дело в то, что на каждой итерации мы задаем определенное double значение для любого буфера, и можем использовать для вычисления значение в следующей операции например. Но тут мне понадобилось хранить на каждой итерации не одно значение, а массив значений, причем размер массива заранее не определен, на одной итерации мне может понадобиться для вычислений 100 значений, на другой 500. То есть мне необходим буфер не типа double, а типа double[].
Сначала я хотел создать просто массив из буферов заведомо больших размеров, но как выяснилось в mql5 больше 1000 буферов для индикаторов нельзя указать (точно значение не проверял).
Я пробовал создавать буферы напрямую (buf[][]) и через структуры, но не один из вариантов не принимается функцией SetIndexBuffer (что, конечно логично). Я хотел было не указывать этот двумерный массив как буфер. Но так любые вычисления производимые над этим индикатором, каким-то образом переписывают значения в реальных буферах, и индикатор уже не выдает нужных значений.
P.S. я пытаюсь в памяти выстроить структуру горизонтальных объемов по дням, что бы по этой структуре уже вычислять реальные буферы и выводить на кран например пик дневного объема. Имеются ввиду вот такие горизонтальные объемы: https://www.mql5.com/ru/code/9376
Повторюсь, мне не требуется их рисовать, но хотя бы хранить в памяти чтобы производить вычисления, очень бы хотелось:(