Странное поведение тестера стратегий MT5

 

Всем привет. Столкнулся с простой (наверное, лузерской) проблемой.

Имеем внешние параметры:

sinput string t="Время работы";
input int hStart = 0;//Час начала работы
input int mStart = 0;//Минуты начала
input int hEnd = 23;//Час окончания работы
input int mEnd = 59;//Минуты окончания

MqlDateTime mqldt;

В OnTick():

   TimeCurrent(mqldt);
   bool l = time(mqldt.hour,mqldt.min);
   Comment(l);

Функция time выглядит так:

bool time(int hourCurrent,int minCurrent)
  {

   if(hStart<hEnd)
     {

      if((hourCurrent>=hStart && minCurrent>=mStart) && (hourCurrent<=hEnd && minCurrent<=mEnd))
        {
         return(true);
        }
     }
   if(hStart>=hEnd)
     {
      if((hourCurrent>=hStart && minCurrent>=mStart) || (hourCurrent<=hEnd && minCurrent<=mEnd)) 
        {
         return(true);
        }
     }
   return(false);
  }

Проблема в том, что эта функция в тестере стратегий всегда возвращает false. Иногда, на долю секунды Коммент печатает true.

Ставлю на демо-график - вроде все нормально, изменяю настройки времени, когда надо true, когда условия не выполняются, то false.

Как сделать, чтобы в тестере стратегий это тоже заработало?

Благодарствую заранее

 
Evgeniy Zhdan:

Всем привет. Столкнулся с простой (наверное, лузерской) проблемой.

Имеем внешние параметры:

В OnTick():

Функция time выглядит так:

Проблема в том, что эта функция в тестере стратегий всегда возвращает false. Иногда, на долю секунды Коммент печатает true.

Ставлю на демо-график - вроде все нормально, изменяю настройки времени, когда надо true, когда условия не выполняются, то false.

Как сделать, чтобы в тестере стратегий это тоже заработало?

Благодарствую заранее

А Вы в отладке сделайте остановку на строке

   TimeCurrent(mqldt);
   bool l = time(mqldt.hour,mqldt.min);
   Comment(l);

и добавьте наблюдение для mqldt.sec. Посмотрите с каким шагом идут секунды.


А после этого запустите отладку в режиме "Каждый тик на основе реальных тиков" ...

 

попробуйте мою

   string  CloseHours=DoubleToString(CloseHour,0);
   string  CloseMinutes=DoubleToString(CloseMinute,0);
   string  OpenHours=DoubleToString(OpenHour,0);
   string  OpenMinutes=DoubleToString(OpenMinute,0);



      //   торговать. Если удовлетворяет условиям
      if(StringToTime(TimeToString(TimeCurrent(),TIME_DATE)+" "+CloseHours+":"+CloseMinutes)>StringToTime(TimeToString(TimeCurrent(),TIME_DATE)+" "+OpenHours+":"+OpenMinutes))
        {
         if(TimeCurrent()<StringToTime(TimeToString(TimeCurrent(),TIME_DATE)+" "+CloseHours+":"+CloseMinutes) && TimeCurrent()>=StringToTime(TimeToString(TimeCurrent(),TIME_DATE)+" "+OpenHours+":"+OpenMinutes)) //
            TradingTime=true;
        }
      if(StringToTime(TimeToString(TimeCurrent(),TIME_DATE)+" "+CloseHours+":"+CloseMinutes)<StringToTime(TimeToString(TimeCurrent(),TIME_DATE)+" "+OpenHours+":"+OpenMinutes))
        {
         if(TimeCurrent()<StringToTime(TimeToString(TimeCurrent(),TIME_DATE)+" "+CloseHours+":"+CloseMinutes) || TimeCurrent()>=StringToTime(TimeToString(TimeCurrent(),TIME_DATE)+" "+OpenHours+":"+OpenMinutes)) //
            TradingTime=true;
        }


параметры:

input string periods4="======  Time Trade options========================================";

input int OpenHour=0;
input int OpenMinute=0;
input int CloseHour=23;
input int CloseMinute=59;
 
Vladislav Andruschenko:

попробуйте мою


вызов:


параметры:

Вопрос был (и это отражено в названии темы) по MQL5.

 
Vladimir Karputov:

Вопрос был (и это отражено в названии темы) по MQL5.


сути не меняет, просто в мт5 у меня более продвинутая функция - 

вытащил функцию работы по времени

 
Vladimir Karputov:

А Вы в отладке сделайте остановку на строке

и добавьте наблюдение для mqldt.sec.


А после этого запустите отладку в режиме "Каждый тик на основе реальных тиков" ...

В функцию залазит все правильно. Сама функция не правильная. Надо как-то время засовывать в одну переменную, а не раздельно часы и минуты. С МТ5 я не сильно дружу пока еще...

 
Vladislav Andruschenko:

попробуйте мою


параметры:

Спасибо, сейчас посмотрим

 
Evgeniy Zhdan:

В функцию залазит все правильно. Сама функция не правильная. Надо как-то время засовывать в одну переменную, а не раздельно часы и минуты. С МТ5 я не сильно дружу пока еще...

Приведите время к секундам:

long time_sec=mqldt.hour*3600+mqldt.min*60+mqldt.sec;

и также к секундам приведите временной промежуток (от ... до). Останется просто сравнить время приведённое к секундам.

 
Vladimir Karputov:

Приведите время к секундам:

и также к секундам приведите временной промежуток (от ... до). Останется просто сравнить время приведённое к секундам.

Благодарю за ответ. Задача решена. Функция by Vladislav Andruschenko отлично работает)

 
Vladislav Andruschenko:

попробуйте мою

Вредно такой дорогой код писать.

 
fxsaber:

Вредно такой дорогой код писать.

он был написан в далеком 2010 году. потом перенесен в мт5 в 2012 

о дорогвизне кода речи не шло.