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

 
Integer:

Третий вариант от даты до даты, st объявлена как datetime.

 

 

Тогда даты перепутаны, нужно так - Поскольку явно начальная дата не может быть текущая, а конечная в 1970 году!

void OnTick()
{
//----------------------------------------------------------------------------//
//Work variables
int ResTime,ResMA;

datetime dt[];
double buf2[];

datetime st=0;
//----------------------------------------------------------------------------//
ResTime = CopyTime(_Symbol,Period(),st,TimeCurrent(),dt);
ResMA   = CopyBuffer(h,0,st,TimeCurrent(),buf2);

  if(ResTime == -1){Print("Ошибка-1");}else Print("Ok-1");
  if(ResMA   == -1){Print("Ошибка-2");}else Print("Ok-2");  
//----------------------------------------------------------------------------//    
}

PS

При третьем варианте вызова первым параметром в датах идет начальная дата, меньшая по значению (обратите внимание на справку).

datetime  start_time, // с какой даты
datetime  stop_time,  // по какую дату

По этому st (которая 0 - начальная дата), при этом нужно перед копирование в буфер проверить даты на корректность. К примеру по ">/<"

 
Interesting:

Тогда даты перепутаны, нужно так - Поскольку явно начальная дата не может быть текущая, а конечная в 1970 году!

PS

При третьем варианте вызова первым параметром в датах идет начальная дата, меньшая по значению (обратите внимание на справку).

По этому st (которая 0 - начальная дата), при этом нужно перед копирование в буфер проверить даты на корректность. К примеру по ">/<"

Это вопрос интересный, перепутано или нет. Во-первых CopyBuffer() работает с "перепутаными" датами. Налицо нессоответствие в работе функций CopyBuffer() и остальных Copy...  Во вторых, первый параметр, определяющий диапазон, определяет  начальную точку. Копируются данные расположенные левее начальной точки. Если первая дата меньше второй, значит копируются данные расположенные правее начальной точки -  как-то несоответственно.

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

При третьем варианте вызова первым параметром в датах идет начальная дата, меньшая по значению (обратите внимание на справку).

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

 

 
Integer:

Это вопрос интересный, перепутано или нет. Во-первых CopyBuffer() работает с "перепутаными" датами. Налицо нессоответствие в работе функций CopyBuffer() и остальных Copy...  Во вторых, первый параметр, определяющий диапазон, определяет  начальную точку. Копируются данные расположенные левее начальной точки. Если первая дата меньше второй, значит копируются данные расположенные правее начальной точки -  как-то несоответственно.

А левее или правей науке неизвестно (серийность то буфера как я понимаю точно никто не указывал). А автоматом она не додумала что и как эксперт требует.

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

Хотя тут скорей всего просто будет переворот дат (что программер и сам может прекрасно на стадии чека).

На счет индивидуальности CopyBuffer() то и она на тестах ошибку выдавала (хотя реже чем КопиТайм). Да и если бы не выдавала не известно содержит она или нет внутри себя контроль ОТ ДУРАКА (уж извиняйте за сленг).

PS

Кроме того, даже если CopyBuffer() и возвращала бы результат при таком подходе без ошибок кто проверял что там данные копировались с права -> лево, а не как положено (прямое указания на серийность для конечных буферов я в коде не припомню)?


 
Interesting:

1. А левее или правей науке неизвестно (серийность то буфера как я понимаю точно никто не указывал). А автоматом она не додумала что и как эксперт требует.

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

3. Хотя тут скорей всего просто будет переворот дат (что программер и сам может прекрасно на стадии чека).

4. На счет индивидуальности CopyBuffer() то и она на тестах ошибку выдавала (хотя реже чем КопиТайм). Да и если бы не выдавала не известно содержит она или нет внутри себя контроль ОТ ДУРАКА (уж извиняйте за сленг).

PS

5. Кроме того, даже если CopyBuffer() и возвращала бы результат при таком подходе без ошибок кто проверял что там данные копировались с права -> лево, а не как положено (прямое указания на серийность для конечных буферов я в коде не припомню)?


1.  Причем тут серийность? Каким боком она относится к этому вопросу? К тому же, как видим, CopyBuffer()  сама "додумывает". От сейрийности буфера зависит в каком порядке данные будут располагаться в буфере, а не то, какие даные будут копироваться.

2. Как минимум должно быть соответствие в работе CopyBuffer() и всех остальных Copy... 

3. Так и будем жить нараскаряку? Глядя на работу CopyBuffer() и на справку, как-то не уверен в возможности сделать однозначный вывод, чтоже правильно. Подстраиваться под баги... тоже вариант... подстроился - функции Copy... не используются вообще, используется индикатор с ценами.

4. Как видим есть у CopyBuffer(), толькто что правильно а что неправилно пока как-то не очень известно. 

5. См. п.1. 

 
Integer:

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

 

1.Не смотрите на картинку, насколько я помню дефаултное направление буферов менялось.

Попробуйте вызвать эту функцию без указания серийности конечного буфера (у Вас в эксперте этого нет как я помню).

Вернется массив где 0 значением будет самая древняя дата. таким образом без всяких указаний на серийность копируем с лева на права (как бы в справку изменения забыли внести соответствующие).

2. В описании третьего варианта четко указано - первая дата стартовая. По логике вещей всегда меньше (об обратном в справке ни слова!).

 
Interesting:

1.Не смотрите на картинку, насколько я помню дефаултное направление буферов менялось.

Попробуйте вызвать эту функцию без указания серийности конечного буфера (у Вас в эксперте этого нет как я помню).

Вернется массив где 0 значением будет самая древняя дата. таким образом без всяких указаний на серийность копируем с лева на права (как бы в справку изменения забыли внести соответствующие).

2. В описании третьего варианта четко указано - первая дата стартовая. По логике вещей всегда меньше (об обратном в справке ни слова!).

1. А куда смотреть, на потолок или в окно?

Сериность буфера, ну причем тут серийность буфера? 

2. Тогда по "логике вещей" в первом и втором варианте стартовый бар должен быть слева, а не справа как нарисовано. Определен контекст, потому "логика вещей" отменяется, а следует руководствоваться логикой определенной в контексте - стартовая дата, это дата от которой начинается отсчет, вторая дата определяет количество копируемых элементов, в данном случае левый край на графике. Еще раз напомню, о несоответствии в работе CopyBuffer и остальных Copy...

 
Integer: Еще раз напомню, о несоответствии в работе CopyBuffer и остальных Copy...


В чем заключается несоответствие? В документации все правильно сказано и рисунок верно описывает процесс копирования данных из индикаторного буфера в массив.

CopyBuffer() :

Получает в массив buffer данные указанного буфера указанного индикатора в указанном количестве.

Отсчет элементов копируемых данных (индикаторный буфер с индексом buffer_num) от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар (значение индикатора для текущего бара).

При копировании заранее неизвестного количества данных в качестве массива-приемника buffer[] желательно использовать динамический массив, так как функция CopyBuffer() старается распределить размер принимающего массива под размер копируемых данных. Если в качестве принимающего массива buffer[] выступает индикаторный буфер (массив, предварительно назначенный под хранение значений индикатора функцией SetIndexBufer()), то допускается частичное копирование. Пример можно посмотреть в пользовательском индикаторе Awesome_Oscillator.mq5 из стандартной поставки терминала.

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

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

Неважно, какое свойство имеет приемный массив - as_series=true или as_series=false, данные будут скопированы таким образом, что самый старый по времени элемент будет в начале физической памяти, отведенной под массив. Существует 3 варианта функции.

 
Rosh:

В чем заключается несоответствие? В документации все правильно сказано и рисунок верно описывает процесс копирования данных из индикаторного буфера в массив.

CopyBuffer() :


 

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

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

 

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

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

 

Насчет справки не писал, что неправильно, как раз по справке второй параметр определяет start_pose, копируются данные расположенные левее start_pos, значит при третьем варианте использования функий Copy значение втрого параметра должно быть меньше значения третьего параметра, значит правильными вариантами будут 1.2 и 2.2, однако 1.2 - не работает. Если же правильные варианты 1.2 и 2.2 - тогда несоответствие со справкой - копирование данных расположенных правее start_pos.

 

 
Integer:

 

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

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

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

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

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

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

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