Библиотеки: Класс для создания кольцевого буфера

 

Класс для создания кольцевого буфера:

Класс позволяет самостоятельно организовывать внутри советника или индикатора минитаймсерии, индикаторные минибуфера, короткие буфера для хранения промежуточных потоковых данных.

Автор: Konstantin Gruzdev

 

Получится ли с помощью этого класса уменьшить потребляемую индикатором память?

А потребляемую экспертом, использующим несколько таких индикаторов?

Или задача ставилась другая - просто обеспечить удобный доступ к потоковым данным? 

 
komposter:

Получится ли с помощью этого класса уменьшить потребляемую индикатором память?

А потребляемую экспертом, использующим несколько таких индикаторов?

Или задача ставилась другая - просто обеспечить удобный доступ к потоковым данным? 

Конечно уменьшит. Именно для уменьшения памяти и писался класс. Во всех буферах, включая буфера для промежуточных данных, в памяти хранится только тот размер последних данных, который указывается пользователем.

Должны опубликовать примеры.

 
Lizar:

Должны опубликовать примеры.

Примеры

На момент публикации подготовлено три примера использования кольцевого буфера:

Класс для построения Moving Average
Класс для построения Average True Range
Класс для построения Average Directional Movement Index

Уже есть примеры, только 2 и 3 ссылки битые.
 
fyords:
Уже есть примеры, только 2 и 3 ссылки битые.
Эти примеры еще не опубликованы. Их еще проверяют. Ссылки заработают, после публикации.
 

Немного аналогии для большего понимания:

  • кольцевой буфер в данной реализации это аналог таймсерии, т.е. самые свежие данные имеют индекс 0, самые старые "размер буфера"-1
  • размер кольцевого буфера это аналог  TERMINAL_MAXBARS, но в отличии от TERMINAL_MAXBARS, размер буфера устанавливает пользователь во время инициализации и может менять в процессе использования, сохраняя, при этом, самые последние данные.
  • точно так же, как и с TERMINAL_MAXBARS, данные за пределом размера буфера не доступны, но все последние данные в пределах размера буфера доступны.
  • в кольцевом буфере можно хранить данные индикатора, как в индикаторном буфере, но чтобы их отобразить на графике нужно скопировать данные в индикаторный буфер.
  • если данные индикатора не нужно отображать, то их не нужно копировать в индикаторные буфера, а использовать для своих расчетов прямо из кольцевого буфера (смотрите примеры), что существенно позволяет экономить память и время при перерасчетах индикатора.

 
Lizar:
  • в кольцевом буфере можно хранить данные индикатора, как в индикаторном буфере, но чтобы их отобразить на графике нужно скопировать данные в индикаторный буфер.
  • если данные индикатора не нужно отображать, то их не нужно копировать в индикаторные буфера, а использовать для своих расчетов прямо из кольцевого буфера (смотрите примеры), что существенно позволяет экономить память и время при перерасчетах индикатора.

Я об этом и спрашивал.

Каким образом экономится память, если все равно нужен полноценный индикаторный буфер?

Получается, что сэкономить можно, только если перенести в кольцевой буфер промежуточные расчеты, а это решает далеко не все проблемы.

 

Чего хочется мне - это чтоб индикатор с 20 отображаемыми буферами, обсчитывающий последние 1000 баров, занимал одинаковое количество памяти при "Макс. баров в окне" = 1000 и при "Макс. баров в окне" = 9999999999.

А это, видимо, невозможно =( 

 
Но все равно спасибо за ваш публичный труд.
 
komposter:

Я об этом и спрашивал.

Каким образом экономится память, если все равно нужен полноценный индикаторный буфер?

Получается, что сэкономить можно, только если перенести в кольцевой буфер промежуточные расчеты, а это решает далеко не все проблемы.

Чего хочется мне - это чтоб индикатор с 20 отображаемыми буферами, обсчитывающий последние 1000 баров, занимал одинаковое количество памяти при "Макс. баров в окне" = 1000 и при "Макс. баров в окне" = 9999999999.

А это, видимо, невозможно =( 

Да, экономить возможно только на тех данных, которые не нужно загонять в индикаторный буфер.

Есть пара идей как и в этом случае иногда можно уменьшить потребление памяти. 

Индикаторные буфера нужны в двух случая: когда нужно видеть на графике картинку и когда из индикаторных буферов нужно получать данные в других индикаторах или эксперте. Например, в тестере (не в режиме визуализации) можно использовать кольцевой буфер вместо индикаторного, если он использовался исключительно для визуализации, а в обычном режиме обычный индикаторный. Это позволит при оптимизации экономить память.  У меня даже получалось увеличить скорость оптимизации. Аналогично с передачей данных из индикаторных буферов, можно попробовать использовать другие способы получения данных из индикатора и тогда можно использовать кольцевые вместо индикаторных.

 
Lizar:

Да, экономить возможно только на тех данных, которые не нужно загонять в индикаторный буфер.

Есть пара идей как и в этом случае иногда можно уменьшить потребление памяти. 

Индикаторные буфера нужны в двух случая: когда нужно видеть на графике картинку и когда из индикаторных буферов нужно получать данные в других индикаторах или эксперте. Например, в тестере (не в режиме визуализации) можно использовать кольцевой буфер вместо индикаторного, если он использовался исключительно для визуализации, а в обычном режиме обычный индикаторный. Это позволит при оптимизации экономить память.  У меня даже получалось увеличить скорость оптимизации. Аналогично с передачей данных из индикаторных буферов, можно попробовать использовать другие способы получения данных из индикатора и тогда можно использовать кольцевые вместо индикаторных.

Жаль, конечно, я уже успел обрадоваться.

Все равно спасибо.

 

Буду ждать нормального решения от разработчиков.

 
komposter:

Жаль, конечно, я уже успел обрадоваться.

Все равно спасибо.

 

Буду ждать нормального решения от разработчиков.

Ок. 
Причина обращения: