Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
В Маркете более 400 индикаторов. Попробуй любой из них!
Иван Корнилов
544
Иван Корнилов 2012.04.17 18:00 
Собственно как буфер в индикаторе работает? Можно предположить что это большой массив, у которого меняется размер когда количество баров больше его размера. А при обращении к первому элементу мы получаем последний последний элемент массива. На сколько элементов увеличивается массив при его заполнении? Или возможно индикаторный буфер это комбинация массивов? Вообщем хочется сделать средствами языка, сделать буферы аналогичные индикаторным.
o_o
Модератор
23712
o_o 2012.04.17 18:14  
excelf:
Собственно как буфер в индикаторе работает? Можно предположить что это большой массив, у которого меняется размер когда количество баров больше его размера. А при обращении к первому элементу мы получаем последний последний элемент массива. На сколько элементов увеличивается массив при его заполнении? Или возможно индикаторный буфер это комбинация массивов? Вообщем хочется сделать средствами языка, сделать буферы аналогичные индикаторным.

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

Комбинатор
15932
Комбинатор 2012.04.17 18:21  
sergeev:

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

И поиском тоже по ходу.
Alexey Subbotin
4998
Alexey Subbotin 2012.04.17 18:39  
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);
}
Иван Корнилов
544
Иван Корнилов 2012.04.17 19:10  
sergeev:

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

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

мой вариант:

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

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

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

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

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

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

Этот вопрос вообще непонятен.
Иван Корнилов
544
Иван Корнилов 2012.04.17 19:45  
TheXpert:

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


STL вектор или лист данные хранит в таком же массиве. Значит тоже самое можно сделать и средствами мкуэль. Если разработчики используют вектор хотелось бы знать как он настроен.
123456
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий