Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1897

 
Vitaly Muzichenko #:

Зачем Вы сначала записываете данные а затем их сдвигаете?

  Buffer1[0]=b;
  Buffer2[0]=a;
  for(int j=H; j>0; j--) {
    Buffer1[j]=Buffer1[j-1];
    Buffer2[j]=Buffer2[j-1];
  }

Это не соответствует действительному тиковому графику! 

Вот так будет правильно.

  for(int j=H; j>0; j--) {
    Buffer1[j]=Buffer1[j-1];
    Buffer2[j]=Buffer2[j-1];
  }
  Buffer1[0]=b;
  Buffer2[0]=a;
 
Vitaly Muzichenko #:

Опять-же, внутри ArrayCopy()  есть цикл, и возможно не один. Так что код от замены вряд-ли станет легче и быстрее

Я уже не раз говорил выше: без цикла никак не обойтись!

 
Mihail Matkovskij #:

Зачем Вы сначала записываете данные а затем их сдвигаете?

Это не соответствует действительному тиковому графику! 

Вот так будет правильно.

кашерней конечно, но одинаково.)

Да, и короткий цикл до 1000 итераций с парой сравнений присвоений легок. поэтому не должен пугать.

 
EVGENII SHELIPOV #:

Фрактал образовывается если нет нового экстремума и через три бара те 0, 1, 2. 

Ничего не изменилось.

Или что то опять не правильно 

Запусти индикатор фрактал на D1 и посмотри есть там фрактал или нет.
 
Valeriy Yastremskiy #:

кашерней конечно, но одинаково.)

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

 
Mihail Matkovskij #:

Я уже не раз говорил выше: без цикла никак не обойтись!

Вроде получаю правильно


Попробовал сменитить местами заполнение, получаю ошибку


 
Vitaly Muzichenko #:

Попробовал сменитить местами заполнение, получаю ошибку


Странно, почему так?... Вроде всё должно работать, только тики будут находиться на своих местах, а не сдвинуты в лево.

P.S. Дополнительный массив всё же нужно было добавить (как я  говорил вначале). Иначе, при появлении нового бара все тики будут автоматически сдвигаться влево, поскольку, это индикаторные буферы! Или отслеживать момент появления нового бара и сдвигать буферы, но уже вправо.
 
А если не двигать массив, а использовать его как кольцевой буфер, запоминая текущее место первого элемента?
 
Mihail Matkovskij #:

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

Да, в моем случае начинать надо с первого, а не нулевого.) верное замечание.

ЗЫ, хотя да. сперва наддо смещать, а потом присваивать нулевой. без разницы в какую сторону.

ЗЫЗЫ перезаписывая значение нулевого до сдвига, мы теряем значение нулевого индекса.

 
JRandomTrader #:
А если не двигать массив, а использовать его как кольцевой буфер, запоминая текущее место первого элемента?

Что такое кольцевой буфер в мкл

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