[MQL4] Функция ограничения работы советника за период времени

DozorFX

DozorFX

Постоялец
Команда форума
Модератор
Монет
34,434
Коллеги поделитесь функцией по ограничению времени работы. С часами все понятно а вот с периодами в днях не могу сообразить.
Задача следующая:
что бы включался запрет с 15.12(15декабря) по 15.01(15января) открытии ордеров
 
можно через такую функцию

DayOfYear

Возвращает текущий день года последнего известного времени сервера.

int DayOfYear();

Возвращаемое значение

Текущий день года (1-1 января,..,365(6) - 31 декабря).

Примечание

При тестировании последнее известное время сервера моделируется.

Пример:

if(DayOfYear()==245)
return(true);
 
  • Лайк
Реакции: DozorFX
Роман, Спасибо. Но задачка была другая и никак не мог сообразить. Тем более с функциями дат запутываюсь. Но разобрался уже. Может кто поправит или поможет оптимизирует функцию.

extern string F222 = "===== ФИЛЬТР ТОРГОВ ПО ДАТАМ =====";

extern bool Data1 = false; // фильтр отключения советника в промежутке дат
extern string DataStart1 = "15.12"; // день/месяц начальная дата фильтра
extern string DataEnd1 = "15.01"; // день/месяц конечная дата фильтра

//+-------------------------------------------------------------------------------------------------------------------------------------------------+
//| Функция ограничения по датам в промежутке времени |
//+-------------------------------------------------------------------------------------------------------------------------------------------------+
bool CheckData()
{
if (Data1 == true) // если включен фильтр
{
string startData= DataStart1+"."+ IntegerToString(Year()); // число/месяц/год в формате строки начальная дата фильтра
string endData = DataEnd1+"."+ IntegerToString(Year()); // число/месяц/год в формате строки конечная дата фильтра

datetime ND_Data= StringToTime(startData); // преобразавание число/месяц/год в формат даты начальная дата фильтра
datetime KD_Data=StringToTime(endData); // преобразавание число/месяц/год в формат даты конечная дата фильтра
//datetime SD_Data= TimeCurrent(); //

int ND_Day_Of_Year= TimeDayOfYear(ND_Data); // день года начальной даты фильтра
int KD_Day_Of_Year= TimeDayOfYear(KD_Data); // день года конечной даты фильтра
int SD = DayOfYear(); // день года сегодня

if (ND_Day_Of_Year > KD_Day_Of_Year) // если день начала > дня окончания (это случай когда фильтр дат установлен через Новый год)
if(SD>=ND_Day_Of_Year || SD<=KD_Day_Of_Year) return (false);

if (ND_Day_Of_Year <= KD_Day_Of_Year) // если день начала <= дня окончания (это случай когда фильтр дат установлен в течении 1 года или месяца))
if(SD>=ND_Day_Of_Year && SD<=KD_Day_Of_Year) return (false);
}
return (true);
 
  • Лайк
Реакции: romanzif
Можно проще:
if((Day()>=15 && Month()==12) && (Day()<=15 && Month()==1)) return(false);
Спасибо, возьму на заметку. Но у меня переменные даты внешние вводятся. Тогда нужно и во внешних переменных отдельно число и месяц указывать.
 
Тогда нужно и во внешних переменных отдельно число и месяц указывать.
Не нужно. Внешняя переменная - тип дата, из неё функциями TimeDay() и TimeMonth() можно вытянуть то, что нужно. А год, если не нужен, можно задать любой.

Внешняя переменная может быть и в строковом формате yyyy.mm.dd [hh:mi], тогда её вначале надо преобразовать функцией StrToTime()

Я, кстати, себе тоже делал график торгов и столкнулся с тем, что проще не задавать периоды, переходящие через год. В данном случае я бы задал 2 периода неторгов: 15-31 декабря и 1-15 января :)
 
Последнее редактирование:
  • Лайк
Реакции: T800, DozorFX и romanzif

Проверенные Брокеры

Реклама

Заработок онлайн

Назад
Верх