Число буферов в индикаторе - страница 3

 
alsu писал(а) >>
ну вот пример: когда новый бар в терминал приходит, новая ячейка же имеет 0 номер. А если посмотреть на underlying data, то увидим, что на самом деле она - последняя в массиве.

А проверку делали. Я просто это не проверял, потому как таким способом не пользуюсь. Достаточно для примера простого скрипта или индикатора. С выводом контрольных цифр (чисел).

 
Vinin >>:

А проверку делали. Я просто это не проверял, потому как таким способом не пользуюсь. Достаточно для примера простого скрипта или индикатора. С выводом контрольных цифр (чисел).

Если бы это было не так, то вот это бы, полагаю, не работало? Кроме того, мне кажется именно такой способ адресации самым логичным - гораздо проще переназначить индексы, чем двигать данные.

 
alsu писал(а) >>

Если бы это было не так, то вот это бы, полагаю, не работало? Кроме того, мне кажется именно такой способ адресации самым логичным - гораздо проще переназначить индексы, чем двигать данные.

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

 
Vinin >>:

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

там есть версии и для четверки, и для пятерки. Работают они одинаково, различие версий только в синтаксисе.

Исследование показало, что механизмы адресации массивов не различаются.

 
alsu >>:

если он адресуется как Series, то да. функция ArraySetAsSeries не изменяет внутреннего расположения данных, она только "разворачивает" их адресацию. Оператор [] это не то же самое, что в с++, он не просто берет значение по такому-то смещению, а сначала проверяет, в каком порядке адресуется массив и при необходимости вычисляет новый индекс. Я недавно, когда статью писАл, этот вопрос исследовал.

Не сводите меня с ума! ))) Вот результат простенького скрипта с вашим "предложением" и с тем, как правильно.

Как и было ожидаемо, в вашем случае (без предварительного до ресайза переворота массива) пустая ячейка (#5) добавляется в КОНЕЦ массива. Хоть индексного, хоть нет. Это НЕ годится для эмкуляции индикаторного буфера.

Код скрипта:

#property show_inputs
extern bool alsu=1;

double E0[5];

void start()
  {
   ArraySetAsSeries(E0,1);
   for(int i=0; i<5; i++) E0[i]=i+1;

   if(alsu) ArrayResize(E0,6); // alsu
   else { // svinozavr
      ArraySetAsSeries(E0,0);
      ArrayResize(E0,6);
      ArraySetAsSeries(E0,1);
     }
   
   for(i=0; i<6; i++) Alert("Cell #",i," : ", E0[i]);

   if(alsu) Alert("=== by alsu ===");
   else Alert("=== by svinozavr ===");
  }
 

НЕ МОЖЕТ БЫТЬ

------

пошел стреляться

 
alsu >>:

НЕ МОЖЕТ БЫТЬ

------

пошел стреляться

У Митьков есть картина "Митьки отнимают пистолет у Маяковского".

Жаль, что я не художник...)))

 

мда... надо будет покопать поподробнее, но, похоже, что либо а) при ресайзе массива с обратной индексацией действительно происходит сдвиг в памяти реальных данных либо б) индикаторные буферы все же несколько больше отличаются от обычных массивов, чем я предполагал. Между тем, факт того, что индекс [] это всего лишь псевдоним, установлен достоверно - сам разглядывал адреса ячеек в памяти и убеждался, что при изменении направления индексации данные остаются на месте.

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

 

Чисто для пользователя сдвига при ресайзе как раз и не происходит. Просто добавляется ячейка с новым старшим номером. Приходится его - сдвига как в инд.буфере - добиваться вот таким вот "подвыподвертом". А что там происходит в памяти...

Вы, кажется, слегка себя перехитрили. "Многия знания...")))

 
никто не застрахован от заблуждений:(
Причина обращения: