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

 
Rosh:
Действительно, здесь есть какая-то путаница. Разберемся, спасибо за сообщение.

 

Спасибо:)

 

 
Rosh:
Действительно, здесь есть какая-то путаница. Разберемся, спасибо за сообщение.

Если в обоих случаях приводить 0 к типу datetime, то копирование с помощьюCopyBuffer() работает. Таким образом, не имеет значение в каком порядке передаются дата начала и дата конца при использовании третьего варианта вызова.

   double values[];
   int copiedBuffer=CopyBuffer(handle,0,TimeCurrent(),(datetime)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());
 
Integer:

 

Спасибо:)

В общем, ошибки нет по CopyBuffer(). Используйте явное приведение типов для правильного вызова нужного вариант функции CopyBuffer().
Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Основы языка / Типы данных / Приведение типов - Документация по MQL5
 
Interesting:

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

Тем не менее, оба варианта работают. Не забывайте явно приводить второй параметр к типу datetime - тогда будет использоваться именно третья форма вызова.
 
Rosh:
Тем не менее, оба вариант работают. Не забывайте явно приводить второй параметр к типу datetime - тогда будет использоваться именно третья форма вызова.
Rosh:
В общем, ошибки нет по CopyBuffer(). Используйте явное приведение типов для правильного вызова нужного вариант функции CopyBuffer().

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

Если делаете проверку ошибок и защиту (а мне кажется что это оно и есть в КопиБуфер) так делайте тогда везде.

 
Rosh:
В общем, ошибки нет по CopyBuffer().

 

По CopyBuffer() нет ошибки, по всем остальным функциям Copy - есть что-то не то.

Они работают при таком порядке параметров определяющих диапазон:

(datetime)0,TimeCurrent()

а при таком - нет:

TimeCurrent(),(datetime)0

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

(datetime)0,TimeCurrent()

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

TimeCurrent(),(datetime)0

 но он не работает у всех функций кроме CopyBuffer().

 

 

 
Interesting:

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

Если делаете проверку ошибок и защиту (а мне кажется что это оно и есть в КопиБуфер) так делайте тогда везде.

Везде работает одинаково. Вот смотрите, если запросить правильно - 1 значение со стартовой позиции равной TimeCurrent(), то все работает правильно.

//+------------------------------------------------------------------+
//|                                                     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[])
  {
//---

   datetime mytimes[];
   int copiedTime=CopyTime(NULL,PERIOD_CURRENT,TimeCurrent(),1,mytimes);  // запрашиваем одно значение и получаем его 
   PrintFormat("1. CopyTime(handle,0,TimeCurrent(),0,mytimes)=%d",copiedTime);
   PrintFormat("Error=%d",GetLastError());
   
   ResetLastError();
   copiedTime=CopyTime(_Symbol,PERIOD_CURRENT,(datetime) 0,TimeCurrent(),mytimes);
   PrintFormat("2. CopyBuffer(handle,0,(datetime) 0,TimeCurrent()=%d",copiedTime);
   PrintFormat("Error=%d",GetLastError());

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

Результат:


Если же указать вместо единицы 0, то ничего не получите. Логично ведь?

 
Rosh:

Везде работает одинаково. Вот смотрите, если запросить правильно - 1 значение со стартовой позиции равной TimeCurrent(), то все работает правильно.

Результат:


Если же указать вместо единицы 0, то ничего не получите. Логично ведь?

Если же четвертый параметр функции является типом datetime, то применяется третий вариант вызова

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

int  CopyTime(
   string           symbol_name,     // имя символа
   ENUM_TIMEFRAMES  timeframe,       // период
   datetime         start_time,      // с какой даты
   datetime         stop_time,       // по какую дату
   datetime         time_array[]     // массив для копирования времени открытия
   );

Для нее не важен порядок указания начала и конца интервала, компилятор понимает оба варианта.

//+------------------------------------------------------------------+
//|                                                     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[])
  {
//---

   datetime mytimes[];
   int copiedTime=CopyTime(NULL,PERIOD_CURRENT,TimeCurrent(),(datetime)0,mytimes);
   PrintFormat("1. CopyTime(handle,0,TimeCurrent(),0,mytimes)=%d",copiedTime);
   PrintFormat("Error=%d",GetLastError());

   ResetLastError();
   copiedTime=CopyTime(_Symbol,PERIOD_CURRENT,(datetime)0,TimeCurrent(),mytimes);
   PrintFormat("2. CopyBuffer(handle,0,(datetime) 0,TimeCurrent()=%d",copiedTime);
   PrintFormat("Error=%d",GetLastError());

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

Результат:


Должен признаться, в какой-то момент я и сам запутался из-за пропущенного приведения типов..


 

Rosh:

Должен признаться, в какой-то момент я и сам запутался из-за пропущенного приведения типов..


Ну уж если Вы запутались...