Лажа с CopyOpen - страница 5

 

Rosh:

Давайте по частям.  Функция CopyBuffer(), третий вариант с датой начала и датой конца:

Тут никак не подходит Ваше описание, У Вас ошибка в передаче параметров.

Не второй и третий, а третий и четвертый. Да и не важно, тот который с меньшим числом это первый параметр, а тот, который с большим - второй, из параметров определяющих копируемый диапазон. 

Здесь это демонстрируется - https://www.mql5.com/ru/forum/3854/page3#comment_67702

Если поменять TimeCurrent() и st  местами, то обе функции работают, но тогда несоответствие со справкой.

Лажа с  CopyOpen
Лажа с CopyOpen
  • www.mql5.com
В итоге, если эксперт записывает нулевые бары, то в конце мы имеем массив из двоящихся троящихся повторений цен открытия, а не массив цен открытия.
 
Integer:

Не второй и третий, а третий и четвертый. Да и не важно, тот который с меньшим числом это первый параметр, а тот, который с большим - второй, из параметров определяющих копируемый диапазон. 

Здесь это демонстрируется - https://www.mql5.com/ru/forum/3854/page3#comment_67702

Если поменять TimeCurrent() и st  местами, то обе функции работают, но тогда несоответствие со справкой.

Да появляется там эта самая ошибка №2. Причем довольно часто.

Даже если бы не появлялась совсем, то это не означает что вазвращается то что нужно или то что внутри функции отсутствует ЗАЩИТА (кем-то предусмотрительно туда воткнутая).

Проверить что и как возвращается ведь можно только проверив начнику буфера. Верно? А в примере есть проверка только на -1 (что не очень показательно на мой взгляд).

 
Interesting:

Да появляется там эта самая ошибка №2. Причем довольно часто.

Даже если бы не появлялась совсем, то это не означает что вазвращается то что нужно или то что внутри функции отсутствует ЗАЩИТА (кем-то предусмотрительно туда воткнутая).

Проверить что и как возвращается ведь можно только проверив начнику буфера. Верно? А в примере есть проверка только на -1 (что не очень показательно на мой взгляд).

Будьте джентельменом, поверьте наслово - с содержимым буфера все нормально. Честное слово, оно уже давно сдано в эусплуатацию, работает, замечаний нет. А тут вот пользуясь случаем... поведал об особенностях работы функций Copy.

 

 

 
Integer:

Будьте джентельменом, поверьте наслово - с содержимым буфера все нормально.

 

Вам видней, мне не очень хочется по косточкам там анатомию разбирать и содержание буферов.

Одно могу сказать что если стартовая дата меньше то все и везде работает на ура. Если обратное указано то "Ошибка 2" в оригинальном примере сейчас не появляется (что странно, поскольку раньше была).

Даже если предположить, что разница действительно есть (а я своим глазам пока верю) - Думается мне что там в третьем варианте либо проверка стоит либо он обрабатывается не как 3-й вариант.

PS

КопиБуфер могли писать отдельно (или поздней), что объяснит скажем защиты на корректность дат. Что касается всех остальных CopyXXX могли быстренько по шаблону сделать (совсем не думая что кто-то будет без проверки даты туда отсылать)...

 

Если бы в скопированном буфере что-то было неправильно, это было бы сразу видно, эти данные потом отображаются на графике, можно сравнить с копируемым индикатором.

 
Integer:

Если бы в скопированном буфере что-то было неправильно, это было бы сразу видно, эти данные потом отображаются на графике, можно сравнить с копируемым индикатором.

Если внутри CopyBuffer стоит проверка переворачивающие даты, то разницу в результате можно и не почувствовать.

К примеру  - Хотим мы получить данные с 1970 по 2011 (будем считать что это правильно). Так вернется буфер с этими данными,как и предполагали разработчики.

А если передадим с 2011 по 1970 функция перевернет даты и конечный результат не пострадает.

PS

Другое дело если мы хотим получить определенное количество баров от конкретной даты, скажем укажите начало текущей датой и попросите вернуть 100-200 баров.

Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Доступ к таймсериям и индикаторам / Bars - Документация по MQL5
 

Integer:

Если поменять TimeCurrent() и st  местами, то обе функции работают, но тогда несоответствие со справкой.

Со справкой там полное соответствие, только нужен переводчик с клингонского :)

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

Для большего понимания что происходит нужно обратиться к общему разделу по работе с таймсериями и индюками.

Для нас будут интересны две вещи, приведенный текст и картинка

1. Функции для работы с таймсериями и индикаторами. Таймсерия отличается от обычного массива тем, что индексация элементов таймсерии производится от конца массива к началу (от самых свежих данных к самым старым). Для копирования значений таймсерий и индикаторов рекомендуется использовать только динамические массивы, так как функции копирования самостоятельно распределяют необходимый размер массивов-приемников значений.

2. При использовании функций доступа к таймсериям и значениям индикаторов необходимо учитывать направление индексации, это подробно описано в разделе Направление индексации в массивах и таймсериях.

3. Исторически сложилось так, что доступ к данным в ценовом массиве производился с конца данных. Физически новые данные всегда дописываются в конец массива, но индекс этого массива всегда равен нулю. Индекс 0 в массиве-таймсерии означает данные текущего бара, то есть  бара, который соответствует незавершенному промежутку времени на данном таймфрейме.



PS

Уже который раз разработчикам намекаю об отсутствии перекрестных ссылок и нормальных примеров (тем более к таким хитрым разделам справки).

 
Integer:

 

1.1 В CopyBuffer() второй параметр TimeCurrent(), третий переменная datetime со значением 0 - работает.

2.1 В CopyBuffer() второй параметр переменная datetime со значением 0, трейтий параметр параметр TimeCurrent()  - работает.

Не воспроизводится, выдает ошибку 4003. Проверьте сами этот индикатор:

//+------------------------------------------------------------------+
//|                                                     Demo_iAC.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot iAC
#property indicator_label1  "iAC"
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrRed,clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input string   symbol=" ";
input int      period;
//--- indicator buffers
double         iACBuffer[];
double         iACColors[];

int handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,iACBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,iACColors,INDICATOR_COLOR_INDEX);

   handle=iAC(NULL,0);
   PrintFormat("handle=%d",handle);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   double values[];
   int copiedBuffer=CopyBuffer(handle,0,TimeCurrent(),0,values);
   PrintFormat("1. CopyBuffer(handle,0,TimeCurrent(),0,values)=%d",copiedBuffer);
   PrintFormat("Error=%d",GetLastError());
   
   ResetLastError();
   copiedBuffer=CopyBuffer(handle,0,(datetime) 0,TimeCurrent(),values);
   PrintFormat("2. CopyBuffer(handle,0,(datetime)0,TimeCurrent(),values)=%d",copiedBuffer);
   PrintFormat("Error=%d",GetLastError());


//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Результат:


 
Rosh:

Не воспроизводится, выдает ошибку 4003. Проверьте сами этот индикатор:

Результат:


Действительно, здесь есть какая-то путаница. Разберемся, спасибо за сообщение.
 
//--- 1
   double values[];    int copiedBuffer=CopyBuffer(handle,0,TimeCurrent(),0,values);    PrintFormat("1. CopyBuffer(handle,0,TimeCurrent(),0,values)=%d",copiedBuffer);    PrintFormat("Error=%d",GetLastError());
//--- 2
   ResetLastError();    copiedBuffer=CopyBuffer(handle,0,(datetime) 0,TimeCurrent(),values);    PrintFormat("2. CopyBuffer(handle,0,(datetime)0,TimeCurrent(),values)=%d",copiedBuffer);    PrintFormat("Error=%d",GetLastError());

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

Надо так же, как и втором случае, указать, что 0 это время, а не количество:

int copiedBuffer=CopyBuffer(handle,0,TimeCurrent(),(datetime)0,values);

Если указать, что это время, то оба варианта работают, но только у CopyBuffer().

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