Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vasyl Nosal
19760
Vasyl Nosal  

Добрый день.

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

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

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);
}
Vasyl Nosal
19760
Vasyl Nosal  
Проблема в том что когда новый день наступает start получается уже считается по новому дню.
Alexander Puzanov
35645
Alexander Puzanov  
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 в эту структуру
Victor Nikolaev
Модератор
15923
Victor Nikolaev  
Vasyl Nosal:
Проблема в том что когда новый день наступает start получается уже считается по новому дню.
Вы бы для своего интереса сделали принты и посмотрели чему фактически равны Ваши старты и стопы. И желательно посмотреть в первый день и не выгружая индикатор посмотреть во второй. Может вопросы другие возникнут
Vasyl Nosal
19760
Vasyl Nosal  
Victor Nikolaev:
Вы бы для своего интереса сделали принты и посмотрели чему фактически равны Ваши старты и стопы. И желательно посмотреть в первый день и не выгружая индикатор посмотреть во второй. Может вопросы другие возникнут
Вопрос один и я его уже озвучил. Всё остальное работает.
Vasyl Nosal
19760
Vasyl Nosal  
Alexander Puzanov:

Можно так

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

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

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

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

 

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

Alexander Puzanov
35645
Alexander Puzanov  
Vasyl Nosal:

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

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

Vasyl Nosal:

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

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

 

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

Victor Nikolaev
Модератор
15923
Victor Nikolaev  
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);
}
Vasyl Nosal
19760
Vasyl Nosal  
Alexander Puzanov:

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

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

 

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

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

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

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

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

PS Походу я увлёксо - зачем мне вас убеждать? Бошенебуду
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий