Запрет торговли в конце квартала

 

Доброе время суток!

Как программно запретить советнику торговать в пятницу, если на эту пятницу, субботу или воскресение выпадает последний день квартала?

Чет не могу сообразить.

 
MqlDateTime stime;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   bool stop_trade=false;
   TimeCurrent(stime);
   if(stime.day_of_week==5)
     {
      stop_trade=((stime.mon==3) && (stime.day>=29)?true:
                  (stime.mon==6)&&(stime.day>=28)?true:
                  (stime.mon==9)&&(stime.day>=28)?true:
                  (stime.mon==12)&&(stime.day>=29)?true:false);
     }
   if(stop_trade)
     {
      Comment("Сегодня торговля запрещена, конец квартала");
      return;
     }
  }
 
Sergey Savinkin:
Красиво. Но если проверить остаток от деления stime.mon%3 == 0 то это последний месяц квартала.
 
Alexey Viktorov:
Красиво. Но если проверить остаток от деления stime.mon%3 == 0 то это последний месяц квартала.

Да. Только количество дней в разных месяцах разное. Где-то нужны 28,29,30, а где-то 29,30,31.

 
Sergey Savinkin:

Да. Только количество дней в разных месяцах разное. Где-то нужны 28,29,30, а где-то 29,30,31.

Так и это можно сократить. Если пятница и плюс 3 дня == новый месяц, то это последняя пятница квартала.

 
Sergey Savinkin:

Да. Только количество дней в разных месяцах разное. Где-то нужны 28,29,30, а где-то 29,30,31.

Квартал всегда заканчивается на 30-31. Февраль, это середина первого квартала.

 
Konstantin Nikitin:

Квартал всегда заканчивается на 30-31. Февраль, это середина первого квартала.

Это к чему? Задание прочитайте. Пятница может выпасть на 28-30 день или 29-31.

 
Alexey Viktorov:

Так и это можно сократить. Если пятница и плюс 3 дня == новый месяц, то это последняя пятница квартала.

   Да.

 
Sergey Savinkin:

Это к чему? Задание прочитайте. Пятница может выпасть на 28-30 день или 29-31.

Примерно к этому

bool Trade(void)
{
     MqlDateTime mqlDateTime;
     TimeToStruct(TimeCurrent(), mqlDateTime);
     
     if(mqlDateTime.mon%3 != 0)
          return true;
     if(mqlDateTime.day_of_week == 5)
     {
          if(28+(mqlDateTime.mon==3 || mqlDateTime.mon==12 ? 1 : 0) > mqlDateTime.day)
               return true;
     }
     else
          if((mqlDateTime.mon==3 || mqlDateTime.mon==12 ? 31 : 30) > mqlDateTime.day)
               return true;
     return false;
}

Если просто нужен последний день квартала, то

bool Trade(void)
{
     MqlDateTime mqlDateTime;
     TimeToStruct(TimeCurrent(), mqlDateTime);
     
     if(mqlDateTime.mon%3 != 0)
          return true;
     if((mqlDateTime.mon==3 || mqlDateTime.mon==12 ? 31 : 30) > mqlDateTime.day)
          return true;
     return false;
}
 
Konstantin Nikitin:

Примерно к этому

...

if(28+(mqlDateTime.mon==3 || mqlDateTime.mon==12 ? 1 : 0) > mqlDateTime.day)

Начали с 23, потом 24, теперь 28 ...

 
Artyom Trishkin:

Начали с 23, потом 24, теперь 28 ...

Сначала вроде логически, потом полистал календарь =) Вот точнее будет. Надо просто брать последний торговый день