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

 
Собственно как буфер в индикаторе работает? Можно предположить что это большой массив, у которого меняется размер когда количество баров больше его размера. А при обращении к первому элементу мы получаем последний последний элемент массива. На сколько элементов увеличивается массив при его заполнении? Или возможно индикаторный буфер это комбинация массивов? Вообщем хочется сделать средствами языка, сделать буферы аналогичные индикаторным.
 
excelf:
Собственно как буфер в индикаторе работает? Можно предположить что это большой массив, у которого меняется размер когда количество баров больше его размера. А при обращении к первому элементу мы получаем последний последний элемент массива. На сколько элементов увеличивается массив при его заполнении? Или возможно индикаторный буфер это комбинация массивов? Вообщем хочется сделать средствами языка, сделать буферы аналогичные индикаторным.

а что мешает? вы массивами пользоваться не умеете?

 
sergeev:

а что мешает? вы массивами пользоваться не умеете?

И поиском тоже по ходу.
 
excelf:
Собственно как буфер в индикаторе работает? Можно предположить что это большой массив, у которого меняется размер когда количество баров больше его размера. А при обращении к первому элементу мы получаем последний последний элемент массива. На сколько элементов увеличивается массив при его заполнении? Или возможно индикаторный буфер это комбинация массивов? Вообщем хочется сделать средствами языка, сделать буферы аналогичные индикаторным.

мой вариант:

double CustomBuffer[];

int init()
{
   ...
   ArraySetAsSeries(CustomBuffer,true);
   ArrayResize(CustomBuffer,0);
   ...
}

int start()
{
   if(Bars>ArraySize(CustomBuffer))
      ArrayAppend(CustomBuffer,Bars-ArraySize(CustomBuffer));

   ...
}

void ArrayAppend(double &a[], int add)
{
   bool series = ArrayGetAsSeries(a);
   ArraySetAsSeries(a,false);
   ArrayResize(a,ArraySize(a)+add);
   for(int j=0;j<add;j++) a[ArraySize(a)-1-j]=EMPTY_VALUE;
   ArraySetAsSeries(a,series);
}
 
sergeev:

а что мешает? вы массивами пользоваться не умеете?

Вы думаете я открыл это тему что бы получить такой ответ ? Не мешает ничего, просто не хочется изобретать велосипед. Как работают буферы в коде мета трейдера написанном на си? и хочется получить ответ от программистов.
 
alsu:

мой вариант:

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

А вообще- можете использовать "тайное" знание о том,
что массив котировок- это обычный массив языка си у которого 0й элемент- слева.
Просто мк4 помнит максимальный элемент MaxEl и при обращении к данным
делает (MaxEl - Index) - и индексы типа разворачиваются.
 
Можно сделать механизм резервирования, но это немного усложнит работу с буферами.
 
jartmailru:
Можно загегистрировать массив как буфер, но не показывать.

А вообще- можете использовать "тайное" знание о том,
что массив котировок- это обычный массив языка си у которого 0й элемент- слева.
Просто мк4 помнит максимальный элемент MaxEl и при обращении к данным
делает (MaxEl - Index) - и индексы типа разворачиваются.

Я знаю, но в моем случае может быть больше 8 буферов. Вопрос как менять размер буфера ? Как это делает мт, как избежать лишнего пере копирования данных их буфера в буфер ?
 
excelf:
Я знаю, но в моем случае может быть больше 8 буферов. Вопрос как менять размер буфера ?

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

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

Этот вопрос вообще непонятен.
 
TheXpert:

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


STL вектор или лист данные хранит в таком же массиве. Значит тоже самое можно сделать и средствами мкуэль. Если разработчики используют вектор хотелось бы знать как он настроен.
Причина обращения: