О пользовательских буферах - страница 3

 
tara:
Отчего же вместо буфера? Можно просто самому организовать работу с массивом структур. 

Говорить можно что угодно. А если подойти ближе, то какова будет реализация этой задачи?

Давайте взглянем на нечто абстрактное. Например, имеется некий индикатор зиг-зага. У него имеются экстремумы, время появления экстремумов, цены на котором эти экстремумы расположены. Ещё могут быть расположения этих экстремумов относительно соседних по моей логике, но это опустим.

Так вот появляется некая структура типа:

//+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                                   Структура данных экстремумов Zig-Zag'а                                              |
//+---------------------------------------------------------------------------------------------------------------------------------------+
struct ZZ_Data
{
   datetime time;                    // Время нахождения выбранного экстремума Zig-Zag'а
   double   price;                   // Цена, на котором расположен данный экстремум
double   stayingPrice;               // Цена на выбранном экстремуме Zig-Zag'а
};
static ZZ_Data ZZ[];                 // Объявляем переменную структуры

 Теперь если работать с переменной структуру, то всё логично. А каким боком тут мы сможет прилепить буфер? И какой в этом смысл?

 

tara:
Может. В документации присутствует необходимая информация. Структура может быть наложена на обычную строку, например. 

А смысле? Это лишний головняк. Структуру перегонять в строку, а потом наоборот и тд. Опять-таки, своего рода идиотизм.

 

AlexeyVik:
Может я не совсем понял о чём вопрос? Может о SetIndexEmptyValue?

Это ж тоже самое, только вид с боку. По сути,  это тоже  самое что и, например, ArrayInitialize(ExtZigzagBuffer,0.0). Та же инициализация неким значением линии индикатора. А там было буфера.. Опять таки решение по логике не отличается чем-то.

 
shanty:

Это ж тоже самое, только вид с боку. По сути,  это тоже  самое что и, например, ArrayInitialize(ExtZigzagBuffer,0.0). Та же инициализация неким значением линии индикатора. А там было буфера.. Опять таки решение по логике не отличается чем-то.

Нет Виктор, это далеко не тоже самое. SetIndexValue говорит программе какое значение индикатора не отображать нигде, не в окне данных, не на графике. А про ArrayInitialize сам знаешь.
 

Парни, открываю страшную тайну: структуру не надо перегонять в строку, поскольку она строкой является. Можете легко и непринужденно сравнивать два элемента массива структур на точное совпадение точно так же, как сравниваете две текстовые строки.  

 
AlexeyVik:
Нет Виктор, это далеко не тоже самое. SetIndexValue говорит программе какое значение индикатора не отображать нигде, не в окне данных, не на графике. А про ArrayInitialize сам знаешь.

Алексей, тут как-бы я привёл пример. Тоже самое будет вот так:

ArrayInitialize(ExtZigzagBuffer, EMPTY_VALUE)

 По сути, отличия от применения функции  SetIndexEmptyValue() нет.

tara:

Парни, открываю страшную тайну: структуру не надо перегонять в строку, поскольку она строкой является. Можете легко и непринужденно сравнивать два элемента массива структур на точное совпадение точно так же, как сравниваете две текстовые строки.  

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

 
shanty:

Алексей, тут как-бы я привёл пример. Тоже самое будет вот так:

 По сути, отличия от применения функции  SetIndexEmptyValue() нет.

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

 

А подумать? 
 
shanty:

Алексей, тут как-бы я привёл пример. Тоже самое будет вот так:

 По сути, отличия от применения функции  SetIndexEmptyValue() нет.

Ну что можно сказать тому кто не умеет читать?

shanty:

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

Если ты пишешь индикатор, зачем буферы менять на что-то? Любой буфер доступен в любой момент времени.

 
AlexeyVik:

Ну что можно сказать тому кто не умеет читать?

В  том то и дело, что умеет. По сути,  SetIndexEmptyValue()  задаёт значение пустой величины для индикаторной линии. Индикаторная линия строится по значениям буфера. Буфер представляет собой массив. Таким образом, значение пустой величины можно задать как я уже писал по средством свойства буфера, например. Так реализовано в том же, стандартном индикаторе зиг-зага. Разница то какая? У меня в моём зиг-заге тоже так реализовано...

 

AlexeyVik:

Если ты пишешь индикатор, зачем буферы менять на что-то? Любой буфер доступен в любой момент времени. 

 Ну так буферы это и есть массивы. А причины менять стандартный буфер на пользовательский:

1. Возможность  контролировать размер буфера.

2. Возможность работать с любым типом буфера. Будь то структура, будь то ещё что-то.

А это даёт удобство управления таймсерией буферной. 

 
shanty:

В  том то и дело, что умеет. По сути,  SetIndexEmptyValue()  задаёт значение пустой величины для индикаторной линии. Индикаторная линия строится по значениям буфера. Буфер представляет собой массив. Таким образом, значение пустой величины можно задать как я уже писал по средством свойства буфера, например. Так реализовано в том же, стандартном индикаторе зиг-зага. Разница то какая? У меня в моём зиг-заге тоже так реализовано...

Если поймёшь разницу между установкой значения пустой величины и инициализацией массива каким либо значением, может поймёшь свою ошибку.

shanty:

Ну так буферы это и есть массивы. А причины менять стандартный буфер на пользовательский:

1. Возможность  контролировать размер буфера.

2. Возможность работать с любым типом буфера. Будь то структура, будь то ещё что-то.

А это даёт удобство управления таймсерией буферной.

Ну, удачи тебе в твоих экспериментах.

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

Вот расчёты для твоего случая. Значение double занимает 8 байт. 1024 баров графика и соответственно количества ячеек буфера индикатора будут занимать всего 8 килобайт.

А какой такой глубокий смысл в изменении типа значений индикаторного буфера? Хочешь загнать туда шестнадцатиричное представление числа? Или цвета?

Хочешь иметь несколько последних значений ЗЗ заведи пользовательский массив и работай с ним.

 

Паралельно с индикаторным буфером можно создать свой.

А потом делать ему

ArrayResize(user_b,ArraySize(ind_b));

ArrayCopy()

... 

 
eevviill:

Паралельно с индикаторным буфером можно создать свой.

А потом делать ему

ArrayResize(user_b,ArraySize(ind_b));

ArrayCopy()

... 

Смысл?
Причина обращения: