Время работы или как сделать паузу в работе советника для 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 вида паузы:
- Когда время Начала паузы МЕНЬШЕ времени КОНЦА паузы, т.е. когда паузу не надо переносить через полночь.
- Когда время Начала паузы БОЛЬШЕ времени КОНЦА паузы, т.е. когда паузу надо переносить через полночь.
Данная конструкция работает прекрасно и корректно. Конечно, есть и другие способы реализации паузы в торговых экспертах, но, я пользуюсь такой. Всем добра.
Подскажите, а как еще учитывать дни недели?
drivermql Reply:
10 января, 2019 at 12:17
По DayOfWeek()
У меня заработало только после изменения форматы даты.
С "0:00" на "00:00"
А как время задавать? Если например советник должен торговать с 9.00 до 14.00 потом к примеру 1 час не должен торговать,и потом к примеру должен опять торговать с 15.00 до 20.00. Время торговли взято для примера,вопрос как ему задать нессколько пауз? Заранее спасибо!
drivermql Reply:
10 января, 2019 at 12:18
Две таких сделайте, или две функции. Можно в одной, но путаницы будет много
Спасибо! Буду пробовать.
Спасибо за простое решение!
Подскажите, пауза работает в соотвии с временем брокера или терминала.
Еще бы перед началом паузы реализовать закрытие открытых и отложенных ордеров…
drivermql Reply:
20 января, 2018 at 21:19
Здравствуйте! Время терминала.
Закрытие что-то типа такого:
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;
}
}
}
}
Спасибо. Работает
Отлично, просто и понятно.
Именно такую реализацию контроля времени искал для своего советника.