Как разрешить советнику торговать, только в определенное время? - страница 2

 

Удивительно, что всем кажется, что можно торговать или не торговать в промежутке с 00:00  до 24:00.

А что вы будете делать, если нужно выбрать промежуток например от 22:00  до 03:00 ?

 
Petros Shatakhtsyan:

Удивительно, что всем кажется, что можно торговать или не торговать в промежутке с 00:00  до 24:00.

А что вы будете делать, если нужно выбрать промежуток например от 22:00  до 03:00 ?

Хорошее замечание, но не справедливое, так как это два диапазона, ложащихся на разные дни, просто нужно и фильтровать время от 22:00 до 23:59 и с 00:00 до 03:00 .

 

Пример должен быть очень простой, быстро работающий и понятен для чайника.

Не советую использовать всякие преобразования и работать со строками. Это тяжелая операция для процессора.

Вот очень простая реализация: например если надо не торговать с 22:00 до 03:00 по серверному времени

Для этого советую использовать OnTimer.


bool sleep=0;


int OnInit()
{
  .
   EventSetTimer(1);
  .
}

void OnTick()
{
  if(sleep==1)  {  Comment(" WAITING");  return; }

}
 void OnTimer()
{
   sleep=0;
   datetime tm=TimeCurrent();
   long seconds = tm%86400;  // 86400 количество секунд за день:  24*3600
   if ( seconds >86400-2*3600 || seconds < 3*3600) { sleep=1; return;  } // 22:00 - 03:00 

}
 
Petros Shatakhtsyan:

Удивительно, что всем кажется, что можно торговать или не торговать в промежутке с 00:00  до 24:00.

А что вы будете делать, если нужно выбрать промежуток например от 22:00  до 03:00 ?

Мой пример решает этот вопрос. 22.00  становится началом суток.

Смотри статью.

 
Aleksey Panfilov:

Мой пример решает этот вопрос. 22.00  становится началом суток.

Ну и что. Я же не сделал изобретение. :)

Просто в моем примере нет никаких строковых преобразований.

 

Пробуйте)

Код на MQL4.

Одновременно учитывается время(часы и минуты) и день недели. Можно установить множество интервалов времени.

Точность времени пять минут.

//Часы дня
enum E_hours
  {
   eh_none=-1,//---
   eh_0=0,//0
   eh_1=1,//1
   eh_2=2,//2
   eh_3=3,//3
   eh_4=4,//4
   eh_5=5,//5
   eh_6=6,//6
   eh_7=7,//7
   eh_8=8,//8
   eh_9=9,//9
   eh_10=10,//10
   eh_11=11,//11
   eh_12=12,//12
   eh_13=13,//13
   eh_14=14,//14
   eh_15=15,//15
   eh_16=16,//16
   eh_17=17,//17
   eh_18=18,//18
   eh_19=19,//19
   eh_20=20,//20
   eh_21=21,//21
   eh_22=22,//22
   eh_23=23//23
  };
//Дни недели
enum E_days_w
  {
   ed_none=-1,//---
   ed_0=0,//Воскресенье
   ed_1=1,//Понедельник
   ed_2=2,//Вторник
   ed_3=3,//Среда
   ed_4=4,//Четверг
   ed_5=5,//Пятница
   ed_6=6//Суббота
  };
  
 //Время торговой сессии
struct e_Session
  {
   int               hour_start;
   int               hour_stop;
  };
const int es_All_days_week=-2;
//Часы торговых сессий при UTC+0
e_Session es_All_hours={0,0};
e_Session es_Asia={0,9};
e_Session es_Europe={6,15};
e_Session es_America={13,22};
e_Session es_Pacific={20,4};
e_Session es_Asia_Tokyo={0,8};
e_Session es_Asia_HongKong={1,9};
e_Session es_Asia_Singapore={0,8};
e_Session es_Europe_Frankfurt={6,14};
e_Session es_Europe_London={7,15};
e_Session es_America_NewYork={13,21};
e_Session es_America_Chicago={14,22};
e_Session es_Pacific_Wellington={20,4};
e_Session es_Pacific_Sydney={20,4};
static int   _UTC=2;//Часовой пояс сервера 
  
  bool              _time_day[24,12];//Время акивности стратегии для каждой пятиминутки, период сутки
  bool              _time_week[7];//Время активности стратегии для каждого дня, период неделя
   
   void              r_timeactive_set(e_Session &sess,bool is_active);//Установка времени активности используя время работы торговых сессий
   void              r_timeactive_set(int hour_start,int minute_start,int hour_stop,int minute_stop,bool is_active);//Установка времени, используя часы и минуты
   void              r_timeactive_set(int day_of_week,bool is_active);//Установка работы по дню недели
   bool              _Timeactive_get();//Разрешена ли торговля
   
   
   void         r_timeactive_set(e_Session &sess,bool is_active)
  {
   if((test_idsignal==this._id)&&(test_hour_start!=eh_none)) return;
   int i1,i2,i3;
   int s_start,s_stop;
   s_start=(int)MathMod(sess.hour_start+_UTC,24);
   s_stop=(int)MathMod(sess.hour_stop+_UTC,24);
   if(s_stop<=s_start)
     {
      s_stop=s_stop+24;
     }
   for(i1=s_start;i1<s_stop;i1++)
     {
      i3=(int)MathMod(i1,24);
      for(i2=0;i2<12;i2++)
        {
         this._time_day[i3,i2]=is_active;
        }
     }
  }
  
  void r_timeactive_set(int hour_start,int minute_start,int hour_stop,int minute_stop,bool is_active)
  {
   if((test_idsignal==this._id)&&(test_hour_start!=eh_none)) return;
   int i1,i3,i4,_start,_stop;
   hour_start=(int)MathMod(hour_start,24);
   minute_start=(int)MathMod(minute_start,60);
   minute_start=(int)MathFloor(minute_start/5.0);
   hour_stop=(int)MathMod(hour_stop,24);
   minute_stop=(int)MathMod(minute_stop,60);
   minute_stop=(int)MathFloor(minute_stop/5.0);
   if(hour_start>hour_stop)
     {
      hour_stop=hour_stop+24;
     }
   _start=hour_start*12+minute_start;
   _stop=hour_stop*12+minute_stop;
   for(i1=_start;i1<=_stop;i1++)
     {
      i3=(int)MathMod(MathFloor(i1/12.0),24);
      i4=(int)MathMod(i1,12);
      this._time_day[i3,i4]=is_active;
     }
  }
  
  void r_timeactive_set(int day_of_week,bool is_active)
  {
   if(day_of_week>=0)
     {
      if((test_idsignal==this._id)&&(test_day_week_start!=ed_none)) return;
      int i1=(int)MathMod(day_of_week,7);
      this._time_week[i1]=is_active;
     }
   else
     {
      for(int i1=0;i1<7;i1++)
        {
         this._time_week[i1]=is_active;
        }
     }
  }
  
  bool _Timeactive_get()
  {
   datetime dt=TimeCurrent();
   int day_w=TimeDayOfWeek(dt);
   int hour=TimeHour(dt);
   int minute=(int)MathFloor(TimeMinute(dt)/5.0);
   bool res=(this._time_week[day_w] && this._time_day[hour,minute]);
   return res;
  }

Пример использования:

 r_timeactive_set(es_All_hours,false);//На всех сессиях ничего не делаем
 r_timeactive_set(es_Asia_HongKong,true);//Кроме Азиатской сессии при работе Гонконгской биржы
 r_timeactive_set(es_All_days_week,false);//Всю неделю гуляем
 r_timeactive_set(3,0,4,30,true);//Немного ночью поработаем с 3:00 до 4:30
 r_timeactive_set(ed_2,false);//Только выходной во вторник

if(_Timeactive_get())//Если разрешена торговля сейчас
{
   Get_profit("1000000$");//Торгуем, ваш код
}
 
Aliaksandr Hryshyn:

Пробуйте)

Код на MQL4.

Одновременно учитывается время(часы и минуты) и день недели. Можно установить множество интервалов времени.

Точность времени пять минут.

Пример использования:

Супер километровый текст.

 
Petros Shatakhtsyan:

Пример должен быть очень простой, быстро работающий и понятен для чайника.

Не советую использовать всякие преобразования и работать со строками. Это тяжелая операция для процессора.

Вот очень простая реализация: например если надо не торговать с 22:00 до 03:00 по серверному времени

Для этого советую использовать OnTimer.

bool sleep=0;


int OnInit()
{
  .
   EventSetTimer(1);
  .
}

void OnTick()
{
  if(sleep==1)  {  Comment(" WAITING");  return; }

}
 void OnTimer()
{
   sleep=0;
   datetime tm=TimeCurrent();
   long seconds = tm%86400;  // 86400 количество секунд за день:  24*3600
   if ( seconds >86400-2*3600 || seconds < 3*3600) { sleep=1; return;  } // 22:00 - 03:00 

}


Интересный вариант. Вот только я бы его использовал прямо в OnTick(), без таймера.

 
Vladimir Karputov:

Интересный вариант. Вот только я бы его использовал прямо в OnTick(), без таймера.

Да, можно и там. Но если тики приходят довольно часто, например несколько тиков в секунду, то будет лишних проверок.

А для OnTimer можно выбрать и время, чтобы работала через каждые 10 или 60 сек.


Добавлю, что  через OnTimer имеет тот недостаток, что когда маркет закрыт (суб. воск.), то программа будет крутиться в холостую.

 
Petros Shatakhtsyan:

Удивительно, что всем кажется, что можно торговать или не торговать в промежутке с 00:00  до 24:00.

А что вы будете делать, если нужно выбрать промежуток например от 22:00  до 03:00 ?

Достаточно добавить условие

if(startTime > endTime)
 endTime += PeriodSeconds(PERIOD_D1);

if(TimeCurrent() > startTime && TimeCurrent() < endTime)
  // в этот период не торговать.
  return;
Причина обращения: