Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
vitaliy9999999
144
vitaliy9999999  
Здравствуйте! Как разрешить советнику торговать, только в определенное время? Мне нужна торговля только в азию и европу. Что то запутался в данной теме. Подскажите кому не жалко!
Vladimir Karputov
Модератор
95535
Vladimir Karputov  
vitaliy9999999:
Здравствуйте! Как разрешить советнику торговать, только в определенное время? Мне нужна торговля только в азию и европу. Что то запутался в данной теме. Подскажите кому не жалко!

Например так: Opening and Сlosing on time.

Задавать интервал времени (для удобства время имеет тип datetime, но берётся из него только часы и минуты)

//--- input parameters
input datetime m_time_open=D'1980.07.19 13:00:00';    // opening time (only HH:mm are considered)
input datetime m_time_close=D'1980.07.19 13:01:00';   // closing time (only HH:mm are considered)


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

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   MqlDateTime str_time_current,str_time_open,str_time_close;
   TimeToStruct(TimeCurrent(),str_time_current);
   TimeToStruct(m_time_open,str_time_open);
   TimeToStruct(m_time_close,str_time_close);

   if(!IF_POSITION_ALREADY_OPEN)
     {
      if(str_time_current.hour==str_time_open.hour)
         if(str_time_current.min==str_time_open.min)
           {
Galina Bobro
9416
Galina Bobro  
1) прописать в самом советнике, если есть код.
2) только WinApi и пр. не стандартные методы. 
Можно ещё относительно легко сделать чтоб советник не торговал,   но чтоб включить есть ограничения безопасности. 
Alexandr Saprykin
11083
Alexandr Saprykin  
vitaliy9999999:
Здравствуйте! Как разрешить советнику торговать, только в определенное время? Мне нужна торговля только в азию и европу. Что то запутался в данной теме. Подскажите кому не жалко!
extern string StartTimeOpen="03:00";// время задано строкой
extern string StopTimeOpen = "16:00";
// функция проверки совпадения серверного времени и заданного диапозона
// совпадает - true, нет - false
bool CheskForWorkTime(string startT,string stopT)
  {
   if(TimeCurrent()>StringToTime(startT) && TimeCurrent()<StrToTime(stopT))
      return(true);
   return (false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool CheskForWorkTime(datetime startT,datetime stopT)
  {
   if(TimeCurrent()>startT && TimeCurrent()<stopT)
      return(true);
   return (false);
  }
//+------------------------------------------------------------------+
Alexey Volchanskiy
25599
Alexey Volchanskiy  
Vladimir Karputov:

Например так: Opening and Сlosing on time.

Задавать интервал времени (для удобства время имеет тип datetime, но берётся из него только часы и минуты)


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

Володя, тут надо даты задавать, а чел просил время

Vladimir Karputov
Модератор
95535
Vladimir Karputov  
Alexey Volchanskiy:

Володя, тут надо даты задавать, а чел просил время

Всё правильно, задаётся ВРЕМЯ:

"... Например так: Opening and Сlosing on time.

Задавать интервал времени (для удобства время имеет тип datetime, но берётся из него только часы и минуты) ... ".

Такой подход удобен для конвертации и позволяет делать оптимизацию, в отличие от string.


vitaliy9999999
144
vitaliy9999999  
Всем спасибо за советы, но что то у меня не получается. Понимаю, что это все просто, но что то не могу догнать. Как узнать текущее время без года и месяца? Я могу узнать время открытия свечи, дневной и текущей минутной например... но оно с годом и месяцем. как из него вычислить только часы? либо мне нужно перевезти время открытия дневной свечи и минутной в формат int с помощью StringToTime() и сравнить, но  это тоже не выходит.
Vladimir Karputov
Модератор
95535
Vladimir Karputov  
vitaliy9999999:
Всем спасибо за советы, но что то у меня не получается. Понимаю, что это все просто, но что то не могу догнать. Как узнать текущее время без года и месяца? Я могу узнать время открытия свечи, дневной и текущей минутной например... но оно с годом и месяцем. как из него вычислить только часы? либо мне нужно перевезти время открытия дневной свечи и минутной в формат int с помощью StringToTime() и сравнить, но  это тоже не выходит.

Пример MQL5 - во входных параметрах задаём ВРЕМЕННОЙ промежуток (используем из переменных "Opening time" и "Closing time" ТОЛЬКО часы и минуты)

...
//--- input parameters
...
input datetime Start=D'1970.01.01 08:00:00'; // Opening time (only HH:mm are considered)
input datetime Close=D'1970.01.01 23:59:00'; // Closing time (only HH:mm are considered)
...
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
...
   MqlDateTime STimeCurrent;
   TimeToStruct(TimeCurrent(),STimeCurrent);
   long time_current=STimeCurrent.hour*3600+STimeCurrent.min*60+STimeCurrent.sec;

   MqlDateTime SStart;
   TimeToStruct(Start,SStart);
   long time_start=SStart.hour*3600+SStart.min*60;

   MqlDateTime SClose;
   TimeToStruct(Close,SClose);
   long time_close=SClose.hour*3600+SClose.min*60;

   if(time_current>=time_start && time_current<time_close)
      {
       //--- можно торговать
      }

в OnTick() переводим время в структуру, затем из структуры выделяем только время. Расчёт простой: часы умножаем на 3600, минуты умножаем на 60, Причём текущее время считаем с точностью до секунд, а временной интервал с точностью до минут.

Galina Bobro
9416
Galina Bobro  
vitaliy9999999:
Всем спасибо за советы, но что то у меня не получается. Понимаю, что это все просто, но что то не могу догнать. Как узнать текущее время без года и месяца? Я могу узнать время открытия свечи, дневной и текущей минутной например... но оно с годом и месяцем. как из него вычислить только часы? либо мне нужно перевезти время открытия дневной свечи и минутной в формат int с помощью StringToTime() и сравнить, но  это тоже не выходит.
Time= TimeCurrent() - TimeCurrent()%PeriodSecond (PERIOD_D1)

П.С. пишу с телефона, не нашла как тут код вставить. 
Aleksey Panfilov
2322
Aleksey Panfilov  
vitaliy9999999:
Здравствуйте! Как разрешить советнику торговать, только в определенное время? Мне нужна торговля только в азию и европу. Что то запутался в данной теме. Подскажите кому не жалко!

Мне понравилась статья, и использовал совсем недавно.

   if(CopyBuffer(Handle_4P72_L0_1,0,0,1,line1_L0)<0 || CopyBuffer(Handle_4P72_L0_2,0,0,1,line2_L0)<0
   || CopyBuffer(Handle_4P72_L1_1,0,0,1,line1_L1)<0 || CopyBuffer(Handle_4P72_L1_2,0,0,1,line2_L1)<0
   || CopyBuffer(Handle_4P72_L2_1,0,0,1,line1_L2)<0 || CopyBuffer(Handle_4P72_L2_2,0,0,1,line2_L2)<0
   ||  CopyTime(_Symbol,_Period,0,1,New_Time)<0)
         if(
             Buy_opened  && (line1_L0[0] < line2_L0[0] || L0_1_line_power ==0) &&  (line1_L1[0] < line2_L1[0] || L1_1_line_power ==0) 
             &&  (line1_L2[0] < line2_L2[0] || L2_1_line_power ==0) && ((New_Time[0]-3600*Start_Hour)%86400 < 3600*Period_Hour)  
           )

Это с дискретностью 1 час.

Чтобы отключить фильтрацию по времени Period_Hour = 25 (остаток от деления будет всегда меньше)

Aleksey Vyazmikin
11184
Aleksey Vyazmikin  
vitaliy9999999:
Всем спасибо за советы, но что то у меня не получается. Понимаю, что это все просто, но что то не могу догнать. Как узнать текущее время без года и месяца? Я могу узнать время открытия свечи, дневной и текущей минутной например... но оно с годом и месяцем. как из него вычислить только часы? либо мне нужно перевезти время открытия дневной свечи и минутной в формат int с помощью StringToTime() и сравнить, но  это тоже не выходит.

Если Вам надо заблокировать какие либо действия торговые, в определенное время, то можно использовать такой код

         int hourOne=10; //начала диапазона блокировки        
         int hourEnd=20; //конец диапазона блокировки

         datetime  Open_timePos1=iTime(_Symbol,0,0);
         MqlDateTime str1;
         TimeToStruct(Open_timePos1,str1);
         str1.hour=hourOne;
         str1.min=0;
         str1.sec=0;
         datetime start_time=StructToTime(str1);

         datetime  Open_timePos2=iTime(_Symbol,0,0);
         MqlDateTime str2;
         TimeToStruct(Open_timePos2,str2);
         str2.hour=hourEnd;
         str2.min=00;
         str2.sec=0;
         datetime stop_time=StructToTime(str2);
         //Print ("start_time-",start_time," stop_time-",stop_time);                 
         if(iTime(_Symbol,0,0)>=start_time && iTime(_Symbol,0,0)<=stop_time)//Исключаем временной интервал
           {
            BuyNow=false; //указываете то, что будите блокировать
            SellNow=false;//указываете то, что будите блокировать
           }
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий