Пару временных периодов

 

Добрый день.

Пытаюсь организовать правильно функцию где будет несколько временных отрезков например для торговли советника.

Но что не могу всё сложить как надо. Дошел сюда.

extern string V_R = "Work time settings";
extern datetime start1 = D'08:00';
extern datetime stop1 = D'10:00';
extern datetime start2 = D'12:00';
extern datetime stop2 = D'15:30';
extern datetime start3 = D'16:30';
extern datetime stop3 = D'03:30';

/////////////////////////////////////////////////////////////////
 bool work_time_f() 
{
datetime time_current=TimeCurrent();

 if(
    (time_current<StringToTime(TimeToString(start1,TIME_MINUTES)) || time_current>StringToTime(TimeToString(stop1,TIME_MINUTES))) 
 && (time_current<StringToTime(TimeToString(start2,TIME_MINUTES)) || time_current>StringToTime(TimeToString(stop2,TIME_MINUTES))) 
 && (time_current<StringToTime(TimeToString(start3,TIME_MINUTES)) || time_current>StringToTime(TimeToString(stop3,TIME_MINUTES))) 
   ) return(false);

 


   return (true);
}
 
Проблема в том что когда новый день наступает start получается уже считается по новому дню.
 
Vasyl Nosal:
Проблема в том что когда новый день наступает start получается уже считается по новому дню.

Можно так

bool Is_Allowed_Hour(int i_Time, int i_Second_From, int i_Second_To) {
        i_Time %= 86400;
        
        if(i_Second_From < i_Second_To) {
                if(i_Time >= i_Second_From && i_Time <= i_Second_To)
                        return(true);
        } else if(i_Second_From > i_Second_To) {
                if(i_Time >= i_Second_From || i_Time <= i_Second_To)
                        return(true);
        }
        
        return(false);
}

Пример поверки:

if(!Is_Allowed_Hour(int(TimeCurrent()), gi_Session_A_Start_Second, gi_Session_A_Stop_Second))
        if(!Is_Allowed_Hour(int(TimeCurrent()), gi_Session_B_Start_Second, gi_Session_B_Stop_Second))
                        return(SIG_NONE);
Это для 2х сессий, если их больше - лучше в OnInint создавать структуру, заполнять её временами этих сессий и включить функцию Is_Allowed_Hour в эту структуру
 
Vasyl Nosal:
Проблема в том что когда новый день наступает start получается уже считается по новому дню.
Вы бы для своего интереса сделали принты и посмотрели чему фактически равны Ваши старты и стопы. И желательно посмотреть в первый день и не выгружая индикатор посмотреть во второй. Может вопросы другие возникнут
 
Victor Nikolaev:
Вы бы для своего интереса сделали принты и посмотрели чему фактически равны Ваши старты и стопы. И желательно посмотреть в первый день и не выгружая индикатор посмотреть во второй. Может вопросы другие возникнут
Вопрос один и я его уже озвучил. Всё остальное работает.
 
Alexander Puzanov:

Можно так

Пример поверки:

Это для 2х сессий, если их больше - лучше в OnInint создавать структуру, заполнять её временами этих сессий и включить функцию Is_Allowed_Hour в эту структуру

Это не две сесии, а одна. У меня 3 и такое не пойдёт.

Это просто проверка что больше старт или стоп. 

 

P.S. Я С++ не изучал. 

 
Vasyl Nosal:

Это не две сесии.

У вас их (сессий) 3:  start1..stop1,  start2..stop2,  start3..stop3

Vasyl Nosal:

Это просто проверка что больше старт или стоп. 

Этой функции без разницы переходит время сессии в др день или нет. Учтено

 

PS Я тоже. Кроме С++ есть тьма др языков 

 
Vasyl Nosal:
Вопрос один и я его уже озвучил. Всё остальное работает.

Может поможет

Как у меня организован контроль сессий

//+------------------------------------------------------------------+
//|                        Временные ограничения по работе советника |
//|                                Copyright © 2010, Victor Nicolaev |
//|                                            e-mail: vinin@mail.ru |
//+------------------------------------------------------------------+
extern string sH="Временные ограничения по работе советника (по часам)";
extern int     HourStart      =       -1;
extern int     HourStop       =       -1;

//+------------------------------------------------------------------+
//|                        Функция контроля времени работе советника |
//|                                Copyright © 2010, Victor Nicolaev |
//|                                            e-mail: vinin@mail.ru |
//+------------------------------------------------------------------+
//| bool CheckHour();                                                |
//+------------------------------------------------------------------+
bool CheckHour(){
   int CurrentHour=TimeHour(Time[0]);
   if (HourStart==-1 || HourStop==-1) return(true);
   if (HourStart == HourStop)
      if(CurrentHour==HourStart) 
         return(true);
   if (HourStart<HourStop)
      if (HourStart<=CurrentHour)
         if (CurrentHour<=HourStop) 
            return(true);
   if (HourStart>HourStop)
      if (HourStart>=CurrentHour || CurrentHour<=HourStop) 
         return(true);
   return(false);
}
 
Alexander Puzanov:

У вас их (сессий) 3:  start1..stop1,  start2..stop2,  start3..stop3

Этой функции без разницы переходит время сессии в др день или нет. Учтено

 

PS Я тоже. Кроме С++ есть тьма др языков 

Эта функция для одной сессии.
 
Victor Nikolaev:

Может поможет

Как у меня организован контроль сессий

Тоже одна сессия.
 
Vasyl Nosal:
Эта функция для одной сессии.
Под букафками "Пример поверки:" приведён пример проверки для 2х сессий с этой функцией. Дописать в проверку 3ю сессию - не проблема даже нам с вам, не-си-плю-плюсам :) Не писать же спец-функцию для 3.75 сессий

PS Походу я увлёксо - зачем мне вас убеждать? Бошенебуду
Причина обращения: