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

 
tuner:

Не сразу заметил ответ. Ну если честно я не совсем понял что ты имеешь в виду, утверждая что в этом нет путаницы.

То есть как "не важно по какому времени функция StringToTime() отсчитывает прошедшие секунды"?

Функция берет по сути вообще левую дату  (я считаю что дата локального ПК - левая) и сравнивает с ней текущее время сервера брокера, почему это может быть не важно? 

Из приведенного скрина коммент говорит о том что время на твоем локальном компе опережает время брокера на 1 час, то есть сдвиг по GMT больше. Если бы он был на X часов меньше, то было бы критично, как в случае о котором я писал, про пятницу.

А по поводу окончания времени торговли. Я полагаю что для функции StringToTime() не должно иметь значение когда брокер заканчивает торговый день или неделю... 

У меня нет другого объяснения.

Если сейчас в Москве 11:40, то от 01.01.1970 до текущего времени прошло XXX секунд.

Когда в Лондоне, к примеру, будет 11:40 то количество секунд будет такое-же как и в Москве сейчас... Только потому, что 01.01.1970 в Лондоне было на столько-же позже на сколько отличается текущее время. В сравнение идёт не указанное время, а только количество прошедших секунд.

Попробуй сам написать формулу расчёта количества секунд от 01.01.1970 00:00:00

Для короткого промежутка времени будет такая формула. От начала текущего месяца прошло 6*24*60*60 + 11*60*60 + 59*60 + текущее значение секунд по часам на которые ты смотришь.

 

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

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

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

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

datetime EndTrading;

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

if(TimeDayOfWeek(TimeCurrent())==5)     // если настала пятница
  if(TimeCurrent()>EndTrading)          // и время удовлетворяет условию
    Print("Настала пятница и текущее время больше чем 21:30");

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

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

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

 
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) 

{

функция 

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

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

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