Копирование данных с CopyBuffer.

 

Есть индикатор который ищет пересечение 2х МА и он работает верно, и вовремя показывает на графике места пересечений. Но советник, который использует этот индикатор, реагирует на уже готовый сигнал с опозданием еще на 2 бара:

Пример задержки

Как видно на рисунке советник пропустил не только бар на котором сигнал был уже готов, но и еще 1 бар. Хотя в советнике я достаю нулевой индекс индикатора, и для MA-ев используется цена закрытия.

Для копирования данных я использую 

int copyTotal = 3;

CopyBuffer(ExtOpenHandle, 0, 0, copyTotal, ExtOpenBuffer)

Как я понимаю copyTotal и создает задержку когда я ставлю значение 1, то задержка пропадает, и открытие происходит на том же баре что и сигнал.

Но как мне получить более ранние значения не получив при этом задержку, и почему параметр на против которого написано "сколько копируем" сдвигает вперед а не назад? 

int  CopyBuffer(
   int       indicator_handle,     // handle индикатора
   int       buffer_num,           // номер буфера индикатора
   int       start_pos,            // откуда начнем 
   int       count,                // сколько копируем
   double    buffer[]              // массив, куда будут скопированы данные
   );

У меня есть логика согласно которой, я должен получать не только текущее состояние индикатора, но и данные которые соответствуют предыдущим барам.

Я могу скопировать сразу несколько значений используя CopyBuffer так что-бы я мог (на пример) по индексу 0 получить текущее значение, а по индексу 1 значение предыдущего бара?

Конечная цель, - получать необходимое кол-во данных из буфера, используя один вызов CopyBuffer.

 
Павел Раввич:


ArraySetAsSeries(ExtOpenBuffer,true) применить забыли ...

 
Vladimir Karputov:

ArraySetAsSeries(ExtOpenBuffer,true) применить забыли ...

А это надо делать в OnInit или каждый раз перед вызовом? 

 
Павел Раввич:

А это надо делать в OnInit или каждый раз перед вызовом? 

Это нужно делать сразу после объявления массива.

 
Павел Раввич:

А это надо делать в OnInit или каждый раз перед вызовом? 

Этого делать не надо никогда. Достаточно понять какой индекс какому бару соответствует. Вам какая разница написать 0 или 2 для получения значения текущего бара?

 
Alexey Viktorov:

Этого делать не надо никогда. Достаточно понять какой индекс какому бару соответствует. Вам какая разница написать 0 или 2 для получения значения текущего бара?

Мнения разделились...

 
Павел Раввич:

Мнения разделились...

Нет не разделились. Просто разные подходы к решению простейшей задачи. Внимательно почитайте и посмотрите рисунки в документации. Таких наглядных рисунков я не встречал нигде.

 
Тут вопрос когда индикатор нарисовал палочку. По идее он должен при открытии бара ставить на предыдущем. То есть уже #1. Или в буфер стоит сдвиг, чтобы красиво. 

И второй вопрос когда советник лезет за данными? 

То есть на скрине не видно что сов.пропустил бар. Все правильно, неверно понят индикатор
 
Alexey Viktorov:

Нет не разделились. Просто разные подходы к решению простейшей задачи. Внимательно почитайте и посмотрите рисунки в документации. Таких наглядных рисунков я не встречал нигде.

Все решилось после ArraySetAsSeries .

 
Павел Раввич:

Все решилось после ArraySetAsSeries .

Я не сомневался что решится. Я только сомневаюсь в необходимости этого.

Если CopyBuffer() вернул массив с индексацией 0-1-2, то после применения ArraySetAsSeries этот массив будет иметь индексацию 2-1-0

Именно это я и пытался до вас донести. Какая разница какой индекс читать 0 или 2. Главное получить то значение которое нужно. И САМОЕ главное это понять, а не просто тупо применить.

 
Добрый день. А можно ли каким-то образом через API Python получить результаты расчёта индикаторов (по аналогии с CopyBuffer)? Не могу найти такую возможность.