Скачать MetaTrader 5

Индикаторные буферы разных типов

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Пополняй свой счет с помощью WebMoney
Konstantin Vlasov
22
Konstantin Vlasov 2015.03.06 22:07 

Здравствуйте!

Дорос до написания пользовательских индикаторов и сразу столкнулся с препятствием:( 

Дело в то, что на каждой итерации мы задаем определенное double значение для любого буфера, и можем использовать для вычисления значение в следующей операции например. Но тут мне понадобилось хранить на каждой итерации не одно значение, а массив значений, причем размер массива заранее не определен, на одной итерации мне может понадобиться для вычислений 100 значений, на другой 500. То есть мне необходим буфер не типа double, а типа double[]. 
Сначала я хотел создать просто массив из буферов заведомо больших размеров, но как выяснилось в mql5 больше 1000 буферов для индикаторов нельзя указать (точно значение не проверял).

Я пробовал создавать буферы напрямую (buf[][]) и через структуры, но не один из вариантов не принимается функцией SetIndexBuffer (что, конечно логично). Я хотел было не указывать этот двумерный массив как буфер. Но так любые вычисления производимые над этим индикатором, каким-то образом переписывают значения в реальных буферах, и индикатор уже не выдает нужных значений.

P.S. я пытаюсь в памяти выстроить структуру горизонтальных объемов по дням, что бы по этой структуре уже вычислять реальные буферы и выводить на кран например пик дневного объема. Имеются ввиду вот такие горизонтальные объемы: https://www.mql5.com/ru/code/9376
Повторюсь, мне не требуется их рисовать, но хотя бы хранить в памяти чтобы производить вычисления, очень бы хотелось:( 

Индикатор объёмов EVA
Индикатор объёмов EVA
  • голосов: 2
  • 2009.12.07
  • Комарских Александр
  • www.mql5.com
Индикатор отображения объёмных уровней (гистограмм) по различным инструментам
Sergey Dzyublik
4817
Sergey Dzyublik 2015.03.06 22:38  
Посмотрите в сторону классов с массивом в качестве поля класса, которые будут объединенные неким контейнером (CList или CArray....)
Konstantin Vlasov
22
Konstantin Vlasov 2015.03.06 23:12  

Проблема оказалось в том, что у меня мало опыта с С++. Я забыл заранее инициализировать размеры не буферных массивов. Поэтому когда я не указывал массив как буферный, а пытался работать с ним сам, то он обращался к несуществующим индексам и перезаписывал участки памяти.

А что бы они не выходили за рамки разумных размеров, сделал их  перезаписывание каждые сутки, так удалось работать с двумерным массив размером примерно [1500][20000]

Dmitry Fedoseev
42906
Dmitry Fedoseev 2015.03.07 03:06  

Если использовать структуру, точно можно применять SetIndexBuffer(). Структура содержит массив double, потом объявляем массив этих структур. В SetIndexBuffer() отдаем массив из структуры (в цикле для каждого элемента массива структур). Максимальное количество буферов не 1000, а кажется 512. Использование класса вместо структуры - это стрельба из пушки по воробьям.

Стоило бы поискать другой алгоритм решения вашей задачи. 

Alexandr Gavrilin
31539
Alexandr Gavrilin 2015.03.07 07:28  
ALXIMIKS:
Посмотрите в сторону классов с массивом в качестве поля класса, которые будут объединенные неким контейнером (CList или CArray....)

+++

лучшее решение  

Konstantin Vlasov
22
Konstantin Vlasov 2015.03.07 18:34  

Если использовать структуру, точно можно применять SetIndexBuffer(). Структура содержит массив double, потом объявляем массив этих структур. В SetIndexBuffer() отдаем массив из структуры (в цикле для каждого элемента массива структур). Максимальное количество буферов не 1000, а кажется 512. Использование класса вместо структуры - это стрельба из пушки по воробьям.

Стоило бы поискать другой алгоритм решения вашей задачи. 

 SetIndexBuffer не подошел именно из-за того что мне в любом случае может понадобиться до 2000 буферов. Поэтому я просто использую массив структур без указания их как буферных. А что бы памяти хватало заполняю его информацией только последнего дня. Так отрисовывается и на весь график и достаточно быстро (4 секунды если минутный график и быстрее на остальных).

Задача решена, всем спасибо за участие. 

Konstantin Vlasov
22
Konstantin Vlasov 2015.03.07 18:50  

Кстати, получилось вот так

Volume Distribution

Это индикатор распределения дневной горизонтальной волатильности
Зеленые пунктиры - границы дневной волатильности
Оранжевая линия - пик волатильности
Синяя - средневзвешенная волатильность
Зеленные - первое и второе стандартные отклонения

Не знаю насколько ценны эти потуги, но если это представляет интерес для сообщества, могу выложить в codebase.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий