CopyBuffer копирует массив не полностью - страница 2

 
Konstantin Nikitin:

Как-то так

Дальше сами ловите что не так.

Спасибо за доработку, но индикатор в принципе и так рабочий был. У меня был вопрос не по индикатору, мне хотелось понять  и разобраться, почему меняется размер массива после copybuffer. почему именно после copybuffer, вроде как бы не связанные между собой вещи (handle разных инструментов) в итоге получаются массивы этих инструментов одного размера.

 
savabaka:

Спасибо за доработку, но индикатор в принципе и так рабочий был. У меня был вопрос не по индикатору, мне хотелось понять  и разобраться, почему меняется размер массива после copybuffer. почему именно после copybuffer, вроде как бы не связанные между собой вещи (handle разных инструментов) в итоге получаются массивы этих инструментов одного размера.

Ну зачем на каждом тике пересчитывать весь массив? Все равно то что прошло уже не измениться. Потом нужно отслеживать только последний бар.

P.S. Да не мешает еще очистить буферы перед копированием.

   ZeroMemory( Fast1MABuffer );
   ZeroMemory( Slow1MABuffer );
   ZeroMemory( Fast2MABuffer );
   ZeroMemory( Slow2MABuffer );
   if(CopyBuffer(Fast1MAHandle,0,0,limit,Fast1MABuffer) != limit ||
      CopyBuffer(Slow1MAHandle,0,0,limit,Slow1MABuffer) != limit ||
      CopyBuffer(Fast2MAHandle,0,0,limit,Fast2MABuffer) != limit ||
      CopyBuffer(Slow2MAHandle,0,0,limit,Slow2MABuffer) != limit )
      return(rates_total);
 
Konstantin Nikitin:

Ну зачем на каждом тике пересчитывать весь массив? Все равно то что прошло уже не измениться. Потом нужно отслеживать только последний бар.

P.S. Да не мешает еще очистить буферы перед копированием.

Я согласен с этим, просто на это пока не тратил время. Опять же повторюсь, вопрос совсем в другом. Изменение размера массива ведь происходит даже при первом запуске индикатора, это тогда, когда нам все равно нужно скопировать весь handle в массив.

 
savabaka:

Вот вот именно. А при работе с двумя инструментами у нас выходит, что изначально rates_total у двух инструментов разный, это можно увидеть через BarsCalculated().

Но именно после CopyBuffer с копированием разного количество баров (calculated1,2,3,4) в буффер, выходит что по обоим инструментам размер буфера становится одинаковым. 

не, в индикаторе размер буфера = rates_total, и до и после CopyBuffer.

Таки для мультивалютника нужно копировать поэлементно, по времени, или будет рассинхронизация в момент нового бара и при отсутствующих свечах.

 
Aleksey Lebedev:

не, в индикаторе размер буфера = rates_total, и до и после CopyBuffer.

Таки для мультивалютника нужно копировать поэлементно, по времени, или будет рассинхронизация в момент нового бара и при отсутствующих свечах.

Чтоб не мудрить слишком, можно пересчитывать в последствие, последние 2 бара.

   if(limit<2)
      limit=2;

И проблема с рассинхронизацией отпадет.

 
Aleksey Lebedev:

не, в индикаторе размер буфера = rates_total, и до и после CopyBuffer.

Таки для мультивалютника нужно копировать поэлементно, по времени, или будет рассинхронизация в момент нового бара и при отсутствующих свечах.

Все что выше было сказано все верно, только вы наверное меня не понимаете или не хотите понять. Я согласен что в индикаторе и до и после размер будет = rates_total, но я то говорю не про это а конкретно про массив, к примеру Fast1MABuffer. Вот он равен не тому количеству баров которые я в него копирую.

 
savabaka:

Все что выше было сказано все верно, только вы наверное меня не понимаете или не хотите понять. Я согласен что в индикаторе и до и после размер будет = rates_total, но я то говорю не про это а конкретно про массив, к примеру Fast1MABuffer. Вот он равен не тому количеству баров которые я в него копирую.

Не верно, и не должен быть равен, Fast1MABuffer - индикаторный буфер.

справка:

При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, назначенных в качестве индикаторных буферов функцией SetIndexBuffer(). Для индикаторных буферов все операции по изменению размера производит исполняющая подсистема терминала.

 
Aleksey Lebedev:

Не верно, и не должен быть равен, Fast1MABuffer - индикаторный буфер.

справка:

Вот тут не совсем ясно. Изначально я его идентифицирую

   SetIndexBuffer(2,Fast1MABuffer,INDICATOR_CALCULATIONS);

Но тут нигде не назначается размер. После уже я его заполняю процедурой CopyBuffer. и в ней уже устанавливаю размер который копирую.

 
savabaka:

Вот тут не совсем ясно. Изначально я его идентифицирую

Но тут нигде не назначается размер. После уже я его заполняю процедурой CopyBuffer. и в ней уже устанавливаю размер который копирую.

Для индикаторных буферов все операции по изменению размера производит исполняющая подсистема терминала.

 
Aleksey Lebedev:

Для индикаторных буферов все операции по изменению размера производит исполняющая подсистема терминала.

Немного дошло. Спасибо за ответ.