Значение CurTime() в выходной день

 
С удивлением обнаружил, что функция CurTime() в выходной день возвращает 1970.01.01 00:00.
Билд 186 от 14 декабря 2005.

Вопрос к разработчикам.
Это временное явление? Т.е. будет исправлено и можно игнорировать сей факт.
Это явление постоянное и нужно самому к этому приспосабливаться.
 
Переключился с демо-счёта на реал. Там всё в порядке на мой взгляд. Функция CurTime() сегодня в воскресенье 15 января 2006 возвращает 2006.01.13 22:59, т.е вечер пятницы.

Не знаю, можно-ли в данном контексте назвать ДЦ. Пока не буду на всякий случай.
 
Всё само исправилось... :-)
Чесслово ничё не делал...
 
Все зависит от текущего состояния подключения терминала.
В функции init() можно с таким запросто столкнуться.
В скрипте, бросаемом на график в выходные при неактивном подключении - тоже.

Если терминал не подключен никуда, или находится в состоянии переподключений между счетами или серверами, то в функции init() практически _все_ рыночное окружение неопределенное.

Всё само исправилось... :-)
Чесслово ничё не делал...

Именно. Рыночное окружение подкачалось и закешировалось, вот и стало работать.
Ведь в init время проверяли, не так ли?

В init нельзя заниматься анализом рыночного окружения.
Только подготовкой данных, не относящихся к рыночным данным. И ни в коем случае не вызывать из init функцию start. Иначе постоянно будут вопросы о неправильности времени, цен и графиков.
 
Ведь в init время проверяли, не так ли?

Вроде бы в starte. Прикладываю полный код.
//+------------------------------------------------------------------+
//|                                                   i-Sessions.mq4 |
//|                                           Ким Игорь В. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//|  16.11.2005  Индикатор торговых сессий                           |
//+------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link      "http://www.kimiv.ru"

#property indicator_chart_window

//------- Внешние параметры индикатора -------------------------------
extern int    NumberOfDays = 50;        // Количество дней
extern string AsiaBegin    = "01:00";   // Открытие азиатской сессии
extern string AsiaEnd      = "10:00";   // Закрытие азиатской сессии
extern color  AsiaColor    = Goldenrod; // Цвет азиатской сессии
extern string EurBegin     = "07:00";   // Открытие европейской сессии
extern string EurEnd       = "16:00";   // Закрытие европейской сессии
extern color  EurColor     = Tan;       // Цвет европейской сессии
extern string USABegin     = "14:00";   // Открытие американской сессии
extern string USAEnd       = "23:00";   // Закрытие американской сессии
extern color  USAColor     = Pink;      // Цвет американской сессии


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void init() {
  DeleteObjects();
  for (int i=0; i<NumberOfDays; i++) {
    CreateObjects("AS"+i, AsiaColor);
    CreateObjects("EU"+i, EurColor);
    CreateObjects("US"+i, USAColor);
  }
  Comment("");
}

//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
void deinit() {
  DeleteObjects();
  Comment("");
}

//+------------------------------------------------------------------+
//| Создание объектов индикатора                                     |
//| Параметры:                                                       |
//|   no - наименование объекта                                      |
//|   cl - цвет объекта                                              |
//+------------------------------------------------------------------+
void CreateObjects(string no, color cl) {
  ObjectCreate(no, OBJ_RECTANGLE, 0, 0,0, 0,0);
  ObjectSet(no, OBJPROP_STYLE, STYLE_SOLID);
  ObjectSet(no, OBJPROP_COLOR, cl);
  ObjectSet(no, OBJPROP_BACK, True);
}

//+------------------------------------------------------------------+
//| Удаление объектов индикатора                                     |
//+------------------------------------------------------------------+
void DeleteObjects() {
  for (int i=0; i<NumberOfDays; i++) {
    ObjectDelete("AS"+i);
    ObjectDelete("EU"+i);
    ObjectDelete("US"+i);
  }
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
void start() {
  datetime dt=CurTime();
Print(TimeToStr(dt));           //          <- вот здесь проверял
  for (int i=0; i<NumberOfDays; i++) {
    DrawObjects(dt, "AS"+i, AsiaBegin, AsiaEnd);
    DrawObjects(dt, "EU"+i, EurBegin, EurEnd);
    DrawObjects(dt, "US"+i, USABegin, USAEnd);
    dt=decDateTradeDay(dt);
    while (TimeDayOfWeek(dt)>5) dt=decDateTradeDay(dt);
  }
}

//+------------------------------------------------------------------+
//| Прорисовка объектов на графике                                   |
//| Параметры:                                                       |
//|   dt - дата торгового дня                                        |
//|   no - наименование объекта                                      |
//|   tb - время начала сессии                                       |
//|   te - время окончания сессии                                    |
//+------------------------------------------------------------------+
void DrawObjects(datetime dt, string no, string tb, string te) {
  datetime t1, t2;
  double   p1, p2;
  int      b1, b2;

  t1=StrToTime(TimeToStr(dt, TIME_DATE)+" "+tb);
  t2=StrToTime(TimeToStr(dt, TIME_DATE)+" "+te);
  b1=iBarShift(NULL, 0, t1);
  b2=iBarShift(NULL, 0, t2);
  p1=High[Highest(NULL, 0, MODE_HIGH, b1-b2, b2)];
  p2=Low [Lowest (NULL, 0, MODE_LOW , b1-b2, b2)];
  ObjectSet(no, OBJPROP_TIME1 , t1);
  ObjectSet(no, OBJPROP_PRICE1, p1);
  ObjectSet(no, OBJPROP_TIME2 , t2);
  ObjectSet(no, OBJPROP_PRICE2, p2);
}

//+------------------------------------------------------------------+
//| Уменьшение даты на один торговый день                            |
//| Параметры:                                                       |
//|   dt - дата торгового дня                                        |
//+------------------------------------------------------------------+
datetime decDateTradeDay (datetime dt) {
  int ty=TimeYear(dt);
  int tm=TimeMonth(dt);
  int td=TimeDay(dt);
  int th=TimeHour(dt);
  int ti=TimeMinute(dt);

  td--;
  if (td==0) {
    tm--;
    if (tm==0) {
      ty--;
      tm=12;
    }
    if (tm==1 || tm==3 || tm==5 || tm==7 || tm==8 || tm==10 || tm==12) td=31;
    if (tm==2) if (MathMod(ty, 4)==0) td=29; else td=28;
    if (tm==4 || tm==6 || tm==9 || tm==11) td=30;
  }
  return(StrToTime(ty+"."+tm+"."+td+" "+th+":"+ti));
}
//+------------------------------------------------------------------+
 
Все верно.
Скрипты, как и индикаторы, запускаются (вызывается start) сразу же безотносительно наличия рыночного окружения. Это надо учитывать.
 
Все верно.
Скрипты, как и индикаторы, запускаются (вызывается start) сразу же безотносительно наличия рыночного окружения. Это надо учитывать.

Ясно. Спасибо, Renat.
 
Renat,
моя очередная проблемка, скорее всего перекликается с этой темой, т.е. связана с рыночным окружением. Функция старт советника содержит такой код:
if (Hour()==0)
{
  OpenPosition();
}


И вот я уже два раза попал под раздачу лосей из-за того, что советник входит в рынок:
- первый раз в 17:21
- второй раз в 09:01

Я, разумеется, уже придумал, как это обойти. Сделаю, например, так:

if (TimeHour(Time[0])==0)
{
  OpenPosition();
}



Но всё-таки, как заставить функцию Hour() работать правильно? Может быть надо использовать RefreshRates() или что-то другое, чего я не знаю? Подскажите, пожалуйста!

 
А почему бы не вывести значение Hour() в лог?
В функции start (если она вызывается штатно, а не из init ) эксперта(именно и только _эксперта_) все рыночное окружение подготовлено. Это значит, что и время должно быть верным.
 
А почему бы не вывести значение Hour() в лог?

Хорошо. Сделаю тестового советника и повешу на демку. Недели за две, наверняка, что-нить вылезет

В функции start (если она вызывается штатно, а не из init ) эксперта(именно и только _эксперта_) все рыночное окружение подготовлено. Это значит, что и время должно быть верным.

Да, функция start вызывается в советнике штатно, а НЕ из init. Более того, функции init как таковой в советнике вообще нет. И deinit тоже нет. Отсутствие этих функций могло как-то повлиять на формирование рыночного окружения?
 
Для тестирования функции Hour() сделал такого советника

//+------------------------------------------------------------------+
//|                                                   e-TestHour.mq4 |
//|                                           Ким Игорь В. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//|    27.12.2005  Шаблон советника                                  |
//|  для входов с рынка по сигналам и для тестирования на истории.   |
//+------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link      "http://www.kimiv.ru"

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start()
{
  if (Hour()==0)
  {
    WritingLineInFile("e-TestHour", TimeToStr(CurTime())+" "+Hour());
  }
}

//+------------------------------------------------------------------+
//| Запись строки в файл                                             |
//+------------------------------------------------------------------+
void WritingLineInFile(string FileName, string text)
{
  int file_handle=FileOpen(FileName, FILE_READ|FILE_WRITE, " ");

	if (file_handle>0)
	{
		FileSeek(file_handle, 0, SEEK_END);
		FileWrite(file_handle, text);
		FileClose(file_handle);
	}
}
//+------------------------------------------------------------------+