Когда не хватает индикаторных массивов

 
Сия тема весьма актуальна для тех (но не только), кто ранее юзал Metastock, Omega TS, где практически любая переменная обладает свойствами индикаторного массива.
Порой бывает необходимость (из-за свойств) использовать индикаторный массив для хранения внутренних расчетных данных. Но что делать, если они все заняты под вывод на экран? - Их придется эмулировать. По этой теме инфу в форуме найти можно, но не очевидно . Поэтому отдельно и конкретно.
Свойства массива, привязанного к буферу таковы:
- индексация идет "задом наперед" - последний элемент такого массива имеет индекс 0;
- длина массива равна кол-ву загруженных в терминал баров - Bars;
- при поступлении нового бара индексы ячеек увеличиваются на 1;
Вот простая функция для эмуляции индикаторных массивов:

void EmBuff()
  {  
   static int NewSize; 
   if(NewSize==Bars) return; // если кол-во загруженных баров не изменилось - выход из ф-ии
   NewSize=Bars; // новый размер массивов
   
   ArraySetAsSeries(E0,0); // установка прямого порядка индексирования
   ArrayResize(E0,NewSize); // установка длины массива равной кол-ву загруженных баров
   ArraySetAsSeries(E0,1); // установка обратного порядка индексирования

// ArraySetAsSeries(E1,0); ArrayResize(E1,NewSize); ArraySetAsSeries(E1,1);
// 
// ArraySetAsSeries(En,0); ArrayResize(En,NewSize); ArraySetAsSeries(En,1);
   
   return;
  }

Сперва устанавливается прямое направление индексирования. При увеличении длины (при добавлении нового бара) массива добавляется пустая ячейка с новым номером. После установки обратного индексирования эта ячейка оказывается под нулевым индексом. Старые значения сохранены и смещены. Вот, собственно, и все.

Натурально, массивы для эмуляции должны быть объявлены в головной части программы. Вызов ф-ии нужно делать до операций с этими массивами (например, в начале ф-ии start()).

 

... и 350 лет ждем когда закончится оптимизация эксперта на индикаторе с такой функцией.

 
Integer >>:

... и 350 лет ждем когда закончится оптимизация эксперта на индикаторе с такой функцией.

Вранье. Я всего лишь 349 лет тут...

 
Svinozavr писал(а) >>

Вранье. Я всего лишь 349 лет тут...

К сожалению эта првада. Такая конструкция с массивами очень сильно снижет быстродействие.

 
А почему нельзя в массив сразу заносить данные, как нужно?
 
Integer >>:

К сожалению эта првада. Такая конструкция с массивами очень сильно снижет быстродействие.

Да. Это будет медленнее, чем если использовать инд. буфер. Кто ж спорит?

Я ведь о другом.


По-поводу "очень". Знаете, что-то не заметил заметного торможения. Эмуляция происходит на 1-м тике нового бара. Задержку оценить сложно - т.к. она не заметна. Можно попробовать организовать цикл и замерить.

А у вас что, эмуляция занимает больше времени, чем работа самого индикатора???)))


Единственное что, это отъедает память. Знаете, ваши разговоры - это в пользу бедных, что называется.


Потом необязательно использовать длину равную всей загруженной истории. Только необходимую для нормальной работы. (В большинстве случаев хватает 2 ячеек.)))

Но опять же - я о другом (см. хэдер темы).

 
Zhunko >>:
А почему нельзя в массив сразу заносить данные, как нужно?

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

 
Integer >>:

К сожалению эта првада. Такая конструкция с массивами очень сильно снижет быстродействие.

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

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

 

Какие песни пел я ей про Север дальний!
Я думал: вот чуть-чуть - и будем мы на "ты".
Но я напрасно пел о полосе нейтральной -
Ей глубоко плевать, какие там цветы.

© В. Высоцкий

 
Integer >>:

Не, не напрасно. Я уже за бутылкой побежал - щас на брудершафт пить будем, на "ты" перейдем и вообще...)))

"А на нейтральной полосе цветы..."))))))))
 
Integer >>:
(немедленно выпив) Вот скажи мне, Integer, в чем сила?
В деньгах? Или в быстроте работы эксперта?

Я вот думаю, что в деньгах. Вот смотри: сделал ты эксперт, быстрый эксперт, но он денег не зарабатывает. Так в чем тут сила?

Вот и брат говорит, что в деньгах...


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