[Решено] CopyBuffer: 1-й и 3-й вариант функции копирует по разному? - страница 2

 
Первое что прихоит в голову выставить явно всем буферам одинаковое свойство AsSeries
 
Комбинатор:
Первое что прихоит в голову выставить явно всем буферам одинаковое свойство AsSeries

Неа. ArraySetAsSeries всем трём буферам ничего не изменило.

 
Vladimir Karputov:

Код.

ВНИМАНИЕ! Запускать на W1 или MN! Так как распечатываются индикаторные буферы ПОЛНОСТЬЮ!

ds

ошибки в коде

1.

если уж тут делаете

int copy_2=CopyBuffer(handle_iFractals,1,time[rates_total-1],10,FractalsCopyBuffer_2);

то и тут надо

int copy_1=CopyBuffer(handle_iFractals,1,rates_total-1,10,FractalsCopyBuffer_1);


так как массивы ведь не сериализованные

2.

если надо 10 элементов, то тут надо

int copy_3=CopyBuffer(handle_iFractals,1,time[rates_total-1],time[rates_total-10],FractalsCopyBuffer_3);
 
o_o:

ошибки в коде

1.

если уж тут делаете

то и тут надо


так как массивы ведь не сериализованные

2.

если надо 10 элементов, то тут надо


Это вообще не важно, пусть в одном случае 10, а в другом 11 запрашивает. Здесь важно ПОЧЕМУ один вариант CopyBuffer копирует в начало массива, а другой вариант копирует в конец.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

CopyBuffer: 1-й и 3-й вариант функции копирует по разному?

Vladimir Karputov, 2017.10.09 15:31

У CopyBuffer есть три варианта:

Обращение по начальной позиции и количеству требуемых элементов

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

Обращение по начальной дате и количеству требуемых элементов

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

Обращение по начальной и конечной датам требуемого интервала времени

int  CopyBuffer( 
   int       indicator_handle,     // handle индикатора 
   int       buffer_num,           // номер буфера индикатора 
   datetime  start_time,           // с какой даты 
   datetime  stop_time,            // по какую дату 
   double    buffer[]              // массив, куда будут скопированы данные 
   );

Параметры


Массив из 128 элементов, копирование 10-ти элементов, но разными вариантами функции CopyBuffer:

Копирование при помощи 1-го варианта даёт такой результат:

2017.06.06 00:00:00   CopyBuffer #1:
2017.06.06 00:00:00   [  0] +0.00000 +0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000
2017.06.06 00:00:00   [ 16]  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000
2017.06.06 00:00:00   [ 32]  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000
2017.06.06 00:00:00   [ 48]  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000
2017.06.06 00:00:00   [ 64]  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000
2017.06.06 00:00:00   [ 80]  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000
2017.06.06 00:00:00   [ 96]  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000
2017.06.06 00:00:00   [112]  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000   2E+308   2E+308   2E+308   2E+308   2E+308   2E+308   2E+308  0.75169   2E+308   2E+308

Копирование при помощи 3-го варианта даёт такой результат:

2017.06.06 00:00:00   CopyBuffer #3:
2017.06.06 00:00:00   [  0]   2E+308   2E+308   2E+308   2E+308   2E+308  0.73285   2E+308   2E+308   2E+308   2E+308  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000
2017.06.06 00:00:00   [ 16]  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000
2017.06.06 00:00:00   [ 32]  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000
2017.06.06 00:00:00   [ 48]  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000
2017.06.06 00:00:00   [ 64]  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000
2017.06.06 00:00:00   [ 80]  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000
2017.06.06 00:00:00   [ 96]  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000
2017.06.06 00:00:00   [112]  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000  0.00000


Обратите внимание куда пишутся элементы при 1-м и при 3-м варианте.


 
Vladimir Karputov:

Это вообще не важно, пусть в одном случае 10, а в другом 11 запрашивает. Здесь важно ПОЧЕМУ один вариант CopyBuffer копирует в начало массива, а другой вариант копирует в конец.


ответ дан в моем первом пункте.

вы неверно сделали указание индексов какие копировать.

 
Vladimir Karputov:

Это вообще не важно, пусть в одном случае 10, а в другом 11 запрашивает. Здесь важно ПОЧЕМУ один вариант CopyBuffer копирует в начало массива, а другой вариант копирует в конец.



Может в третьем варианте функции поменять местами даты начала и конца периода? Индексация массивов от самого нового элемента к самому старому(по умолчанию), но функции, учитывающие дату(вторая, третья), просто игнорируют данный порядок и де-факто копируют в обратном порядке.

 
Uladzimir Kirychenka:

Может в третьем варианте функции поменять местами даты начала и конца периода? Индексация массивов от самого нового элемента к самому старому(по умолчанию), но функции, учитывающие дату(вторая, третья), просто игнорируют данный порядок и де-факто копируют в обратном порядке.


Утро вечера мудренее, воистину :) . 

Правильный ответ дан в:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

CopyBuffer: 1-й и 3-й вариант функции копирует по разному?

o_o, 2017.10.09 18:44

ошибки в коде

1.

если уж тут делаете

int copy_2=CopyBuffer(handle_iFractals,1,time[rates_total-1],10,FractalsCopyBuffer_2);

то и тут надо

int copy_1=CopyBuffer(handle_iFractals,1,rates_total-1,10,FractalsCopyBuffer_1);


так как массивы ведь не сериализованные

2.

если надо 10 элементов, то тут надо

int copy_3=CopyBuffer(handle_iFractals,1,time[rates_total-1],time[rates_total-10],FractalsCopyBuffer_3);

То есть хоть вариант #1, хоть вариант #2, хоть вариант #3 - главное запрашивать данные С ОДНОЙ СТОРОНЫ ГРАФИКА: с левой стороны или с правой. А не так как я сделал: один вариант запрашивал данные с левой стороны, а другой вариант запрашивал данные с право стороны.

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