Новая версия платформы 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. Обновление содержит следующие изменения:
Экономический календарь — наша собственная разработка. В нем доступны более 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".
Тестирование, завершенное при помощи этой функции, считается успешным. После ее вызова терминалу передается торговая история, полученная в результате тестирования, а также все торговые статистики.