Как сделать оптимизацию времени советника

 
Igor Gluschenko:

Нужно чтобы с 1 до 12 вел торговлю.

я сделал так. Правильно?


да

 

так он торгует каждый час по часу.


а чтобы с 2 до 12 как?

 
Igor Gluschenko:
    bool isTradingTime(
      const int startHour,
      const int startMinute,
      const int endHour,
      const int endMinute)
    {
      MqlDateTime date = {0};
      TimeCurrent(date);

      return 
        date.hour >= startHour && 
        date.min >= startMinute && 
        date.hour <= endHour && 
        date.min <= endMinute;
    }

OnTick()
{
  if (isTradingTime(13, 0, 23, 59)) // from 13:00 to 23:59
  {
    // trading
  }
}

 
XXX:

С таким подходом встает традиционный вопрос - что делать, если диапазон переходит на другие сутки? Например 22:10-03:45

 
Alexey Volchanskiy:

1. не пытался делать метод универсальным, главное чтобы были циферки, которые можно вынести в параметры тестера

2. если нужно тестировать разрыв между днями, то можно два условия 

if (23:00 - 23:59) or if (00:01 - 01:00)

ранее выкладывал такой вариант, но он привязан к формату времени, поэтому не нравится

если сильно встряла ночная торговля между днями, и вместо двух условий хочется сделать универсальный метод, то можно к условию проверки времени добавить проверку дня недели, но мне это не надо 

bool IsTradingTime(const string shours = "0:30-23:30", const string sdays = "0-6")
{
    string days[];
    string hours[];
    
    StringSplit(sdays, '-', days);
    StringSplit(shours, '-', hours);

    MqlDateTime o = {0};
    datetime now = TimeCurrent(o);
    
    string day = 
        string(o.year) + "." + 
        string(o.mon) + "." + 
        string(o.day);

    datetime H1 = StringToTime(day + " " + hours[0]);
    
    if (hours[0] > hours[1])
    {
        day = 
            string(o.year) + "." + 
            string(o.mon) + "." + 
            string(o.day + 1);
    }
    
    datetime H2 = StringToTime(day + " " + hours[1]);
    
    int D1 = int(days[0]);
    int D2 = int(days[ArraySize(hours) - 1]);

    if (now >= H1 && 
        now <= H2 && 
        o.day_of_week >= D1 && 
        o.day_of_week <= D2) 
            return true;

    return false;
}
 
XXX:

1. не пытался делать метод универсальным, главное чтобы были циферки, которые можно вынести в параметры тестера

2. если нужно тестировать разрыв между днями, то можно два условия 

if (23:00 - 23:59) or if (00:01 - 01:00)

ранее выкладывал такой вариант, но он привязан к формату времени, поэтому не нравится

если сильно встряла ночная торговля между днями, и вместо двух условий хочется сделать универсальный метод, то можно к условию проверки времени добавить проверку дня недели, но мне это не надо 

Мне тоже разрывы не нужны, а вот насчет оптимизации по времени как-то не думал, сделал по простому

input string    StartTimeOpen   = "02:00";  //Time of the start of trading operations
input string    StopTimeOpen    = "23:00";  //Time of the stop of trading operations

    // функция проверяет вхождение серверного времени в заданный диапазон
    // если есть вхождение есть, возвращает true, иначе false 
    bool CheckForWorkTime(string startT, string stopT)
    {
        if (TimeCurrent() > StringToTime(startT) && TimeCurrent() < StrToTime(stopT))
            return(true);
        return (false);
    }
 

если время старт больше чем время стоп

ко времени стоп просто добавить 24 часа

 
Alexey Volchanskiy:

С таким подходом встает традиционный вопрос - что делать, если диапазон переходит на другие сутки? Например 22:10-03:45

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Не для разработчиков МТ! Чем заменить INIT_PARAMETERS_INCORRECT ?

fxsaber, 2018.07.10 16:39

Нужно немного уметь задавать входные параметры.

Очень распространенный пример можно привести. Когда оптимизируют суточный интервал торговли, то чаще всего задают суточное время старта и конца интервала - два входных параметра.

Но это много хуже для ГА, чем, например, задать время старта и длительность. Казалось бы, одно и то же, но не для ГА. Во втором случае ГА справится лучше. Хотя "лучше" - довольно субъективная оценка.

 
bool isTradeTime(string TimeBegin="00:00", string TimeEnd="00:00") {
 datetime dtBegin, dtEnd, TimeCur=TimeCurrent();
  dtBegin=StringToTime(TimeToString(TimeCur, TIME_DATE)+" "+TimeBegin);
  dtEnd  =StringToTime(TimeToString(TimeCur, TIME_DATE)+" "+TimeEnd);
  if(dtBegin>=dtEnd) {
   if(TimeCur>=dtEnd) dtEnd+=24*60*60; else dtBegin-=24*60*60;
  }
  return(TimeCur>=dtBegin && TimeCur<=dtEnd);
 }
 
Зачем такие сложности?!
Самый первый код хороший и быстрый. Только немного изменить надо его, добавить одно условие. Если есть переход суток, то все знаки больше/меньше меняем на противоположные. Или добавить 24 часа, как было сказано выше....
Причина обращения: