Переключился с демо-счёта на реал. Там всё в порядке на мой взгляд. Функция CurTime() сегодня в воскресенье 15 января 2006 возвращает 2006.01.13 22:59, т.е вечер пятницы.
Не знаю, можно-ли в данном контексте назвать ДЦ. Пока не буду на всякий случай.
Не знаю, можно-ли в данном контексте назвать ДЦ. Пока не буду на всякий случай.
Всё само исправилось... :-)
Чесслово ничё не делал...
Чесслово ничё не делал...
Все зависит от текущего состояния подключения терминала.
В функции init() можно с таким запросто столкнуться.
В скрипте, бросаемом на график в выходные при неактивном подключении - тоже.
Если терминал не подключен никуда, или находится в состоянии переподключений между счетами или серверами, то в функции init() практически _все_ рыночное окружение неопределенное.
Именно. Рыночное окружение подкачалось и закешировалось, вот и стало работать.
Ведь в init время проверяли, не так ли?
В init нельзя заниматься анализом рыночного окружения.
Только подготовкой данных, не относящихся к рыночным данным. И ни в коем случае не вызывать из init функцию start. Иначе постоянно будут вопросы о неправильности времени, цен и графиков.
В функции 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) сразу же безотносительно наличия рыночного окружения. Это надо учитывать.
Все верно.
Скрипты, как и индикаторы, запускаются (вызывается start) сразу же безотносительно наличия рыночного окружения. Это надо учитывать.
Скрипты, как и индикаторы, запускаются (вызывается start) сразу же безотносительно наличия рыночного окружения. Это надо учитывать.
Ясно. Спасибо, Renat.
Renat,
моя очередная проблемка, скорее всего перекликается с этой темой, т.е. связана с рыночным окружением. Функция старт советника содержит такой код:
моя очередная проблемка, скорее всего перекликается с этой темой, т.е. связана с рыночным окружением. Функция старт советника содержит такой код:
if (Hour()==0) { OpenPosition(); }
И вот я уже два раза попал под раздачу лосей из-за того, что советник входит в рынок:
- первый раз в 17:21
- второй раз в 09:01
Я, разумеется, уже придумал, как это обойти. Сделаю, например, так:
if (TimeHour(Time[0])==0) { OpenPosition(); }
Но всё-таки, как заставить функцию Hour() работать правильно? Может быть надо использовать RefreshRates() или что-то другое, чего я не знаю? Подскажите, пожалуйста!
А почему бы не вывести значение Hour() в лог?
В функции start (если она вызывается штатно, а не из init ) эксперта(именно и только _эксперта_) все рыночное окружение подготовлено. Это значит, что и время должно быть верным.
В функции 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); } } //+------------------------------------------------------------------+
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Билд 186 от 14 декабря 2005.
Вопрос к разработчикам.
Это временное явление? Т.е. будет исправлено и можно игнорировать сей факт.
Это явление постоянное и нужно самому к этому приспосабливаться.