Чт. Ноя 21st, 2024

Время работы или как сделать паузу в работе советника для MT4

Время

Часто нужно ограничить работу советника. Например, чтобы не торговал в определенные периоды времени: ночью, в какую-то определенную торговую сессию, во время выхода новостей. Или наоборот, надо сделать так, чтобы он торговал исключительно ночью.

Итак, внешние параметры:

input bool   p           = false; // задействовать паузу или нет
input string TimeStart   = "0:00"; // время старта паузы
input string TimeEnd     = "0:00"; // конец паузы

Формат: ЧАС:МИНУТЫ.

В глобальных переменных советника объявляем две переменные типа datetime:

datetime StartPause,EndPause;

Далее уже в OnTick() переводим строки TimeStart и TimeEnd в формат datetime:

StartPause = StrToTime(TimeStart);  
EndPause   = StrToTime(TimeEnd);

Далее сам код паузы:

if((p && StartPause < EndPause && (TimeCurrent() > StartPause &&  TimeCurrent() < EndPause)))
{
            Comment("Пауза в работе советника");
            return;
}

if((p && StartPause > EndPause && (TimeCurrent() > StartPause ||  TimeCurrent() < EndPause)))
{
            Comment("Пауза в работе советника");
            return;
}

Как видно, здесь 2 вида паузы:

  1. Когда время Начала паузы МЕНЬШЕ времени КОНЦА паузы, т.е. когда паузу не надо переносить через полночь.
  2. Когда время Начала паузы БОЛЬШЕ времени КОНЦА паузы, т.е. когда паузу надо переносить через полночь.

Данная конструкция работает прекрасно и корректно. Конечно, есть и другие способы реализации паузы в торговых экспертах, но, я пользуюсь такой. Всем добра.

от drivermql

10 комментариев к «Время работы советника»
  1. Подскажите, а как еще учитывать дни недели?

    drivermql Reply:

    По DayOfWeek()

  2. А как время задавать? Если например советник должен торговать с 9.00 до 14.00 потом к примеру 1 час не должен торговать,и потом к примеру должен опять торговать с 15.00 до 20.00. Время торговли взято для примера,вопрос как ему задать нессколько пауз? Заранее спасибо!

    drivermql Reply:

    Две таких сделайте, или две функции. Можно в одной, но путаницы будет много

  3. Спасибо за простое решение!

    Подскажите, пауза работает в соотвии с временем брокера или терминала.

    Еще бы перед началом паузы реализовать закрытие открытых и отложенных ордеров…

     

    drivermql Reply:

    Здравствуйте! Время терминала.

    Закрытие что-то типа такого:

    for(int i=0; OrdersTotal()>0; i++)
      {
       if(OrderSelect(i,SELECT_BY_POS))
         {
          bool orders=false;
          while(!orders)
            {
             if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,300,clrNONE);
             if(OrderType()== OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,300,clrNONE);
             if(OrderType()>1) OrderDelete(OrderTicket(),clrNONE);

             if(OrdersTotal()==0)
               {
                orders=true;
                break;
               }
            }
         }
      }

  4. Отлично, просто и понятно.
    Именно такую реализацию контроля времени искал для своего советника.

Добавить комментарий

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.