How to code an indicator properly - страница 4

 
Roman #:
Напрочь никто не желает думать, прежде чем пишут!
— Алло, дорогая, только что по радио передали, что один псих едет по встречке… Будь осторожнее!
— Один? Да их тут тысячи!
 
Botan626 #:
Разработчики уже дали пример как строить DRAW_LINE, в примере найдёте цикл for в OnCalculate.
Ну вот и используйте свой цикл for, ваше предложение никак не пересекается с моими потребностями.
И ваши комментарии не уместны из-за вашего непонимания задачи, и тем более непонимание, что я не просил чьих-то советов!
Иди почитай лучше за работу с указателями в языке Си и что это вообще такое.
 
Roman #:
Ну вот и используйте свой цикл for, ваше предложение никак не пересекается с моими потребностями.

Цикл for как бы намекает, что надо использовать > 1 точки для построения DRAW_LINE.

попробуй для 

 buff[rates_total - 2]

задать какое-нибудь значение, вдруг случится чудо, появится линия и придёт понимание

 
Roman #:
Иди почитай лучше за работу с указателями в языке Си и что это вообще такое.

Сдвиг с помощью ArrayCopy()  это есть гуд.

Но здесь нет бага, я в своё время тоже долго не мог вьехать почему два сдвига. Без обид пожалуйста, но попросил ИИ объяснить, вроде норм получилось.

//---

Мне не нужен рабочий вариант, я знаю как сделать, у меня не получается ПОНЯТНО ОБЪЯСНИТЬ почему получается дырка.


Понял, вам нужно четкое объяснение причины дырки, а не исправление.

Почему возникает дырка:

Ваш код на открытии нового бара:

  1. Было: массив  buff  размером N (последний элемент — BID последнего тика старого бара)

  2. Пришел новый бар:  rates_total  увеличился до N+1, массив  buff  автоматически расширен, но новый элемент  buff[N]  содержит 0 или мусор

  3. Сдвиг:  ArrayCopy(buff, buff, 0, 1, N)  — копирует элементы с индексов 1..N в индексы 0..N-1

    • buff[N-2]  = старое  buff[N-1]  (последний BID старого бара)

    • buff[N-1]  = старое  buff[N]  (мусор/ноль) ← ВОТ ДЫРКА

  4. Вставка:  buff[N]  = текущий BID (уже нового бара)

Итог: между  buff[N-2]  (последний BID старого бара) и  buff[N]  (новый BID) находится  buff[N-1]  с мусором — линия падает к нулю или делает скачок.

Дырка появляется внутри старого массива после сдвига, а не на стыке баров.

 
Botan626 #:

Цикл for как бы намекает, что надо использовать > 1 точки для построения DRAW_LINE.

попробуй для 

задать какое-нибудь значение, вдруг случится чудо, появится линия и придёт понимание

Ты можешь понять или нет, что я написал о некорректной реализации не с целью того, чтоб её обходить?
Способы обхода известны и давно тут уже написали, не в этом вся суть.
А в том, что из маленьких костыликов то там, то там и обхода всяких приколов mql5, в итоге нарастает ком не эффективного, замусоренного кода.
Пример кода выше как бы намекает, о проблеме начальной отрисовки под капотом, что может относиться косвенно или прямо к пропуску в буфере.
Разработчикам видней, я пояснил корявость реализации. А костылить тут все мастера, чем вносить предложения по исправлению.
 
Aleksandr Slavskii #:


Тут как бы мы не знаем достоверно, а только предполагаем, что буфер аллоцируется именно на N+1, в чём я сомневаюсь.
Он может аллоцироваться с запасом N+n, вроде так Ренат давно пояснял, а сама подкапотная работа с буфером в пределах неких границ.
Что там под капотом нам не известно. Но сами размыслите, зачем допускать в реализации пропуски?
Их не должно быть априори для пользователя в проде, значит ошибка в проекте этой реализации, который возможно есть смысл пересмотреть.
Я устал повторять, что раньше давненько уже, не было не пропусков, не проблем с начальной отрисовкой.
Ладно, утомила меня эта бессмысленная беседа. Всем здравия.