Не корректное открытие ордеров советником.

 

Всем привет! 

Сложилась такая ситуация. В советнике время начала торговли стоит 23.00 настройки для брокера с GMT+2 по зимнему времени. У сов меня стоит на VPS с временем VPS GMT+2 на данный момент ( летом) Сов работает корректно по времени терминала ( как и должно быть) 

Но у двух человек, сов ( с теми же настройками как и у меня) стоит на домашнем компьютере в часовом поясе GMT+8 ( на данный момент) и сделки открываются раньше. примерно с 19 часов по терминальному времени ( хотя в настройках всё те же 23.00 и терминальное время GMT+3 (сейчас, летом)

С чем это может быть связано и как исправить? Код функции расчёта рабочего времени прилагаю. Всем откликнувшимся заранее спасибо.

//+------------------------------------------------------------------+
bool Work_time()
{
          int day_week      = DayOfWeek();
   static int last_day_week = DayOfWeek();
   
   if (Open_Friday == false && day_week == 5) return(false);
   
   string  strt_h=IntegerToString(Start_hour), strt_m=IntegerToString(Start_min),
               stp_h=IntegerToString(Stop_hour), stp_m=IntegerToString(Stop_min); 
   datetime time_current=TimeCurrent(), start_1,stop_1;

   if (Open_Night_Monday == false && (day_week == 0  || (day_week == 1 &&
       time_current < StringToTime( TimeToString(TimeCurrent(),TIME_DATE)+" "+"09:00")))  ) {  
     return(false); 
   }
   if (Close_Friday_Time != "00:00"  && day_week == 5 &&
       time_current >= StringToTime(TimeToString(TimeCurrent(),TIME_DATE)+" "+Close_Friday_Time)) { 
     return(false);
   }
   if (time_current <= SLoss_ord + No_Open_after_SLoss_hour * 3600) { 
     return(false);
   }    
      if (StringLen(strt_h) == 1) strt_h = "0" + strt_h;
      if (StringLen(strt_m) == 1) strt_m = "0" + strt_m;
      if (StringLen(stp_h) == 1)  stp_h  = "0" + stp_h;
      if (StringLen(stp_m) == 1)  stp_m  = "0" + stp_m;
          strt_h = strt_h + ":" + strt_m;
          stp_h  = stp_h  + ":" + stp_m;
              start_1 = StringToTime(strt_h);
              stop_1  = StringToTime(stp_h);
              // Трендовый фильтр устанавливает напрвление 1 раз в день в Start_1
   if (Trand_filter){
      if (time_current == stop_1){
         Sig_Trand = 3;
      }
      if (time_current == start_1 && last_day_week != day_week){
        last_day_week = day_week;
        int  shift_1 = iBarShift(NULL,PERIOD_H1,start_1),
             shift_2 = iBarShift(NULL,PERIOD_H1,StringToTime("08:00"));
        Trand_Filter(shift_1,shift_2);
      }  
   }else { if (last_day_week != day_week){
                 last_day_week = day_week; Sig_Trand = 3;
           }
   }
        if( start_1==stop_1 || 
                    ((start_1<stop_1 && (time_current<start_1 || time_current>stop_1))
                  || (start_1>stop_1 && (time_current<start_1 && time_current>stop_1))) )
     return(false); 

return(true); 
}
//+------------------------------------------------------------------+
 
Vasiliy Kolesov:

Всем привет! 

Сложилась такая ситуация. В советнике время начала торговли стоит 23.00 настройки для брокера с GMT+2 по зимнему времени. У сов меня стоит на VPS с временем VPS GMT+2 на данный момент ( летом) Сов работает корректно по времени терминала ( как и должно быть) 

Но у двух человек, сов ( с теми же настройками как и у меня) стоит на домашнем компьютере в часовом поясе GMT+8 ( на данный момент) и сделки открываются раньше. примерно с 19 часов по терминальному времени ( хотя в настройках всё те же 23.00 и терминальное время GMT+3 (сейчас, летом)

С чем это может быть связано и как исправить? Код функции расчёта рабочего времени прилагаю. Всем откликнувшимся заранее спасибо.

Как правильно вставить код.

 
Vladimir Karputov:

Как правильно вставить код.

Спасибо. Сейчас переделаю.

 
Что то не особо много желающих помочь.....
 

Как вариант: ребята из другого пояса ставят Start_hour и Stop_hour под свое локальное время, не заморачиваясь про серверное время.

Хотя есть вопросы и к коду. Интересно, какие значения получают:

start_1 = StringToTime(strt_h);
stop_1  = StringToTime(stp_h);

StringToTime("08:00")

 
Mislaid:

Как вариант: ребята из другого пояса ставят Start_hour и Stop_hour под свое локальное время, не заморачиваясь про серверное время.

Хотя есть вопросы и к коду. Интересно, какие значения получают:

start_1 = StringToTime(strt_h);
stop_1  = StringToTime(stp_h);

StringToTime("08:00")

Не, настройки ставят дефолтные, я проверял. 

По коду сам не особо понимаю что к чему, не я писал. А человека, что писал эту функцию пока нет. Второй день разобраться не могу.

Вот эти наверно


string  strt_h=IntegerToString(Start_hour), strt_m=IntegerToString(Start_min),
               stp_h=IntegerToString(Stop_hour), stp_m=IntegerToString(Stop_min); 
   datetime time_current=TimeCurrent(), start_1,stop_1;
 

Может не заморачиваться и применить:

https://www.mql5.com/ru/docs/dateandtime/timegmt

Документация по MQL5: Дата и время / TimeGMT
Документация по MQL5: Дата и время / TimeGMT
  • www.mql5.com
Возвращает время GMT, которое вычисляется с учётом перехода на зимнее или летнее время по локальному времени компьютера, на котором запущен клиентский терминал. Существует 2 варианта функции.
 
Renat Akhtyamov:

Может не заморачиваться и применить:

https://www.mql5.com/ru/docs/dateandtime/timegmt

Спасибо , попробую.

 
При чем тут какое время у вас дома или на ВПС? Ориентируйтесь на терминальное время
 
Evgeniy Zhdan:
При чем тут какое время у вас дома или на ВПС? Ориентируйтесь на терминальное время

В том то и весь вопрос. Домашнее время вообще не должно влиять на торговлю. Так изначально всё и задумывалось. и тут вдруг, через два года использования советника выяснилось, что на компьютере, находящемся в тайм зоне GMT+8 , у двух разных человек с двумя разными брокерами, сов начинает работать раньше на 4 часа, чес установлено в настройках. Хотя у меня время сервера тоже отличается на 1 час от терминального, но всё работает нормально, по терминальному времени.

Используется же функция https://www.mql5.com/ru/docs/dateandtime/timecurrent ......Как у них может влиять часовой пояс??? 
Документация по MQL5: Дата и время / TimeCurrent
Документация по MQL5: Дата и время / TimeCurrent
  • www.mql5.com
Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов. В обработчике OnTick() данная функция вернет время пришедшего обрабатываемого тика. В других случаях (например, вызов в обработчиках OnInit(), OnDeinit(), OnTimer() и так далее) это –...
 

Смотрю по коду - всё должно работать правильно.

Вот здесь задаётся переменная 

string  strt_h=IntegerToString(Start_hour), strt_m=IntegerToString(Start_min),
               stp_h=IntegerToString(Stop_hour), stp_m=IntegerToString(Stop_min); 
   datetime time_current=TimeCurrent(), start_1,stop_1;


Вот здесь присваиваются значения

start_1 = StringToTime(strt_h);
              stop_1  = StringToTime(stp_h);


здесь они используются, сравниваясь с переменной time_current, значение которой взято из функции TimeCurrent()

 if( start_1==stop_1 || 
                    ((start_1<stop_1 && (time_current<start_1 || time_current>stop_1))
                  || (start_1>stop_1 && (time_current<start_1 && time_current>stop_1))) )
     return(false); 


Как может повлиять время компьютера на время открытия сделок? 

Какие ещё есть варианты?

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