CopyClose почему ошибка?

 
В эту тему были перенесены комментарии, не относящиеся к "Ошибки, баги, вопросы".
 

Помогите разобраться с тетом на истории в MT5.

Тестирую в отладчике эксперта по XAUUSD на D1 с 01.01.2015.

В терминале история с 03.01.2011.

В OnInit() пытаюсь скопировать функцией CopyClose() 300 значений закрытия. Результат функции: -1

Кэш истории только за год и больше подгружать не хочет (Sleep и подкачки пробовал - не помогает) 

МТ5:

 

 

 текст экперта

 результат прогона в журнале агента:

 

 

Владимир 

 

Несколько замечаний:

1.Вы копируете не триста значений, а одно значение с трёхсотого элемента:

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

int  CopyClose(
   string           symbol_name,       // имя символа
   ENUM_TIMEFRAMES  timeframe,         // период
   int              start_pos,         // откуда начнем 
   int              count,             // сколько копируем
   double           close_array[]      // массив для копирования цен закрытия
   );

2. Если функция Copy**** вернула "-1" - это ещё не конец света:

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

Вот этот код позволит наглядно увидеть, когда появится история с текущей даты минус 300 элементов назад:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//---
input int start_pos=300;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   double           close_array[];
   if(CopyClose("XAUUSD",Period(),start_pos,1,close_array)==-1)
      Print(__FUNCTION__,", CopyClose error #",GetLastError());
   else
      Print(DoubleToString(close_array[0],5));
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double           close_array[];
   if(CopyClose("XAUUSD",Period(),start_pos,1,close_array)==-1)
      Print(__FUNCTION__,", CopyClose error #",GetLastError());
   else
      Print(DoubleToString(close_array[0],5));
  }
//+------------------------------------------------------------------+
Файлы:
Test.mq5  4 kb
 

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

Ошибки, баги, вопросы

Slawa, 2017.02.15 09:38

815 - это общий размер буфера. Делается предварительное распределение для всей потенциальной истории, чтобы в ходе тестирования не тратить время и ресурсы на перераспределение.

Написано же: history cache allocated for 815 bars and contains 258 bars

 
Vladimir Karputov:

Vladimir Karputov:

Несколько замечаний:

1.Вы копируете не триста значений, а одно значение с трёхсотого элемента:

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

int  CopyClose(
   string           symbol_name,       // имя символа
   ENUM_TIMEFRAMES  timeframe,         // период
   int              start_pos,         // откуда начнем 
   int              count,             // сколько копируем
   double           close_array[]      // массив для копирования цен закрытия
   );

2. Если функция Copy**** вернула "-1" - это ещё не конец света:

Вот этот код позволит наглядно увидеть, когда появится история с текущей даты минус 300 элементов назад:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//---
input int start_pos=300;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   double           close_array[];
   if(CopyClose("XAUUSD",Period(),start_pos,1,close_array)==-1)
      Print(__FUNCTION__,", CopyClose error #",GetLastError());
   else
      Print(DoubleToString(close_array[0],5));
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double           close_array[];
   if(CopyClose("XAUUSD",Period(),start_pos,1,close_array)==-1)
      Print(__FUNCTION__,", CopyClose error #",GetLastError());
   else
      Print(DoubleToString(close_array[0],5));
  }
//+------------------------------------------------------------------+

Спасибо за ответ и за код.

Запустил ваш код. Ничего не поменялось (скрин ниже). Мне нужно значение "300 дней назад" на первый бар тестирования. Их нет и на четвертый бар.

 

 
Vladimir Mazur:

Спасибо за ответ и за код.

Запустил ваш код. Ничего не поменялось (скрин ниже). Мне нужно значение "300 дней назад" на первый бар тестирования. Их нет и на четвертый бар.

 

Абсолютно всё правильно. И не нужно вырубать программму - дождитесь когда история будет копироваться без ошибки. Затем сравните даты, начальные значения тестера (когда тестер сообщает сколько баров есть и глубина истории). В общем немного подумайте :)
 
Vladimir Karputov:
Абсолютно всё правильно. И не нужно вырубать программму - дождитесь когда история будет копироваться без ошибки. Затем сравните даты, начальные значения тестера (когда тестер сообщает сколько баров есть и глубина истории). В общем немного подумайте :)
Ок. Запущу тестер и посмотрю, что будет.
 
Vladimir Karputov:
Абсолютно всё правильно. И не нужно вырубать программму - дождитесь когда история будет копироваться без ошибки. Затем сравните даты, начальные значения тестера (когда тестер сообщает сколько баров есть и глубина истории). В общем немного подумайте :)
Пока считает, поясните, если есть возможность. У терминала данные с 2011 года. По этим данным он вывел график - 2011 года по сей день. Я тестирую с 2015 года и у тестера нет данных! Я понимаю, если данные нужно грузить с сервера, но когда они есть в терминале и не используются - это я понять не могу.

 
Смотрите на первые строки тестера в визуальном режиме - он пишет с КАКОЙ даты есть бар. Это означает, что ранее ЭТОЙ ДАТЫ вакуум - ничего нет. И так как Вы запрашиваете цену бара, который от текущего времени уходит вдаль истории на 300 баров, то сами подумайте: когда Вы сможете получить первый раз цену вместо ошибки? Наверное это будет так: ДАТА с которой есть бары (дату пишет тестер) + 300 баров.
 

Особенно вот на эти строки тестера:

XAUUSD,Daily: history cache allocated for 552 bars and contains 258 bars from 2015.01.02 00:00 to 2015.12.31 00:00
XAUUSD,Daily: history begins from 2015.01.02 00:00


И это при периоде тестирования с 2016.01.01 - по сегодня.

 
Vladimir Karputov:
Смотрите на первые строки тестера в визуальном режиме - он пишет с КАКОЙ даты есть бар. Это означает, что ранее ЭТОЙ ДАТЫ вакуум - ничего нет. И так как Вы запрашиваете цену бара, который от текущего времени уходит вдаль истории на 300 баров, то сами подумайте: когда Вы сможете получить первый раз цену вместо ошибки? Наверное это будет так: ДАТА с которой есть бары (дату пишет тестер) + 300 баров.
Все так. Он и пишет, что у него в кэше 258 баров и эти данные с за предыдущий год, т.е. С 01.01.2014. Если сдвинуть начало те тирования с  2015 на 2014 год, тестер чудным образом наход данные за 2013 год, но примерно те же 258 баров. Вопро. В этом кэше, в ограничении непонятно где установленном. Как его обойти - непонятно.

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