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

 

Ложная тревога. @o_o помог найти ошибку.


У 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-м варианте.

 

Код?

 

Все-таки нужно видеть, как происходит вызов обоих вариантов. Ведь со временем там много нюансов. К примеру, время указывает в середину бара. Тогда данные этого бара не будут скопированы. При указании индексов такой проблемы нет.

 
Rashid Umarov:

Код?


Может будет вечером. Скорее утром.

Ihor Herasko:

Все-таки нужно видеть, как происходит вызов обоих вариантов. Ведь со временем там много нюансов. К примеру, время указывает в середину бара. Тогда данные этого бара не будут скопированы. При указании индексов такой проблемы нет.


Что видеть-то? если один метод пихает скопированное в начало массива, а второй метод пихает скопированное в конец массива.

 
Vladimir Karputov:


Что видеть-то? если один метод пихает скопированное в начало массива, а второй метод пихает скопированное в конец массива.


Не факт. Данные в принципе разные. К тому же в первом варианте в начале массива есть подозрительные значения в виде "+0.00000". Это говорит о том, что там не ноль.

 
Vladimir Karputov:

Может будет вечером. Скорее утром.


Что видеть-то? если один метод пихает скопированное в начало массива, а второй метод пихает скопированное в конец массива.

А индексация массивов не разная ли для 1го и 3го типов вызовов?

 
Vladimir Karputov:

Может будет вечером. Скорее утром.


Что видеть-то? если один метод пихает скопированное в начало массива, а второй метод пихает скопированное в конец массива.

Владимир, ты же знаешь: код - это первое что у тебя спросят. Без него даже и говорить не будут

 
Rashid Umarov:

Владимир, ты же знаешь: код - это первое что у тебя спросят. Без него даже и говорить не будут


Знаю :)

 

Код.

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

//+------------------------------------------------------------------+
//|                                         TestCopyBuffer_1_2_3.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000" 

#property description "Тест функции CopyBuffer: вариант 1, вариант 2 и вариан 3" 

#property indicator_chart_window 
#property indicator_buffers 3
#property indicator_plots   0
//--- An indicator buffers for the plot 
double         FractalsCopyBuffer_1[];
double         FractalsCopyBuffer_2[];
double         FractalsCopyBuffer_3[];
//--- Fractals handles 
int            handle_iFractals;             // variable for storing the handle of the iFractals indicator 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,FractalsCopyBuffer_1,INDICATOR_CALCULATIONS);
   SetIndexBuffer(1,FractalsCopyBuffer_2,INDICATOR_CALCULATIONS);
   SetIndexBuffer(2,FractalsCopyBuffer_3,INDICATOR_CALCULATIONS);
//--- Set as an empty value
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//--- create handle of the indicator iFractals
   handle_iFractals=iFractals(Symbol(),Period());
//--- if the handle is not created 
   if(handle_iFractals==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code 
      PrintFormat("Failed to create handle of the iFractals indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early 
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   static long counter=0;
   if(counter!=0)
      return(rates_total);
   ArrayInitialize(FractalsCopyBuffer_1,0.0);
   ArrayInitialize(FractalsCopyBuffer_2,0.0);
   ArrayInitialize(FractalsCopyBuffer_3,0.0);
   counter++;
//--- test CopyBuffer #1
/*
Обращение по начальной позиции и количеству требуемых элементов
int  CopyBuffer( 
   int       indicator_handle,     // handle индикатора 
   int       buffer_num,           // номер буфера индикатора 
   int       start_pos,            // откуда начнем  
   int       count,                // сколько копируем 
   double    buffer[]              // массив, куда будут скопированы данные 
   );
*/
   int copy_1=CopyBuffer(handle_iFractals,1,0,10,FractalsCopyBuffer_1);
   Print("CopyBuffer #1:");
   ArrayPrint(FractalsCopyBuffer_1);
//--- test CopyBuffer #2
/*
Обращение по начальной дате и количеству требуемых элементов
int  CopyBuffer( 
   int       indicator_handle,     // handle индикатора 
   int       buffer_num,           // номер буфера индикатора 
   datetime  start_time,           // с какой даты 
   int       count,                // сколько копируем 
   double    buffer[]              // массив, куда будут скопированы данные 
   );
*/
   int copy_2=CopyBuffer(handle_iFractals,1,time[rates_total-1],10,FractalsCopyBuffer_2);
   Print("CopyBuffer #2:");
   ArrayPrint(FractalsCopyBuffer_2);
//--- test CopyBuffer #3
/*
Обращение по начальной и конечной датам требуемого интервала времени
int  CopyBuffer( 
   int       indicator_handle,     // handle индикатора 
   int       buffer_num,           // номер буфера индикатора 
   datetime  start_time,           // с какой даты 
   datetime  stop_time,            // по какую дату 
   double    buffer[]              // массив, куда будут скопированы данные 
   );
*/
   int copy_3=CopyBuffer(handle_iFractals,1,time[rates_total-1],time[rates_total-1-10],FractalsCopyBuffer_3);
   Print("CopyBuffer #3:");
   ArrayPrint(FractalsCopyBuffer_3);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Deinit                                                           |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+

ds

Файлы:
 

И результат:

AUDUSD,Weekly: testing of Indicators\MyInd\Copyxxxx\TestCopyBuffer_1_2_3.ex5 from 2017.06.06 00:00 to 2017.10.08 00:00 started
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  0.73285   2E+308   2E+308   2E+308   2E+308
2017.06.06 00:00:00   CopyBuffer #2:
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
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   2E+308  0.73285   2E+308   2E+308   2E+308   2E+308  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

ds

 
Vladimir Karputov:

И результат:

ds

1. Вывести на печать все copy_N

2. Вывести самому без ArrayPrint() значения массивов

3. Вывести

time[rates_total-1]
Причина обращения: