MQL5 расписание советника дни недели время начала и время окончания, часы минуты

 

Помогите переписать правильно этот коде для MQL5.

Переменные:

//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ 
//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
extern bool   ExpertTime = True;        // True-вкл. False-выкл.
extern string TradeDay   = "1,2,3,4,5,6"; // Дни работы советника 1= ПН, 5 = ПТ. 6 = все дни 
extern int    HourStart  = 0;           // Старт в понедельник. 
extern int    HourStops  = 19;          // Стоп в пятницу.
extern int    Ea_Start   = 0;           // Ежедневный cтарт советника. сессия 1 
extern int    Ea_Stop    = 16;          // Ежедневный  cтоп советника. сессия 1  




extern bool   Sesion_2 = True;   //  две сессии или одна
extern int    Ea_Start_2   = 22;           // Ежедневный cтарт советника. сессия 2  
extern int    Ea_Stop_2    = 24;          // Ежедневный  cтоп советника. сессия 2
//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ //+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+

Использование:

if(Tradetime(ExpertTime, Ea_Start, Ea_Stop)==1) {
//----
//... Здесь код.
//----
} 


Функция:   функция без сессии 2 и без параметра 6 (все дни недели)

//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
//| Tradetime(). Работа по времени.                                                                         |>
//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ 
int Tradetime(bool exptime, int OpenHour, int  CloseHour) {
// ---
  int day[]; 
  int i=0, np;
  int Trading=0;
  string st, tmp=TradeDay;
  ArrayResize(day, 0);
  while (StringLen(tmp)>0) {
    np=StringFind(tmp, ",");
    if (np<0) {
      st=tmp;
      tmp="";
    } 
    else {
      st=StringSubstr(tmp, 0, np);
      tmp=StringSubstr(tmp, np+1);
    }
    i++;
    ArrayResize(day, i);
    day[i-1]=StrToInteger(st);
  }
  int TradingTime=0;
  for (int f=0; f<7; f++) {
    if (DayOfWeek()==day[f])Trading=1;
  }
  if (OpenHour>CloseHour) {
    if (Hour()<=CloseHour || Hour()>=OpenHour)TradingTime=1;
  }
  if (OpenHour<CloseHour) {
    if (Hour()>=OpenHour && Hour()<=CloseHour)TradingTime=1;
  }
  if (OpenHour==CloseHour) {
    if (Hour()==OpenHour)TradingTime=1;
  }
  if (DayOfWeek()==1 && Hour() <= HourStart)TradingTime=0;
  if (DayOfWeek()==5 && Hour() >= HourStops)TradingTime=0; 
  if (Trading!=1)   TradingTime=0;
  if (exptime!=true)TradingTime=1;
// ---
  return (TradingTime); 
}


Спасибо


 

Для начала можно немного упростить код:

StringSplit
В справке гляньте
 
Вот тут про временные фильтры можно почитать.
Кроссплатформенный торговый советник: Временные фильтры
Кроссплатформенный торговый советник: Временные фильтры
  • www.mql5.com
В статье обсуждается реализация различных методов временной фильтрации в кроссплатформенном торговом советнике. Классы временных фильтров отвечают за проверку того, попадает ли конкретное время в определенный период, заданный в настройках.
 

Это же код на MQL4

"6" в списке дней не имеет смысла

void OnStart() {

    if (ExpertTime && IsTradeTime(Ea_Start, Ea_Stop)) {
        Print("Рубим бабло");
    }
    else {
        Print("Отдыхаем");
    }

}

bool IsTradeTime(int openHour, int closeHour) {
    
    string sday = IntegerToString(DayOfWeek()); // текущий день недели
    
    // если день недели не в списке, то не торгуем
    if (StringFind(TradeDay, sday) < 0) return false;

    // если время в заданном диапозоне, то торгуем
    return (Hour() >= openHour && Hour() < closeHour);
}
 
Ruslan Khasanov #:
Вот тут про временные фильтры можно почитать.

спасибо