Новая версия платформы MetaTrader 5 build 2007: Экономический календарь, MQL5-программы в виде сервисов
// Скрипт ловит ситуации, когда ордер сделки отсутствует в истории. #define _CS(A) ((!::IsStopped()) && (A)) #define TOSTRING(A) #A + " = " + (string)(A) + " " #define OFFSET 100 void OnStart() { datetime PrevTime = OFFSET; while (_CS(true)) { if (HistorySelect(PrevTime - OFFSET, INT_MAX)) { const int Total = HistoryDealsTotal(); for (int i = 0; _CS(i < Total); i++) { const ulong DealTicket = HistoryDealGetTicket(i); const ulong OrderTicket = HistoryDealGetInteger(DealTicket, DEAL_ORDER); int Count = 0; const ulong StartTime = GetMicrosecondCount(); while ((HistoryOrderGetInteger(OrderTicket, ORDER_TICKET) != OrderTicket) && !HistoryOrderSelect(OrderTicket)) // Если нет ордера сделки Count++; if (Count) Alert(TOSTRING(DealTicket) + TOSTRING(OrderTicket) + TOSTRING(Count) + TOSTRING(GetMicrosecondCount() - StartTime)); // Распечатываем ситуацию PrevTime = (datetime)HistoryDealGetInteger(DealTicket, DEAL_TIME); } } Sleep(0); // Без этого Терминал мгновенно вешается. } }
Если закомментировать Sleep, то запуском мгновенно убьете Терминал. Но речь пойдет о другом.
Оказалось, что элементарно поймать ситуацию, когда ордер сделки отсутствует в истории: сделка есть, а ее ордер - нет.
Результат работы скрипта на MQ-Demo
Alert: DealTicket = 336236873 OrderTicket = 356249474 Count = 1614408 GetMicrosecondCount()-StartTime = 229880 Alert: DealTicket = 336236882 OrderTicket = 356249486 Count = 1565921 GetMicrosecondCount()-StartTime = 229998 Alert: DealTicket = 336236887 OrderTicket = 356249492 Count = 1559345 GetMicrosecondCount()-StartTime = 229788 Alert: DealTicket = 336236898 OrderTicket = 356249505 Count = 157107 GetMicrosecondCount()-StartTime = 22878 Alert: DealTicket = 336236901 OrderTicket = 356249508 Count = 1544271 GetMicrosecondCount()-StartTime = 220879
Больше 200мс нужно ждать появления в истории ордера сделки! Все это время невозможно определить, например, проскальзывание и длительность исполнения.
Представьте себе ситуацию, что нужен Сервис, который пишет в файл данные по только что закрытым позициям. Из-за этой "фичи" сделать это просто не получится.
Правильно ли понимаю, что эту архитектурную особенность MT5 никак не поправить?
if (HistorySelect(PrevTime - OFFSET, INT_MAX))
PrevTime - OFFSET = 0
?
Зачем объявлять #define OFFSET 100
Потом datetime PrevTime = OFFSET;
А затем из 100 вычитать 100?
Зачем объявлять #define OFFSET 100
Потом datetime PrevTime = OFFSET;
А затем из 100 вычитать 100?
Потому что PrevTime - время последней рассмотренной сделки.
По какой причине не выпускается миллисекундная TimeCurrent?
Вот нужно посчитать длительность текущей позиции. Сейчас время открытия всегда больше TimeCurrent в этот момент.
1999 - сломали вкладку Журнал Тестера: пустая всегда. В лог-файлах Тестера все есть.
У кого есть свежий билд с работающим Журналом, скиньте, пожалуйста.
void OnStart() { double Array[] = {0, 0, 0}; ArrayPrint(Array); // 0.0 0.0 0.00000 }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
21 февраля 2019 года будет выпущена обновленная версия платформы MetaTrader 5. Обновление содержит следующие изменения:
- Terminal: Полностью обновлен встроенный экономический календарь.

- Terminal: Добавлен новый тип MQL5-программ — Сервисы. Они позволяют
создавать собственные источники ценовых данных для терминала — передавать цены
от внешних систем в режиме реального времени так, как это делают
торговые серверы брокеров.

- Terminal: Добавлена система обучения.

- Terminal: История торгового счета может быть представлена в виде позиций — платформа собирает данные по
сделкам, относящимся к позиции (открытие, наращивание, частичное и
полное закрытие), и группирует эти данные в единую запись. Это позволяет
легко посмотреть время открытия и закрытия позиции, ее объем, цену и
суммарный результат. Теперь это представление доступно и в отчетах по
истории, экспортируемых в файлы.

- Terminal: Оптимизирован диалог закрытия торговой позиции встречной. Теперь его работа не замедляется при большом количестве открытых позиций.
- Terminal: Исправлены ошибки расчета синтетических инструментов, приводившие к образованию пропусков данных.
- Terminal: Теперь при удалении пользовательского инструмента удаляются файлы с его тиковой и баровой историей. Это позволяет избежать накапливания неиспользуемых данных на жестком диске.
- Terminal: Исправлено отображение результатов поиска на мониторах High DPI.
- MQL5: Добавлен доступ к данным экономического календаря через MQL5-программы.
- MQL5: Исправлена и значительно ускорена работа с тиковой и баровой историей.
- MQL5:
Исправлены и значительно ускорены функции изменения
тиковой и баровой истории у пользовательских торговых инструментов CustomTicks* и CustomRates*.
- MQL5: Добавлены новые функции преобразования данных.
- Добавлена функция MathSwap для смены порядка байт в значении ushort, uint и ulong.
- MQL5: Добавлены сетевые функции для создания TCP-соединений с удаленными хостами через системные сокеты:
- SocketCreate — создает сокет с указанными флагами и возвращает его хэндл
- SocketClose — закрывает сокет
- SocketConnect — выполняет подключение к серверу с контролем таймаута
- SocketIsConnected — проверяет, подключен ли сокет в текущий момент времени
- SocketIsReadable — получает количество байт, которое можно прочитать из сокета
- SocketIsWritable — проверяет, возможна ли запись данных в сокет в текущий момент времени
- SocketTimeouts — устанавливает таймауты получения и отправки данных для системного объекта сокета
- SocketRead — читает данные из сокета
- SocketSend — записывает данные в сокете
- SocketTlsHandshake — инициирует защищенное TLS (SSL)-соединение с указанным хостом по протоколу TLS Handshake
- SocketTlsCertificate — получает данные о сертификате, используемом для защиты сетевого соединения
- SocketTlsRead — читает данные из защищенного TLS-соединения
- SocketTlsReadAvailable — читает все доступные данные из защищенного TLS-соединения
- SocketTlsSend — отправляет данные через защищенное TLS-соединение
Адрес хоста, к которому производится подключение при помощи сетевых функций, должен быть явно добавлен в список разрешенных в настройках терминала.
- ERR_NETSOCKET_INVALIDHANDLE (5270) — в функцию передан неверный хэндл сокета
- ERR_NETSOCKET_TOO_MANY_OPENED (5271) — открыто слишком много сокетов (максимум 128)
- ERR_NETSOCKET_CANNOT_CONNECT (5272) — ошибка соединения с удаленным хостом
- ERR_NETSOCKET_IO_ERROR (5273) — ошибка отправки/получения данных из сокета
- ERR_NETSOCKET_HANDSHAKE_FAILED (5274) — ошибка установления защищенного соединения (TLS Handshake)
- ERR_NETSOCKET_NO_CERTIFICATE (5275) — отсутствуют данные о сертификате, которым защищено подключение
- MQL5: Добавлены
новые функции для работы со строками:
- MQL5: Добавлены новые функции для работы с массивами:
- MQL5: В функции CustomRatesUpdate, CustomRatesReplace, CustomTicksAdd и CustomTicksReplace добавлен параметр "uint count" для указания количества элементов
передаваемого массива, которые будут использованы. По умолчанию для
параметра используется значение WHOLE_ARRAY. Оно означает, что будет
использован весь массив.
- MQL5: Добавлена функция CustomBookAdd — передает состояние стакана цен по пользовательскому инструменту.
Функция позволяет транслировать стакан цен так, как если бы он приходил
от сервера брокера.
- MQL5:
Добавлена перегрузка функции CustomSymbolCreate,
позволяющая создать
пользовательский торговый инструмент на основе уже имеющегося. После
создания любое свойство символа можно поменять на нужное значение
соответствующими функциями.
- Обновлена функция StringToTime, преобразующая строку с датой/временем в значение типа datetime. Теперь она поддерживает следующие форматы дат:
- yyyy.mm.dd [hh:mi]
- yyyy.mm.dd [hh:mi:ss]
- yyyymmdd [hh:mi:ss]
- yyyymmdd [hhmiss]
- yyyy/mm/dd [hh:mi:ss]
- yyyy-mm-dd [hh:mi:ss]
- MQL5: В перечисление ENUM_TERMINAL_INFO_INTEGER добавлено свойство TERMINAL_VPS — признак того, что терминал запущен на виртуальном сервере MetaTrader Virtual Hosting (MetaTrader VPS). Если программа запущена на хостинге, вы можете
отключать все ее визуальные функции, поскольку на виртуальном сервере
отсутствует графический пользовательский интерфейс.
- MQL5: В перечисление ENUM_SYMBOL_INFO_INTEGER добавлено новое свойство SYMBOL_EXIST — признак того, что символ с таким именем существует.
- MQL5: Исправлена типизация при использовании предварительного объявления шаблонной функции.
- MQL5: Добавлена переинициализация индикаторов при смене торгового счета.
- MQL5: Оптимизирована работа функции StringSplit.
- MQL5: Исправлены ошибки в стандартной библиотеке.
- Tester: Добавлена
функция TesterStop — штатное досрочное завершение работы советника на агенте тестирования.
Теперь вы можете принудительно остановить тестирование при достижении
заданного количества убыточных сделок, заданного уровня просадки или по
любым другим критериям.
- Tester: Отключена возможность тестирования и оптимизации экспертов через MQL5 Cloud Network в режиме использования реальных тиков. Такой режим можно использовать только на локальных агентах и фермах в локальной сети.
- Tester:
Улучшена работа с индикаторами при визуальном тестировании. Теперь
ценовой график и индикаторные линии отрисовываются синхронно даже при максимальной скорости визуализации.
- Tester: Оптимизированы и значительно ускорены тестирование и оптимизация.
- Tester:
Исправлена отладка индикаторов на исторических данных. Теперь
функции OnInit и OnDeinit индикаторов можно отлаживать корректно.
- Tester: Ускорен доступ к историческим данным при тестировании мультивалютных экспертов.
- Tester: Исправлены ошибки, приводящие к зависанию визуального тестера при отладке на исторических данных.
- Tester: Ускорен запуск проходов оптимизации при обработке агентом пакета заданий.
- Tester:
Изменена политика раздачи пакетов заданий агентам тестирования. Размер
пакета был увеличен, что привело к значительному снижению накладных
расходов на сетевые операции.
- Tester:
Изменено поведение опции использования локальных, сетевых и облачных
агентов. Теперь при отключении этих опций уже выданные задания
обрабатываются до конца, а новые перестают выдаваться. Ранее эти опции
работали аналогично команде "Отключить", которая останавливала работу
агентов сразу.

- MetaEditor:
Добавлена поддержка не-ANSI символов в отладчике. Теперь наблюдаемые
выражения отображаются корректно, даже если имя переменной указано
кириллицей.
- MetaEditor: Исправлено отображение результатов поиска на мониторах High DPI.
- Добавлен перевод пользовательского интерфейса на Хорватский язык.
- Обновлена документация.
Обновление будет доступно через систему LiveUpdate.Экономический календарь — наша собственная разработка. В нем доступны более 600 показателей и индикаторов 13 крупнейших экономик мира: США, Евросоюза, Японии, Великобритании, Канады, Австралии, Китая и т.д. Все данные собираются в режиме реального времени из открытых источников.
Помимо обновления содержимого, в календаре стали доступны расширенные фильтры событий: по времени, приоритету, валютам и странам.
Также данные календаря теперь можно запрашивать из MQL5-программ. Более подробная информация об этом приведена ниже.
В отличие от советников, индикаторов и скриптов, сервисы не привязаны к конкретному графику. Они работают в фоновом режиме и начинают работу автоматически при запуске терминала (если они не были принудительно остановлены).
Для управления сервисами в Навигатор добавлен отдельный подраздел:
Создание сервисов
Для создания шаблона сервиса используйте соответствующий пункт в Мастере MQL5. Сервисы имеют одну точку входа OnStart, аналогично скриптам. В ней вы можете организовать бесконечный цикл получения и обработки данных при помощи сетевых функций.
Запуск сервисов
Для запуска нескольких копий одного советника или индикатора с разными параметрами достаточно наложить его на разные графики. При этом создаются отдельные экземпляры программы, которые работают независимо друг от друга. Сервисы не привязаны к графикам, поэтому для создания их экземпляров предусмотрен отдельный механизм.
Выберите в навигаторе сервис и нажмите "Добавить сервис" в его контекстном меню. Будет открыт стандартный диалог MQL5-программы, где вы можете разрешить/запретить торговлю и доступ к сигналам, а также задать параметры.

Для запуска и остановки экземпляра сервиса используйте его меню. Для управления всеми экземплярами, используйте меню самого сервиса.Теперь новички смогут легко научиться работать с платформой. Мы добавили более 100 интерактивных советов по ее основным функциям.
- Советы не будут отвлекать от работы с платформой — они аккуратно встроены на панель инструментов в виде прогресс-бара.
- Советы показываются только для действий, которые вы еще не выполняли в платформе.
- В
советы встроены интерактивные ссылки для перехода к определенным
элементам интерфейса платформы. Например, прямо из совета можно открыть
торговый диалог или меню с нужной командой.
По мере прохождения обучения и выполнения действий в платформе строка прогресса будет заполняться.Новые функции
CalendarCountryById — получение описания страны по идентификатору.
CalendarEventById — получение описания события по идентификатору.
CalendarValueById — получение описания значения события по идентификатору.
CalendarEventByCountry — получение массива доступных новостей по стране.
CalendarEventByCurrency — получение массива доступных новостей по валюте, на которую они влияют.
CalendarValueHistoryByEvent — получение массива значений за указанный период времени по идентификатору события.
CalendarValueHistory — получение массива значений по всем событиям за заданный период времени с фильтрацией по стране и/или валюте.
CalendarValueLastByEvent — получение массива последних значений события по идентификатору. Эта функция позволяет запрашивать только те значения, которые изменились с момента последнего запроса. Для этого используется ее in/out параметр "change_id".
При каждом изменении базы данных календаря у него обновляется свойство "change_id" — идентификатор последнего изменения. При запросе данных вы указываете "change_id" и терминал возвращает вам события, появившиеся в календаре, начиная с этого момента, а также текущее значение "change_id", которое можно использовать для следующего запроса. При первом вызове функции укажите нулевой "change_id", функция при этом не вернет никаких событий, но передаст вам текущий "change_id" для последующих запросов.
CalendarValueLast — получение массива последних значений по всем событиям с фильтрацией по стране и/или валюте. Эта функция позволяет запрашивать только те значения, которые изменились с момента последнего запроса. Аналогично CalendarValueLastByEvent, для запроса используется свойство "change_id".
Новые структуры
MqlCalendarCountry — описание страны.
MqlCalendarEvent — описание события.
MqlCalendarValue — описание значения события.
Новые перечисления
Новые коды ошибок
CharArrayToStruct — копирует массив типа uchar в POD-структуру.
StructToCharArray — копирует POD-структуру в массив типа uchar.
Для работы с сетевыми функциями добавлены новые коды ошибок:
StringReserve — резервирует в памяти для строки буфер указанного размера.
StringSetLength — устанавливает для строки указанную длину в символах.
ArrayRemove — удаляет из массива указанное число элементов, начиная с указанного индекса.
ArrayInsert — вставляет в массив-приемник из массива-источника указанное число элементов, начиная с указанного индекса.
ArrayReverse — разворачивает в массиве указанное число элементов, начиная с указанного индекса.
Имя символа, из которого будут скопированы свойства создаваемого пользовательского символа, указывается в параметре "symbol_origin".
Тестирование, завершенное при помощи этой функции, считается успешным. После ее вызова терминалу передается торговая история, полученная в результате тестирования, а также все торговые статистики.