Содержание
Доброго времени суток.
Сегодня мы разберем, как работать со временем в редакторе Meta Editor, изучим вспомогательные функции для типа данных datetime, а также научимся узнавать основные параметры для вашего торгового счета.
Дата и время
По традиции мы разберем только самые используемые функции, чтобы избежать переизбытка информации в одном посте. За время отвечает тип данные datetime, который является целым типом и хранит информацию о времени, начиная с 01 Января 1970 года, что эквивалентно значению 0 в представлении int. Максимальное значение даты в терминале, судя по справке, достигает 31 Декабря 3000 года.
Дату можно задавать вручную через целое значение int, например:
0 1 |
datetime d1 = 1609286400; Print(d1); //Результат 2020.12.30 00:00:00 |
В таком формате значение храниться на многих сайтах в интернете и в других источниках, это время в секундах с момента его начальной точки отсчета.
Соответственно, раз дату можно использовать как целое число, то к ней можно прибавлять и вычитать время. Попробуем прибавил к дате, что мы задали выше, 12 часов. Для этого умножим часы на 60 минут, а затем еще раз умножим полученное значение на 60 секунд, чтобы преобразовать время в секунды, оно будет равняться 43200.
0 1 2 |
datetime d1 = 1609286400; datetime d2 = d1+12*60*60; Print(d2); //Результат 2020.12.30 12:00:00 |
Время в терминале имеет формат YYMMDD, вручную же оно может задаваться как в таком варианте, так и в привычном нам формате DDMMYY. Вручную время прописывается через заглавную букву D между двумя апострофами: D’01.05.2010 00:00′.
0 1 2 |
datetime d3=D'1988.12.01 00:00'; datetime d4=D'01.12.1988 00:00'; Print(TimeToString(d3,TIME_DATE|TIME_MINUTES) + "/"+ TimeToString(d4,TIME_DATE|TIME_MINUTES)); |
Давайте вначале посмотрим на функции, отвечающие за конкретное время.
- TimeCurrent() — текущей время брокера, которое отображается в окне обзора рынка. Оно равно последнему известному времени сервера, времени последнего тика и обновления котировок. Как известно, рынок не работает по выходным, соответственно данное значение не обновляется в Субботу и в Воскресенье. Хранится в формате datetime.
- TimeLocal() — текущее время на вашем компьютере, зависит от настроек оперативной системы. В торговле я его не применяю, но с его помощью можно получить значение GMT вашего брокера с помощью простой математики. Но если честно, это не совсем правильный способ, потому что настройки на рабочем компьютере не всегда корректны, и если есть необходимость получить данные GMT, то лучше воспользоваться нашим скриптом Check Broker GMT.
0 1 2 |
datetime TimeBroker = TimeCurrent(); datetime TimeComp = TimeLocal(); Print(TimeToString(TimeBroker) + "/"+ TimeToString(TimeComp)); |
- Seconds(), Minute(), Hour(), Day(), Month(), Year() — все перечисленные функции выдают отдельные единицы значений времени от последнего известного времени на сервере брокера: секунды, минуты, час, день, месяц и год. Тип данных у функций int, т.е. они являются целым числом: секунды считаются от 0 до 59, часы от 0 до 23, дни от 1 до 31 и т.д. Параметров у них нет, прописываются пустые скобки (). Нужны эти функции для работы с отдельными показателями, а не со всем значением времени. К примеру вам нужно совершать какое-то действие раз в час, либо ваша торговая система должна открывать сделки строго начиная с 22:15 до 00:00, а может вы хотите прекратить торговлю в 23:00, для этого нужно проверять конкретный час.
0 1 2 3 4 5 |
Print("Текущее значение секунд: " + IntegerToString(Seconds())); Print("Текущее значение минут: " + IntegerToString(Minute())); Print("Текущее значение часа: " + IntegerToString(Hour())); Print("Текущее день: " + IntegerToString(Day())); Print("Текущий месяц: " + IntegerToString(Month())); Print("Текущий год: " + IntegerToString(Year())); |
- TimeSeconds(), TimeMinute(), TimeHour(), TimeDay(), TimeMonth(), TimeYear() — эти функции схожи с теми, что рассмотрели выше, но имеют единственное отличие — они выдают значение не по текущему времени сервера, а по конкретному времени: торгового ордера, указанному пользователей вручную, либо какого-то события. К примеру вы хотите знать час конкретного закрытого ордера или минуту созданного объекта. Тип данных также int, параметр один — заданное время.
0 1 2 3 4 5 6 |
datetime order_time = D'01.12.1999 00:05'; Print("Заданное значение секунд: " + IntegerToString(TimeSeconds(order_time))); Print("Заданное значение минут: " + IntegerToString(TimeMinute(order_time))); Print("Заданное значение часа: " + IntegerToString(TimeHour(order_time))); Print("Заданный день: " + IntegerToString(TimeDay(order_time))); Print("Заданный месяц: " + IntegerToString(TimeMonth(order_time))); Print("Заданный год: " + IntegerToString(TimeYear(order_time))); |
- DayOfWeek() — периодически бывает необходимость узнать какой сейчас день недели по времени брокера, для этого и нужна данная функция. Время начинает свой отсчет с Воскресенья (как заведено в западных странах) и приравнивается к нулю. Соответственно Понедельник это 1, Вторник — 2… Суббота — 6. С помощью этой функции можно ограничить торговлю или работу части кода эксперта в определенных день недели.
- DayOfYear() — функция для определения текущего дня в году по времени сервера. Первое Января это единица, 31 Декабря, соответственно 365( или 366). Я ее использую, чтобы выполнять определенные проверки в коде только раз в день для ускорения его работы.
- TimeDayOfWeek(), TimeDayOfYear() — функции определения дня недели или дня года для определенного, указанного времени.
0 1 2 3 4 5 6 7 8 9 |
int day_of_week = DayOfWeek(); int day_of_year = DayOfYear(); Print("День недели: ",day_of_week); Print("День в году: ",day_of_year); datetime time1 =D'14.11.2008'; int day_of_week2 = TimeDayOfWeek(time1); int day_of_year2 = TimeDayOfYear(time1); Print("Указанный день недели: ",day_of_week2); Print("Указанный день в году: ",day_of_year2); |
0 1 2 3 4 5 6 7 8 9 10 |
struct MqlDateTime { int year; // год int mon; // месяц int day; // день int hour; // час int min; // минуты int sec; // секунды int day_of_week; // день недели (0-воскресенье, 1-понедельник, ... ,6-суббота) int day_of_year; // порядковый номер в году (1 января имеет номер 0) }; |
0 1 2 3 4 5 6 7 8 9 |
datetime date = D'2010.05.01 15:10:06'; //Назначаем дату MqlDateTime str1; //объявляем переменную для хранения структуры TimeToStruct(date,str1); //переводим время date в формат структуры Print("Пользовательское значение секунд: ",str1.sec); Print("Пользовательское значение минут: ",str1.min); Print("Пользовательское значение часов: ",str1.hour); Print("Пользовательское значение дня: ",str1.day); Print("Пользовательское значение месяца: ",str1.mon); Print("Пользовательское значение года: ",str1.year); |
Мы рассмотрели одну из заданных структур. В редакторе Meta Editor храниться восемь предопределенных структур для хранения и передачи информации, нам пока они не понадобятся. Также стоит знать, что структуру можно создавать пользовательскую, со своим набором переменных, но это тема других уроков.
Информация о счете
При работе с терминалом порой требуется отобразить имя брокера, сервер или номер торгового счета, узнать значение текущего баланса, дохода, маржу или плечо. Эти и другие данные можно узнать через функции определения информации о счете.
Функции типа string:
- AccountCompany() — функция выводит наименование брокерской компании, где у вас открыт торговый счет.
0 |
Print("Ваша брокерская компания: ", AccountCompany()); |
- AccountName() — имя пользователя торгового счета.
0 |
Print("Счет зарегистрирован на: ", AccountName()); |
- AccountServer() — наименование торгового сервера.
0 |
Print("Торговый сервер: ", AccountServer()); |
- AccountCurrency() — валютная пара, которую вы выбрали при открытии торгового счета. От валюты счета зависит стоимость пункта. Функция иногда используется для расчетов в торговле, а также для приписки в комментариях после значения дохода или убытка, потому что ставить вручную знак «$» не совсем корректно, у пользователя может быть открыт счет и в рублях и в тугриках.
0 |
Print("Ваш доход составил 500 ",AccountCurrency()); |
- AccountNumber() — номер вашего торгового счета, который назначает брокер при регистрации.
0 |
Print("Номер вашего торгового счета: ", AccountNumber()); |
- AccountLeverage() — значение кредитного плеча на текущем торговом счете. Плечо имеет формат 1:20, 1:100, 1:500 и т.д., это означает, что на каждые 500 долларов вы должны вложить только 1 доллар. Функция выводит информацию именно о допустимом плече не счете, т.е. для привычного отображения в журнале вы должны сами дописать «1:»
0 |
Print("Кредитное плечо: 1:", AccountLeverage()); |
Функции типа double:
- AccountBalance() — функция возвращает значение текущего баланса торгового счета в валюте депозита, т.е. объем средств, не учитывающий текущие открытые сделки.
0 |
Print("Зафиксированный баланс счета: ",AccountBalance()," ", AccountCurrency()); |
- AccountEquity() — значение средств на текущем счете. Т.е. это значение баланса, который учитывает прибыль или убыток по открытым ордерам.
0 |
Print("Средства счета: ",AccountEquity()," ", AccountCurrency()); |
- AccountProfit() — суммарная прибыль, либо убыток ваших открытых ордеров. Значение плавающее и меняется каждый тик, если в рынке есть ордера. Для вывода информации в журнал не забывайте приводить формат double в string. (Более подробно я рассказывал в этом уроке). В данном случае все операции, связанные с балансом нужно округлять до 2 знаков после запятой:
0 |
Print("Плавающая прибыль: ", DoubleToString(AccountProfit(),2)," ", AccountCurrency()); |
- AccountCredit() — значение кредита на торговом счете. Многие брокеры в это определение включают бонусные средства на счете, которые они начисляют по разнообразным внутренним акциям, например бонус за пополнение счета. Данные средства не учитываются в расчете просадки всего счета и могут сыграть против трейдера. Рекомендую очень внимательно читать описание бонусных программ, перед тем, как соглашаться на их использование. В большинстве случаев это просто замануха и чтобы вывести эти деньги, нужно совершить торговлю огромным суммарным лотом за месяц или год, что при нормальных рисках просто не представляется возможным.
0 |
Print("Кредит счета ", DoubleToString(AccountCredit(),2)," ", AccountCurrency()); |
- AccountMargin() — суммарный залог, который внесен на поддержание уже открытых позиций на счете. Зависит от значения кредитного плеча, валютной пары и т.д.
0 |
Print("Сумма залога: ", DoubleToString(AccountMargin(),2)," ", AccountCurrency()); |
- AccountFreeMargin() — функция для определения свободных средств, которые доступны для открытия новых позиций. Вычисляется как разница между балансом счета, прибылью/убытком открытых позиций, а также залогом, что вы отдали на поддержание уже открытых позиций.
0 |
Print("Свободная маржа: ", DoubleToString(AccountFreeMargin(),2)," ", AccountCurrency()); |
- AccountInfoDouble() — функция возвращает double значение по выбранному идентификатору свойства. Данный параметр выбирается из списка перечислений, туда включены как рассмотренные выше свойства, так и те, для которых нет отдельных функций. Допустим значение баланса мы может получить через функцию AccountBalance, а может воспользоваться данной функцией и свойством ACCOUNT_BALANCE:
0 1 2 |
double balance1 = AccountBalance(); double balance2 = AccountInfoDouble(ACCOUNT_BALANCE); Print("Результат идентичен: " + DoubleToString(balance1,2) + " = " + DoubleToString(balance2,2)); |
- AccountInfoInteger() — функция также выполняет вывод информации о торговом счете, только в типе данных int. Из новых свойств можно рассмотреть вывод информации о типе торгового счета, их существует три: демо счет (0), конкурсный счет(1) и реальный счет(2). Соответственно по цифре, которую выдаст в журнал принт можно понять тип счета.
0 |
Print("Тип торгового счета: ", AccountInfoInteger(ACCOUNT_TRADE_MODE)); |
0 1 |
Print("Это демо счет? ",IsDemo()); Print("Это режим тестирования? ",IsTesting()); |
0 |
Print("Разрешена ли торговля советниками? ",AccountInfoInteger(ACCOUNT_TRADE_EXPERT)," ",IsTradeAllowed()); |
Заключение
Думаю на сегодня хватит информации. Я рекомендую попрактиковаться с помощью скрипта на графике с выводом этих данных в журнал, чтобы частично запомнить эти функции. Без практики никуда. Все указанные выше функции внесены в .mql4 скрипт во вложении.
Советую сохранить наш сайт в закладки, в будущем планируется активное его развитие, появятся новые уроки mql, интересные статьи и полезный программный код.
[download url=»http://www.davinci-fx.com/wp-content/uploads/2021/01/1.3-Date-and-Time-account-info.rar» title=»Скачать примеры из урока»]
2 комментария. Оставить новый
Будут ли уроки по созданию индикатора с нуля?
Добрый день. Конечно, вот ссылка на 2 этап курса: http://www.davinci-fx.com/mql-first-indicator/
Но мы крайне рекомендуем вам проходить каждый урок последовательно, даже если вы думаете, что какие то отдельные разделы вам не интересны.