Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 767

 
tuner:

Понятное дело что сравнение идет по количеству секунд, прошедших с 70-го года, но в этом количестве секунд учтено все - и дата и время.

Просто приведу пример, по сути упрощение возникшей недавно у меня проблемы.

Задача: при наступлении пятницы расчитать время (datetime) окончания торговли в этот день с учетом строковой переменной "21:30".

У меня изначально было такое решение:

 А теперь прикол: указанный в коде принт выскочит в пятницу, но не после 21:30, а в 00:00 на первом тике.

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

В тестере же будет все ок и принт выскочит как и должен в пятницу после 21:30. Ну разве не путаница?

Конечно путаница. Только путаница в твоей голове. TimeToString("21:30") будет давать текущую дату от 21:30:00 до 21:29:59 следующего дня. Я поправлю комментарии в твоём коде.

datetime EndTrading;

if(TimeDayOfWeek(TimeCurrent())==5)     // если сейчас пятница, от текущего времени. Наступит когда по времени сервера будет 00:00
  EndTrading=StringToTime("21:30");     // А тут в 00:00 устанавливается четверг 21:30 потому, что это время пятницы ещё далеко.

if(TimeDayOfWeek(TimeCurrent())==5)     // если настала пятница
  if(TimeCurrent()>EndTrading)          // А тут условие если(текущее время больше чем четверг 21:30)
   {
    Print("EndTrading = ", TimeToString(EndTrading)); // Посмотри что будет напечатано.
   }


А вот такой код будет работать правильно

if(TimeDayOfWeek(TimeCurrent()) == 5 && TimeCurrent() >= StringToTime("21:30"))
Print("Настала пятница и текущее время больше чем 21:30");
 
ikatsko:
На одном ноутбуке стоИт два терминала МТ4: один с 4-мя знаками после запятой, второй - с 5-тью знаками. За одно и то же время трафик на первом 105/0 kb, на втором  3450/0 kb. Первый грухит процессор на 6%, второй - на 39%. В чем проблема? Это вообще норма?
да.
 

AlexeyVik 

Изменил дату у себя на компе на 2000 год.

запустил этот скрипт:

input string time="21:30";

Comment("TimeCurrent() = ",TimeCurrent(),"\n",
"TimeLocal() = ",TimeLocal(),"\n",
"StringToTime(",time,") = ",StringToTime(time));

 и получил:

 

следовательно функция StringToTime() берет дату с локального компа 

 
tuner:

AlexeyVik 

Изменил дату у себя на компе на 2000 год.

запустил этот скрипт:

 и получил:

 

следовательно функция StringToTime() берет дату с локального компа 

Ну и что??? Пусть хоть с луны берёт, главное по этому времени "от и до" прошло XXX секунд и это полученное целочисленное число сравниваем с нужным нам количеством секунд прошедших от 01.01.1970 нужного нам времени.

Ты лучше проверь эту строку

if(TimeDayOfWeek(TimeCurrent()) == 5 && TimeCurrent() >= StringToTime("21:30"))

в том месте где у тебя была проблема. Сегодня как-раз пятница.

 
AlexeyVik:

Ты лучше проверь эту строку 

в том месте где у тебя была проблема. Сегодня как-раз пятница.

я проверил, если на локальном компе дата меньше чем дата брокера, то принты есть,

а если на локальном компе дата больше чем дата брокера, то принтов нету

при этом время проверял то, которое уже точно прошло, то есть "11:30" 

в первом случае TimeCurrent() сравнивается с 2014.11.06 11:30, а во втором случае с 2014.11.08 11:30

PS поправил выделенное 

 

 

if(TimeDayOfWeek(TimeCurrent())==5)      // если сейчас пятница, от текущего времени. Наступит когда по времени сервера будет 00:00
   EndTrading=StringToTime("21:30");     // А тут в 00:00 устанавливается четверг 21:30 потому, что это время пятницы ещё далеко.

первая строка понятна, комментарий ко второй строке - нет.

Почему до пятницы далеко, когда она уже наступила? Ведь вторая строка исполняется только если наступила пятница.  

 
tuner:

я проверил, если на локальном компе дата меньше чем дата брокера, то принты есть,

а если на локальном компе дата больше чем дата брокера, то принтов нету

при этом время проверял то, которое уже точно прошло, то есть "11:30" 

в первом случае TimeCurrent() сравнивается с 2014.11.06 11:30, а во втором случае с 2014.11.08 11:30

PS поправил выделенное 


Ну вот у меня локальное время больше серверного на 1 час.

Этот скрипт

   datetime time_begin;
    time_begin = StringToTime("21:30");
    Comment("Текущее локальное время ", TimeLocal(), " ", TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS), "\n"
          , "Текущее время сервера    ", TimeCurrent(), " ", TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS), "\n"
          , "Сегодня 21:30 по TimeLocal будет через    ", time_begin-TimeLocal(), " секунд или ", 
           TimeToString(time_begin-TimeLocal(), TIME_MINUTES|TIME_SECONDS), "\n"
          , "Сегодня 21:30 по TimeCurrent будет через ", time_begin-TimeCurrent(), " секунд или ", 
           TimeToString(time_begin-TimeCurrent(), TIME_MINUTES|TIME_SECONDS), "\n"
          );


выводит такие значения

Сначала количество секунд прошедших с 01.01.1970 до указанного времени, а потом время в привычном нам виде.


Исходя из этого объясни что тебя смущает в этих значениях?


Да. Во втором комментарии я чуток не о том думал.

 
TheXpe
TheXpert:
да.
Спасибо. Краткость - сестра таланта! 
 

Здравствуйте.

Есть такая задача. (не могу прикрутить к тику)

Если сработал отложенный ордер {то...}

В советнике для подсчета ордеров использую Terminal.mqh.

Терминал // Mas_Tip[0] открытые Buy 

// если количество  ордеров Buy увеличилось на 1 то...

if (Mas_Tip[0]+1) 

{

функция 

 Все работает. Но срабатывает на каждом следующем тике.

Как прикрепить это дело к тику? А потом сравнить значение на предыдущем тике и на данном тике. 

 
AlexeyVik:

Ну вот у меня локальное время больше серверного на 1 час.

Исходя из этого объясни что тебя смущает в этих значениях?

В этих значениях ничего не смущает, там все правильно, но речь то не об этом.

Проблема конкретно с пятницей не актуальна если у тебя время локальное больше чем время брокера на Х часов.

Но представь если у тебя на локальном компе не +1, а -1 час разница с брокером.

И есть это простое условие:

if(TimeDayOfWeek(TimeCurrent()) == 5 && TimeCurrent() >= StringToTime("21:30"))
   Print("Настала пятница и время больше чем 21:30");

В этом случае:

1. у брокера наступит первый тик пятницы, например сегодняшний тик, у которого время 2014.11.07 00:00

2. берем количество секунд, прошедших с 01.01.1970 00:00 до момента рассматриваемого тика, то есть до 2014.11.07 00:00

3. берем количество секунд, прошедших с 01.01.1970 00:00 до 06.11.2014 21:30 (это именно вчерашняя дата, т.к. берется время локального компа, у которого на момент рассматриваемого тика не пятница, а четверг, то есть 6 число, а если быть еще точнее, то 2014.11.06 23:00, разница в 1 час)

Вуаля, количество секунд в пункте 2 больше чем в пункте 3.

А значит в первый пятничный тик исполнится указанный в коде принт, хотя если бы функция StringToTime() брала дату с сервера брокера, то все бы сработало как и задумано, принт выскочил бы в пятницу только после того, как время перевалит за 21:30

 
Leonid123456:

Здравствуйте.

Есть такая задача. (не могу прикрутить к тику)

Если сработал отложенный ордер {то...}

В советнике для подсчета ордеров использую Terminal.mqh.

Терминал // Mas_Tip[0] открытые Buy 

// если количество  ордеров Buy увеличилось на 1 то...

if (Mas_Tip[0]+1) 

{

функция 

 Все работает. Но срабатывает на каждом следующем тике.

Как прикрепить это дело к тику? А потом сравнить значение на предыдущем тике и на данном тике. 

А выделенную строку можешь перевести на наш человеческий язык? Что должно быть и что получается при выполнении этой строки...