работа советника в определенные часы

 

Для МТ4 . 

Может кто знает интересное и изящное решение торговли робота в определенные часы. Например торгуем только в 1 в 5 в 19 , 14 в 16 и с 19 до 22 часов (включительно). 

Можно конечно сделать на каждый час переменную bool, но как то не хочется так в лоб. 
Нажимать кнопки на графике - тоже не выход. Вообще кнопки на чарте не нужны. 
Высчитывать какие часы активированы если число равно 312 или там 10986 - не вариант. Часы будут выставляться вручную и не будут оптимизироваться. 

 
Dmitiry Ananiev:

Для МТ4 . 

Может кто знает интересное и изящное решение торговли робота в определенные часы. Например торгуем только в 1 в 5 в 19 , 14 в 16 и с 19 до 22 часов (включительно). 

Можно конечно сделать на каждый час переменную bool, но как то не хочется так в лоб. 
Нажимать кнопки на графике - тоже не выход. Вообще кнопки на чарте не нужны. 
Высчитывать какие часы активированы если число равно 312 или там 10986 - не вариант. Часы будут выставляться вручную и не будут оптимизироваться. 

 if(Hour()==1 || Hour()==5 || Hour()==19 || Hour()==14 || Hour()==16 || (Hour()>18 && Hour()<23 ))

еще раз прочитал ваш вопрос - похоже это не совсем то, что вам надо... :-)

Тогда варик через боол....

 

Ну да. Это не совсем то, что надо. 

Как вариант - перечислить через разделитель нужные часы, а в роботе уже переконвертировать все в числа. Это пока пожалуй более менее правильное решение, как мне видится. 
Все еще жду другие варианты. 

 

вот мой пример https://www.mql5.com/ru/forum/160683/page861#comment_11840254

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

ЗЫ: но модератор сказал, что негоже такие простые классы писать, ибо класс это дело великое и класс должен уметь и то, и сё и ... "Я еще и вышивать могу, и на машинке... тоже." (С)

)))

 
Если оптимизировать точно не будет надо, то в окне свойств в строку перечислять, полная свобода: 1, 2, 4-6, 12:30-17:14, 22...
 

Любой целый тип с числом байтов не меньше трех позволяет однозначно задать любую комбинацию торгов, т.к. всего таких комбинаций 2^24.


Написать скрипт, который создает это число по часам и обратно - из числа выдает часы.

Такое число удобно, т.к. проверка очень дешевая.


ЗЫ

#property strict

// Число, однозначно задающее время торговли
int GetNumber( const bool &Hours[] )
{
  int Num = 0;
  
  for (int i = ArraySize(Hours) - 1; i >= 0; i--)
    if (Hours[i])
      Num |= 1 << i;
      
  return(Num);
}

// Проверка работы числа для часа
bool CheckHour( const int Hour, const int Number )
{
  return((bool)(Number & (1 << Hour)));
}

void OnStart()
{
  bool Hours[24];
  ZeroMemory(Hours);
    
  // Задали, где торгуем.
  Hours[0] = true;
  Hours[1] = true;
  Hours[2] = true;
  Hours[11] = true;
  Hours[12] = true;
  Hours[13] = true;
  Hours[22] = true;
  Hours[23] = true;

  // Показали, где торгуем
  ArrayPrint(Hours);
  
  // Число, однозначно задающее время торговли
  const int Number = GetNumber(Hours);

  // Проверка работы числа для каждого часа
  for (int i = 0; i < 24; i++)
    Print((string)i + " " + (string)CheckHour(i, Number) + "\n");
}
 
Igor Makanu:

ЗЫ: но модератор сказал, что негоже такие простые классы писать, ибо класс это дело великое и класс должен уметь и то, и сё и ...

Пример класса (структуры), который, вроде, ничего не делает, но очень удобный

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

Вопросы по ООП в MQL5

fxsaber, 2019.07.06 22:55

struct FILE
{
  const int handle;
  
  FILE( const string FileName, const int Flags ) : handle(::FileOpen(FileName, Flags)) {}  
  ~FILE( void ) { if (this.handle != INVALID_HANDLE) ::FileClose(this.handle); }
};
 
Dmitiry Ananiev:

Для МТ4 . 

Может кто знает интересное и изящное решение торговли робота в определенные часы. Например торгуем только в 1 в 5 в 19 , 14 в 16 и с 19 до 22 часов (включительно). 

Можно конечно сделать на каждый час переменную bool, но как то не хочется так в лоб. 
Нажимать кнопки на графике - тоже не выход. Вообще кнопки на чарте не нужны. 
Высчитывать какие часы активированы если число равно 312 или там 10986 - не вариант. Часы будут выставляться вручную и не будут оптимизироваться. 

Мне очень понравилось как сделано здесь https://www.mql5.com/ru/articles/2166

Универсальный торговый эксперт: Торговые режимы стратегий (Часть 1)
Универсальный торговый эксперт: Торговые режимы стратегий (Часть 1)
  • www.mql5.com
Задачи, возникающие в процессе реализации автоматического торгового алгоритма, разнообразны. Это и анализ рыночного окружения с получением сигналов на вход в рынок, и закрытие уже существующей позиции. Это контроль корректности торговых действий эксперта и правильная обработка торговых ошибок. Наконец, это простой и удобный доступ к рыночным...
 
fxsaber:

Пример класса (структуры), который, вроде, ничего не делает, но очень удобный

постеснялся сразу спросить, но тут спрошу, а что будет если в Вашем примере структуру на класс заменить? - я максимально не использую структуры в MQL , заменяю их на классы - результат тот же, но не ограничений


Igor Makanu:

 можно убрать минуты, да и проще только часы проверять, - где то было, поищу как только с часами делал

вот нашел время работы, но только по часам:

input int StartHourSession1               =9;                           //Время начала торговли
input int StopHourSession1                =18;                          //Время окончания торговли


class CSession
  {
private:
   int               StartHour,StopHour;
   bool              Intraday,UseThisSession;
public:
   void              CSession(void){};
   void              ~CSession(void){};
   void              CSession(int hstart,int hstop)
     {
      Intraday=(hstop>hstart) ? true : false;
      UseThisSession=(hstart<0 || hstop<0 || hstart>23 || hstop>23) ? false : true;
      StartHour=hstart;
      StopHour=hstop;
      if(!UseThisSession) Print("Время работы советника не используется");
     };
   int              CheckSession(int hour)
     {
      int result=0;
      if(UseThisSession)
        {
         if(Intraday) if(hour>=StartHour && hour<StopHour) result=1; else result=-1;
         else         if(hour>=StopHour && hour<StartHour) result=-1;else result=1;
        }
      return(result);
     };
  }
*Session;

.....

int OnInit()
  {
   Session=new CSession(StartHourSession1,StopHourSession1);
  }

.....
if(Session.CheckSession(Hour())<0) { Comment("Запрет торговли по времени");  return;  }


в этом примере у меня учитывается ввод времени в часах не зависимо от StartHour > или  <StopHour - т.е. код сам "сообразит", что торговля может быть с 23 ч до 2ч - это одно торговое время, а с 2 до 23 ч - это другое торговое время

ну и как в первом моем примере можно наращивать кол-во временных диапазонов - создаем новый экземпляр класса

 
Igor Makanu:

что будет если в Вашем примере структуру на класс заменить?

Там не принципиально.

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

Для структур свои плюсы, для классов - свои. Какие плюсы нужны, то и выбирается.

 
fxsaber:

Там не принципиально.

Для структур свои плюсы, для классов - свои. Какие плюсы нужны, то и выбирается.

на минусы структур уже попадал, кажется ограничение на вызов конструктора в структуре было

плюсы то какие у структур? - не нашел

ЗЫ: в том же C# структуры/классы используют разную память и struct A = struct B - будет копирование полей , а class A = class B - будет создан новый указатель (причем без копирования, в дальнейшем изменяя B  - будем изменять одновременно и А... этим чудесным свойством я и воспользовался когда код панельки на C# делал - удобно, обмен данными делать в разных частях кода и даже в разных процессах каким то чудом все работает - а не должно! ))) )