Python является современным высокоуровневым языком программирования для разработки сценариев и приложений. Содержит множество библиотек для машинного обучения, автоматизации процессов, анализа и визуализации данных.
Пакет MetaTrader для Python предназначен для удобного и быстрого получения биржевой информации через межпроцессное взаимодействие прямо из терминала MetaTrader 5. Полученные таким образом данные можно дальше использовать для статистических вычислений и машинного обучения.
Подключение
Функции
bool TesterDeposit( double money // размер вносимой суммы );
Обновлена документация.
Обновление будет доступно через систему LiveUpdate.
bool CalendarCountryById( const long country_id, // идентификатор страны MqlCalendarCountry& country // описание страны );CalendarEventById — получение описания события по идентификатору.
bool CalendarEventById( const long event_id, // идентификатор события MqlCalendarEvent& event // описание события );CalendarValueById — получение описания значения события по идентификатору.
bool CalendarValueById( const long value_id, // идентификатор значения MqlCalendarValue& value // описание значения );CalendarEventByCountry — получение массива доступных новостей по стране.
bool CalendarEventByCountry( string country_code, // код страны MqlCalendarEvent& events[] // массив событий );CalendarEventByCurrency — получение массива доступных новостей по валюте, на которую они влияют.
bool CalendarEventByCurrency( string currency, // валюта MqlCalendarEvent& events[] // массив событий );CalendarValueHistoryByEvent — получение массива значений за указанный период времени по идентификатору события.
bool CalendarValueHistoryByEvent( ulong event_id, // идентификатор события MqlCalendarValue& values[], // массив значений datetime datetime_from, // начальная дата datetime datetime_to=0 // конечная дата );CalendarValueHistory — получение массива значений по всем событиям за заданный период времени с фильтрацией по стране и/или валюте.
bool CalendarValueHistory( MqlCalendarValue& values[], // массив значений datetime datetime_from, // начало периода datetime datetime_to=0, // конец периода string country_code=NULL, // код страны string currency=NULL // валюта );CalendarValueLastByEvent — получение массива последних значений события по идентификатору. Эта функция позволяет запрашивать только те значения, которые изменились с момента последнего запроса. Для этого используется ее in/out параметр "change_id".
bool CalendarValueHistory( ulong event_id, // идентификатор события ulong& change_id, // идентификатор последнего изменения календаря MqlCalendarValue& values[] // массив значений );CalendarValueLast — получение массива последних значений по всем событиям с фильтрацией по стране и/или валюте. Эта функция позволяет запрашивать только те значения, которые изменились с момента последнего запроса. Аналогично CalendarValueLastByEvent, для запроса используется свойство "change_id".
bool CalendarValueHistory( ulong event_id, // идентификатор события ulong& change_id, // идентификатор последнего изменения календаря MqlCalendarValue& values[], // массив значений string country_code=NULL, // код страны string currency=NULL // валюта );
struct MqlCalendarCountry { ulong id; // идентификатор страны ISO 3166-1 string name; // текстовое название страны string code; // кодовое имя страны ISO 3166-1 alpha-2 string currency; // код валюты страны string currency_symbol; // символ/знак валюты страны string url_name; // имя страны, используемое в URL на сайте mql5.com };MqlCalendarEvent — описание события.
struct MqlCalendarEvent { ulong id; // идентификатор события ENUM_CALENDAR_EVENT_TYPE type; // тип события ENUM_CALENDAR_EVENT_SECTOR sector; // сектор, к которому относится событие ENUM_CALENDAR_EVENT_FREQUENCY frequency; // периодичность публикации события ENUM_CALENDAR_EVENT_TIMEMODE time_mode; // режим публикции события по времени ulong country_id; // идентификатор страны ENUM_CALENDAR_EVENT_UNIT unit; // единица измерения значения события ENUM_CALENDAR_EVENT_IMPORTANCE importance; // важность события ENUM_CALENDAR_EVENT_MULTIPLIER multiplier; // множитель значения события uint digits; // количество знаков после запятой в значении события string source_url; // URL источника string event_code; // код события string name; // текстовое имя события на языке терминала };MqlCalendarValue — описание значения события.
struct MqlCalendarValue { ulong id; // идентификатор значения ulong event_id; // идентификатор события datetime time; // время и дата события datetime period; // отчетный период события int revision; // ревизия публикуемого индикатора по отношению к отчетному периоду long actual_value; // актуальное значение события long prev_value; // предыдущее значение события long revised_prev_value; // пересмотренное предыдущее значение события long forecast_value; // прогнозное значение события ENUM_CALENDAR_EVENT_IMPACRT impact_type; // потенциальное влияние на курс валюты };
enum ENUM_CALENDAR_EVENT_FREQUENCY { CALENDAR_FREQUENCY_NONE =0, // не используется CALENDAR_FREQUENCY_WEEK =1, // неделя CALENDAR_FREQUENCY_MONTH =2, // месяц CALENDAR_FREQUENCY_QUARTER =3, // квартал CALENDAR_FREQUENCY_YEAR =4, // год CALENDAR_FREQUENCY_DAY =5, // день }; enum ENUM_CALENDAR_EVENT_TYPE { CALENDAR_TYPE_EVENT =0, // событие(митинг, речь и т.д.) CALENDAR_TYPE_INDICATOR =1, // индикатор CALENDAR_TYPE_HOLIDAY =2, // праздник }; enum ENUM_CALENDAR_EVENT_SECTOR { CALENDAR_SECTOR_NONE =0, // нет CALENDAR_SECTOR_MARKET =1, // рынок CALENDAR_SECTOR_GDP =2, // GDP CALENDAR_SECTOR_JOBS =3, // труд CALENDAR_SECTOR_PRICES =4, // цены CALENDAR_SECTOR_MONEY =5, // деньги CALENDAR_SECTOR_TRADE =6, // торговля CALENDAR_SECTOR_GOVERNMENT =7, // правительство CALENDAR_SECTOR_BUSINESS =8, // бизнес CALENDAR_SECTOR_CONSUMER =9, // потребитель CALENDAR_SECTOR_HOUSING =10, // жилье CALENDAR_SECTOR_TAXES =11, // налоги CALENDAR_SECTOR_HOLIDAYS =12, // праздники }; enum ENUM_CALENDAR_EVENT_IMPORTANCE { CALENDAR_IMPORTANCE_NONE =0, // нет CALENDAR_IMPORTANCE_LOW =1, // низкая CALENDAR_IMPORTANCE_MODERATE =2, // средняя CALENDAR_IMPORTANCE_HIGH =3, // высокая }; enum ENUM_CALENDAR_EVENT_UNIT { CALENDAR_UNIT_NONE =0, // нет CALENDAR_UNIT_PERCENT =1, // проценты CALENDAR_UNIT_CURRENCY =2, // национальная валюта CALENDAR_UNIT_HOUR =3, // количество часов CALENDAR_UNIT_JOB =4, // количество рабочих мест CALENDAR_UNIT_RIG =5, // количество вышек CALENDAR_UNIT_USD =6, // доллары США CALENDAR_UNIT_PEOPLE =7, // число людей CALENDAR_UNIT_MORTGAGE =8, // количество ипотечных кредитов CALENDAR_UNIT_VOTE =9, // число голосов CALENDAR_UNIT_BARREL =10, // количество баррелей CALENDAR_UNIT_CUBICFEET =11, // объем в кубических футах CALENDAR_UNIT_POSITION =12, // количество рабочих мест CALENDAR_UNIT_BUILDING =13 // количество строений }; enum ENUM_CALENDAR_EVENT_MULTIPLIER { CALENDAR_MULTIPLIER_NONE =0, // нет CALENDAR_MULTIPLIER_THOUSANDS =1, // тысячи CALENDAR_MULTIPLIER_MILLIONS =2, // миллионы CALENDAR_MULTIPLIER_BILLIONS =3, // миллиарды CALENDAR_MULTIPLIER_TRILLIONS =4, // триллионы }; enum ENUM_CALENDAR_EVENT_IMPACRT { CALENDAR_IMPACT_NA =0, // неизвестно CALENDAR_IMPACT_POSITIVE =1, // положительное CALENDAR_IMPACT_NEGATIVE =2, // отрицательное }; enum ENUM_CALENDAR_EVENT_TIMEMODE { CALENDAR_TIMEMODE_DATETIME =0, // источник публикует точное время CALENDAR_TIMEMODE_DATE =1, // событие занимает весь день CALENDAR_TIMEMODE_NOTIME =2, // источник не публикует время по событию CALENDAR_TIMEMODE_TENTATIVE =3, // источник не публикует заранее точного времени события, только день, время уточняется по факту наступления события };
ERR_CALENDAR_MORE_DATA =5400, // массив мал для всего результата (отданы значения, которые поместились в массив) ERR_CALENDAR_TIMEOUT =5401, // превышен таймаут ожидания ответа на запрос данных из календаря ERR_CALENDAR_NO_DATA =5402, // данные не обнаружены
bool CharArrayToStruct( void& struct_object, // структура const uchar& char_array[], // массив uint start_pos=0 // начальная позиция в массиве );StructToCharArray — копирует POD-структуру в массив типа uchar.
bool StructToCharArray( const void& struct_object, // структура uchar& char_array[], // массив uint start_pos=0 // начальная позиция в массиве );
ushort MathSwap(ushort value); uint MathSwap(uint value); ulong MathSwap(ulong value);
bool StringReserve( string& string_var, // строка uint new_capacity // размер буфера для хранения строки );StringSetLength — устанавливает для строки указанную длину в символах.
bool StringSetLength( string& string_var, // строка uint new_length // новая длина строки );
bool ArrayRemove( void& array[], // массив любого типа uint start, // с какого индекса начинаем удалять uint count=WHOLE_ARRAY // количество элементов );ArrayInsert — вставляет в массив-приемник из массива-источника указанное число элементов, начиная с указанного индекса.
bool ArrayInsert( void& dst_array[], // массив-приемник const void& src_array[], // массив источник uint dst_start, // индекс в массиве-приемнике для вставки uint src_start=0, // индекс в массиве-источнике для копирования uint count=WHOLE_ARRAY // количество вставляемых элементов );ArrayReverse — разворачивает в массиве указанное число элементов, начиная с указанного индекса.
bool ArrayReverse( void& array[], // массив любого типа uint start=0, // с какого индекса начинаем переворачивать массив uint count=WHOLE_ARRAY // количество элементов );
int CustomBookAdd( const string symbol, // имя символа const MqlBookInfo& books[] // массив с описаниями элементов стакана цен uint count=WHOLE_ARRAY // количество элементов, которые будут использованы );
bool CustomSymbolCreate( const string symbol_name, // имя пользовательского символа const string symbol_path="", // название группы, в которой будет создан символ const string symbol_origin=NULL // имя символа, на основе которого будет создан пользовательский символ );Имя символа, из которого будут скопированы свойства создаваемого пользовательского символа, указывается в параметре "symbol_origin".
Добавлен перевод пользовательского интерфейса на Хорватский язык.
Обновлена документация.
#import "TestLib.dll" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { int x=41; TestClass::Inc(x); Print(x); }C# код функции Inc класса TestClass выглядит следующим образом:
public class TestClass { public static void Inc(ref int x) { x++; } }В результате выполнения скрипт вернет значение 42.
struct MqlTick
{
datetime time; // Время последнего обновления цен
double bid; // Текущая цена Bid
double ask; // Текущая цена Ask
double last; // Текущая цена последней сделки (Last)
ulong volume; // Объем для текущей цены Last
long time_msc; // Время последнего обновления цен в миллисекундах
uint flags; // Флаги тиков
double volume_real; // Объем для текущей цены Last c повышенной точностью
};
struct MqlBookInfo { ENUM_BOOK_TYPE type; // тип заявки из перечисления ENUM_BOOK_TYPE double price; // цена long volume; // объем double volume_real; // объем с повышенной точностью };
//+------------------------------------------------------------------+ //| Default packing | //+------------------------------------------------------------------+ struct A { char a; int b; }; //+------------------------------------------------------------------+ //| Specified packing | //+------------------------------------------------------------------+ struct B pack(4) { char a; int b; }; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { Print("sizeof(A)=",sizeof(A)); Print("sizeof(B)=",sizeof(B)); } //+------------------------------------------------------------------+Вывод:
sizeof(A)=5 sizeof(B)=8Более подробная информация о выравнивании в структурах доступно в MSDN.
enum Main { PRICE_CLOSE_, PRICE_OPEN_ }; input Main Inp=PRICE_CLOSE; //+------------------------------------------------------------------+ //| Start function | //+------------------------------------------------------------------+ void OnStart() { }Компилятор выдаст предупреждение:
class X { }; void f(int) { } template<typename T> void a(T*) { new T(2); } // ранее в этом месте компилятор выдавал ошибку template<typename T> void a() { f(0); } void OnInit() { a<X>(); }
Обновлена документация.
Обновлена документация.
Обновлена документация.
Полностью переработан диалог открытия счетов. Теперь вы сначала выбираете интересующего брокера, а затем — тип счета, который хотите открыть. Благодаря этому список брокеров стал более компактным, поскольку в нем теперь отображаются названия компаний, а не всех доступных серверов.
Также для облегчения поиска в список добавлены логотипы компаний. Если нужного брокера нет в списке, просто наберите название компании или адрес сервера в поисковой строке и нажмите "Найти вашего брокера".
Чтобы помочь начинающим трейдерам, в диалог добавлены описания типов счетов. Также в связи с обновлением General Data Protection Regulation (GDPR) при открытии счета теперь могут показываться ссылки на различные соглашения и политики брокерских компаний:
Значительно расширены возможности для открытия реальных счетов. Функция загрузки документов для подтверждения личности и адреса, представленная ранее в мобильных терминалах, теперь доступна и в десктопной версии. MiFID-регулируемые брокеры теперь могут запрашивать всю необходимую информацию для идентификации клиента, включая данные о занятости, доходах, опыте торговли и т.п. Все это позволит проще и быстрее получать реальные счета, а также избавит от лишней бюрократии.
В историю сделок добавлено отображение значений Стоп Лосс и Тейк Профит. Для сделок входа и разворота они устанавливаются в соответствии со значениями Стоп Лосс и Тейк Профит ордеров, в результате исполнения которых они были совершены. Для сделок выхода используются значения Стоп Лосс и Тейк Профит соответствующих позиций на момент их закрытия. Последнее позволяет сохранять и показывать информацию о том, какие значения Стоп Лосс и Тейк Профита были у позиции в момент ее закрытия. До этого такая информация нигде не сохранялась, так как позиция после закрытия исчезает, а история позиций в терминале формируется на основе сделок.
datetime iTime( string symbol, // символ ENUM_TIMEFRAMES timeframe, // период int shift // сдвиг );
double iOpen( string symbol, // символ ENUM_TIMEFRAMES timeframe, // период int shift // сдвиг );
double iHigh( string symbol, // символ ENUM_TIMEFRAMES timeframe, // период int shift // сдвиг );
double iLow( string symbol, // символ ENUM_TIMEFRAMES timeframe, // период int shift // сдвиг );
double iClose( string symbol, // символ ENUM_TIMEFRAMES timeframe, // период int shift // сдвиг );
long iVolume( string symbol, // символ ENUM_TIMEFRAMES timeframe, // период int shift // сдвиг );
int iBars( string symbol, // символ ENUM_TIMEFRAMES timeframe // период );
int iBarShift( string symbol, // символ ENUM_TIMEFRAMES timeframe, // период datetime time, // время bool exact=false // режим );
int iLowest( string symbol, // символ ENUM_TIMEFRAMES timeframe, // период int type, // идентификатор таймсерии int count, // число элементов int start // индекс );
int iHighest( string symbol, // символ ENUM_TIMEFRAMES timeframe, // период int type, // идентификатор таймсерии int count, // число элементов int start // индекс );
long iRealVolume( string symbol, // символ ENUM_TIMEFRAMES timeframe, // период int shift // сдвиг );
long iTickVolume( string symbol, // символ ENUM_TIMEFRAMES timeframe, // период int shift // сдвиг );
long iSpread( string symbol, // символ ENUM_TIMEFRAMES timeframe, // период int shift // сдвиг );
void TesterHideIndicators( bool hide // флаг );
Полностью обновлена система работы с кэшем оптимизации. Кэш — это данные о ранее рассчитанных проходах оптимизации. Тестер стратегий хранит их, чтобы возобновлять оптимизацию после паузы и не пересчитывать уже рассчитанные проходы тестирования.
Изменения в формате хранения кэша оптимизации
Ранее кэш оптимизации хранился в виде одного XML-файла, в который попадали все проходы оптимизации эксперта с заданными настройками тестирования. В один и тот же файл попадали результаты оптимизации с разными входными параметрами.
Теперь кэш оптимизации хранится в виде бинарных файлов отдельно для каждого набора оптимизируемых параметров. За счет изменения формата и сокращения размера файлов работа тестера с кэшем оптимизации значительно ускорилась. Это ускорение будет особенно заметно при продолжении ранее приостановленной оптимизации.
Просмотр результатов ранее выполненных оптимизаций
Теперь вы можете просматривать результаты ранее выполненных оптимизаций прямо в тестере стратегий, не разбирая огромные XML-файлы в сторонних программах. Откройте вкладку "Результаты оптимизации", выберите эксперта и файл с кэшем оптимизации:
В списке отображаются все файлы кэша оптимизации, которые есть на диске для выбранного эксперта. Для каждого файла показывается дата оптимизации, настройки тестирования (символ, таймфрейм, даты), а также информация о входных параметрах. Дополнительно вы можете отфильтровать результаты оптимизации по торговому серверу, на котором они были получены.
Пересчет критерия оптимизации на ходу
Критерий оптимизации — некий показатель, значение которого определяет качество тестируемого набора входных параметров. Чем больше значение критерия оптимизации, тем лучше оценивается результат тестирования с данным набором параметров.
Ранее при оптимизации рассчитывался только один критерий, выбранный перед началом оптимизации. Теперь при просмотре результатов вы можете на ходу изменить критерий оптимизации, тестер стратегий автоматически пересчитает все значения.
Как использовать кэш оптимизации вручную
Ранее кэш оптимизации хранился в виде XML-файла, который можно было открывать и анализировать в сторонних программах. Теперь он хранится в закрытых бинарных файлах. Чтобы получить данные в формате XML, экспортируйте их через контекстное меню вкладки "Результаты оптимизации".
Обновлена документация.
Исправления по крешлогам.
MetaTrader 5 build 1745 — последняя версия торговой платформы, которая поддерживает Microsoft Windows XP/2003/Vista.
Несколько месяцев назад мы уже сообщали о завершении поддержки старых версий операционных систем.
Windows 2003, Windows Vista и в особенности Microsoft Windows XP
являются устаревшими. Microsoft прекратила поддержку Windows XP 3 года
назад, так как ввиду технических ограничений эта система не позволяет в
полной мере реализовать потенциальные возможности аппаратного
обеспечения.
MetaTrader 5 build 1745, а также ранее
выпущенные версии платформы продолжат свою работу на указанных
операционных системах, но никаких обновлений они получать не будут.
Также на указанных операционных системах не будут запускаться инсталляторы.
Минимальной
версией для работы MetaTrader 5 является Windows 7, но мы настоятельно
рекомендуем использовать 64-битную версию Windows 10.
В новой версии платформы прекращается поддержка десктопных и мобильных терминалов старых версий:
Такие терминалы не смогут подключаться к серверам новых версий. Мы настоятельно рекомендуем заранее обновить ваши терминалы.
Для поддержки новых групповых проектов был изменен протокол работы с онлайн хранилищем MQL5 Storage. К сожалению, после обновления на новую версию платформы вам потребуется заново извлечь все данные из хранилища. Сами данные, которые в нем хранятся, не будут затронуты и не потеряются.
Перед обновлением на новую версию платформы мы рекомендуем отправить все локальные изменения в хранилище (выполнить Commit).
Как это происходит
Например, вы можете создать инструмент, который будет показывать индекс доллара (USDX). Его формула будет выглядеть следующим образом:
50.14348112 * pow(ask(EURUSD),-0.576) * pow(USDJPY,0.136) * pow(ask(GBPUSD),-0.119) * pow(USDCAD,0.091) * pow(USDSEK,0.042) * pow(USDCHF,0.036)
Примечание: в исходной формуле индекса доллара используются пары
USDEUR и USDGBP. Поскольку в платформе есть только обратные валютные
пары, в формуле синтетического инструмента для них используется
отрицательная степень и цена Ask вместо Bid.
В режиме реального времени платформа будет
рассчитывать цену нового инструмента на основе котировок шести
других инструментов, предоставляемых вашим брокером. В Обзоре рынка и на
графике вы будете видеть, как изменяется его цена:
int CustomTicksAdd( const string symbol, // имя символа const MqlTick& ticks[] // массив с тиковыми данными, которые необходимо применить к пользовательскому инструменту );Функция CustomTicksAdd позволяет транслировать тики так, как если бы они приходили от сервера брокера. Данные записываются не напрямую в базу тиков, а отправляются в окно "Обзор рынка". И уже из него терминал сохраняет тики в своей базе. При большом объеме данных, передаваемых за один вызов, функция меняет свое поведение для экономии ресурсов. Если передается более 256 тиков, данные делятся на две части. Первая часть (большая) сразу напрямую записывается в базу тиков (как это делает CustomTicksReplace). Вторая часть, состоящая из последних 128 тиков, передается в окно "Обзор рынка" и после этого сохраняется терминалом в базе.
В MetaEditor появились полноценные проекты. Разрабатывать программы стало значительно удобнее.
Теперь в качестве проекта не выступает основной MQ5 файл
программы. Проект — это отдельный файл "MQPROJ", в котором хранятся
настройки программы, параметры компиляции и информация обо всех
используемых файлах. Доступ к основным настройкам проекта организован
через отдельное диалоговое окно, больше нет необходимости указывать их в
исходном коде через #property.
Для удобной работы с проектом предусмотрена отдельная вкладка в
Навигаторе. В ней по категориям отображаются все используемые файлы:
включаемые, ресурсные, заголовочные и т.д. При этом файлы добавляются в
навигатор проекта автоматически. Например, если вы включите новый
MQH-файл в код, он будет автоматически показан в разделе "Dependencies"
навигатора.
Мы сразу же предусмотрели возможность работы с новыми проектами в
онлайн хранилище MQL5 Storage. Теперь намного удобнее заниматься
разработкой больших проектов вместе с другими участникам сообщества
MQL5.community.
Для работы с групповыми проектами добавлен новый раздел Shared Projects. Проект, созданный в этом разделе, сразу же отправляется в хранилище: вы можете быстро раздать права на него другим участникам и приступить к совместной разработке.
При компиляции проекта в Shared Project исполняемый файл EX5 автоматически копируется в локальный каталог Experts, Indicators или Scripts, в зависимости от типа программы. Вы можете сразу запустить программу на графике, не копируя файлы каждый раз вручную.
Изменения в работе с хранилищем MQL5 Storage
Для реализации полноценной работы с групповыми проектами был полностью переделан протокол взаимодействия с хранилищем MQL5 Storage. К сожалению, после обновления на новую версию платформы вам потребуется заново извлечь все данные из хранилища. Сами данные, которые в нем хранятся, не будут затронуты и не потеряются.
Команда "Извлечь данные из хранилища" (Checkout from Storage) теперь недоступна. Для извлечения данных используются команды "Активировать MQL5 Storage" и "Получить файлы из хранилища":
Новые проекты: пример создания и подробности работы
В MetaEditor появилась новая сущность — собственно проект. Это файл с расширением mqproj, в котором хранятся общие свойства программы, а также информация обо всех используемых файлах. Теперь свойствами программы можно удобно управлять в отдельном диалоговом окне MetaEditor, а не изменять их вручную в исходном коде (директивы #property).
Если у вас уже есть разработки, то самый простой способ попробовать новые проекты — воспользоваться командой "Новый проект из исходного файла".
В том же каталоге, что и выбранный исходный файл, будет создан одноименный файл проекта с расширением mqproj. В проект автоматически добавятся основные свойства программы, указанные в виде #property в исходном файле: имя, копирайт, версия, ссылка на разработчика и описание.
В свойствах проектов появились две новые опции для компиляции MQL5-программ:
Для работы с проектом предназначена отдельная вкладка "Проект" в окне "Навигатор". В ней удобно показываются все файлы, используемые в проекте. При генерации проекта из исходного файла в раздел "Dependencies" автоматически добавляются все используемые включаемые файлы (указанные при помощи директивы #include в основном MQ5-файле и во всех включенных в него файлах).
При добавлении новых включаемых файлов в исходный код, они также будут появляться в Навигаторе проекта. В раздел Headers будут добавляться используемые заголовочные файлы, а в раздел Resources — изображения, звуки и другие MQL5-программы, включенные в проект в виде ресурсов. В разделе Sources показываются MQ5-файлы с исходным кодом. В раздел Settings and files можно добавлять другие файлы, например, настройки для тестирования или шаблоны для графиков.
Для добавления существующих файлов в проект и удаления из него файлов воспользуйтесь командами контекстного меню. Будьте внимательны при удалении: вы можете убрать файл из проекта (убрать привязку) или полностью удалить его с жесткого диска:
Новый проект создать также легко, как и обычную MQL5-программу. Нажмите "Новый проект", а затем в Мастере MQL5 выберите тип создаваемой программы и укажите ее свойства (имя, обработчики событий и т.п.).
Для получения исполняемого файла EX5 вы можете открыть проект и выполнить команду компиляции (F7) или же, как раньше, открыть основной MQ5-файл программы и скомпилировать его.
Групповые проекты в MQL5 Storage: подробности работы
Для работы с групповыми проектами предусмотрен раздел Shared Projects. Если у вас еще не подключено хранилище, выполните в контекстном меню этой папки команду Activate MQL5 Storage. MetaEditor сразу же проверит, есть ли в вашем хранилище сохраненные данные, а также доступны ли вам какие-либо групповые проекты. Имеющиеся данные будут сразу же извлечены из хранилища и загружены на компьютер (Checkout). Доступные групповые проекты будут показаны в разделе Shared Projects; чтобы получить их, нажмите "Извлечь файлы из хранилища" в контекстном меню.
Для создания нового группового проекта выберите папку Shared Projects и нажмите "Новый проект":
Далее пройдите стандартные шаги Мастера MQL5: задайте тип, имя и свойства будущей программы. Выбирайте для групповых проектов четкие и понятные имена, чтобы другие участники легко их различали. В имени допускаются только латинские буквы и цифры, пробелы не допускаются.
Сразу после создания проект будет автоматически добавлен в хранилище MQL5 Storage. Используемые файлы стандартной библиотеки в хранилище не добавляются, при необходимости вы можете добавить их вручную.
Чтобы разрешить другим участникам работать с проектом, откройте его свойства: здесь можно назначить права конкретным пользователям (указать логин MQL5.community), а также задать общие параметры групповой работы:
Для удобства работы при компиляции группового проекта конечный
исполняемый файл (EX5) автоматически копируется в папку Experts,
Indicators или Scripts в зависимости от типа программы. Таким образом,
вы сразу можете запустить программу в терминале без ее ручного
копирования в нужный каталог.
Публичные проекты в MQL5 Storage: участие в разработках
Как уже упоминалось выше, у каждого группового проекта в MQL5 Storage есть настройки публичности: проект может быть приватным или же открытым для участия других пользователей. Теперь все проекты, к которым можно свободно присоединиться, отображаются в отдельной вкладке "Публичные проекты".
Каждый может найти интересный проект и принять участие в его разработке. Достаточно нажать "Присоединиться", а затем получить проект из хранилища.
//+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- файл шаблона в виде бинарного массива unsigned char my_template[]= { 0xFF,0xFE,0x3C, ... ,0x00 // массив данных в примере сокращен }; //--- сохранение и применение шаблона if(FileSave("my_template.tpl",my_template)) { Print("Custom template saved in \\MQL5\\Files"); if(ChartApplyTemplate(0,"\\Files\\my_template.tpl")) Print("Custom template applied to the current chart"); else Print("Failed to apply custom template"); } else Print("Failed to save custom template"); }
Функция | Действие |
---|---|
CustomSymbolCreate | Создает пользовательский символ с указанным именем в указанной группе |
CustomSymbolDelete | Удаляет пользовательский символ с указанным именем |
CustomSymbolSetInteger | Устанавливает для пользовательского символа значение свойства целочисленного типа |
CustomSymbolSetDouble | Устанавливает для пользовательского символа значение свойства вещественного типа |
CustomSymbolSetString | Устанавливает для пользовательского символа значение свойства строкового типа |
CustomSymbolSetMarginRate | Устанавливает для пользовательского символа коэффициенты взимания маржи в зависимости от типа и направления ордера |
CustomSymbolSetSessionQuote | Устанавливает время начала и время окончания указанной котировочной сессии для указанных символа и дня недели |
CustomSymbolSetSessionTrade | Устанавливает время начала и время окончания указанной торговой сессии для указанных символа и дня недели |
CustomRatesDelete | Удаляет все бары в указанном временном интервале из ценовой истории пользовательского инструмента |
CustomRatesReplace | Полностью заменяет ценовую историю пользовательского инструмента в указанном временном интервале данными из массива типа MqlRates |
CustomRatesUpdate | Добавляет в историю пользовательского инструмента отсутствующие бары и заменяет существующие бары данными из массива типа MqlRates |
CustomTicksAdd | Добавляет в ценовую историю пользовательского инструмента данные из массива типа MqlTick. Пользовательский символ должен быть выбран в окне MarketWatch (Обзор рынка) |
CustomTicksDelete | Удаляет все тики в указанном временном интервале из ценовой истории пользовательского инструмента |
CustomTicksReplace | Полностью заменяет ценовую историю пользовательского инструмента в указанном временном интервале данными из массива типа MqlTick |
Библиотека размещается в рабочем каталоге терминала в папке Include\Generic.
bool ArraySwap( void& array1[], // первый массив void& array2[] // второй массив );Функция принимает динамические массивы одинакового типа и одинаковых размерностей. Для многомерных массивов количество элементов во всех измерениях кроме первого должно совпадать.
Добавлена возможность просматривать рыночную статистику по финансовым инструментам, торговля которыми осуществляется в режиме биржевого исполнения. Для этого необходимо из Market Watch вызвать меню интересующего вас символа и раскрыть его статистику.
Оптимизирована работа с позициями во вкладке "Торговля". Теперь по тапу на ячейке позиции/ордера сразу показывается ее детальный вид и возможные варианты действий: закрытие, изменение или наращивание позиции, а также открытие графика по символу, по которому открыта позиция.
В MetaTrader 5 Android появилась возможность быстрого открытия предварительных (preliminary) счетов у брокера. Для этого нужно выбрать пункт меню "Открыть реальный счет" и в списке серверов указать своего брокера. Далее вам останется только прикрепить к заявке документ, подтверждающий личность, и выписку из банка. Ваш запрос на открытие реального тут же будет отправлен брокеру, при необходимости он запросит у вас дополнительную информацию.
union LongDouble { long long_value; double double_value; };В отличие от структуры, разные члены объединения относятся к одному и тому же участку памяти. В данном примере объявлено объединение LongDouble, в котором значение типа long и значение типа double разделяют одну и ту же область памяти. Важно понимать — невозможно сделать так, чтобы это объединение хранило одновременно целочисленное значение long и вещественное double (как это было бы в структуре), поскольку переменные long_value и double_value накладываются (в памяти) друг на друга. Но зато MQL5-программа в любой момент может обрабатывать информацию, содержащуюся в этом объединении, как целочисленное значение (long) или как вещественное (double). Следовательно, объединение позволяет получить два (или больше) варианта представления одной и той же последовательности данных.
union LongDouble { long long_value; double double_value; }; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- LongDouble lb; //--- получим недействительное число -nan(ind) и выведем его lb.double_value=MathArcsin(2.0); printf("1. double=%f integer=%I64X",lb.double_value,lb.long_value); //--- наибольшее нормализованное число (DBL_MAX) lb.long_value=0x7FEFFFFFFFFFFFFF; printf("2. double=%.16e integer=%I64X",lb.double_value,lb.long_value); //--- наименьшее положительное нормализованное (DBL_MIN) lb.long_value=0x0010000000000000; printf("3. double=%.16e integer=%.16I64X",lb.double_value,lb.long_value); } /* Результат выполнения 1. double=-nan(ind) integer=FFF8000000000000 2. double=1.7976931348623157e+308 integer=7FEFFFFFFFFFFFFF 3. double=2.2250738585072014e-308 integer=0010000000000000 */
class Foo { int value; public: string Description(void){return IntegerToString(value);}; //--- конструктор по умолчанию Foo(void){value=-1;}; //--- конструктор с параметрами Foo(int v){value=v;}; }; //+------------------------------------------------------------------+ //| структура, содержащая объекты типа Foo | //+------------------------------------------------------------------+ struct MyStruct { string s; Foo foo; }; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- MyStruct a,b; Foo an_foo(5); a.s="test"; a.foo=an_foo; Print("a.s=",a.s," a.foo.Description()=",a.foo.Description()); Print("b.s=",b.s," b.foo.Description()=",b.foo.Description()); //--- Print("b=a"); b=a; //--- Print("a.s=",a.s," a.foo.Description()=",a.foo.Description()); Print("b.s=",b.s," b.foo.Description()=",b.foo.Description()); /* Результат выполнения; a.s=test a.foo.Description()=5 b.s= b.foo.Description()=-1 b=a a.s=test a.foo.Description()=5 b.s=test b.foo.Description()=5 */ }В неявном операторе осуществляется почленное копирование объектов.
ENUM_POSITION_REASON | ENUM_DEAL_REASON | ENUM_ORDER_REASON | Описание причины |
---|---|---|---|
POSITION_REASON_CLIENT | DEAL_REASON_CLIENT | ORDER_REASON_CLIENT | Операция совершена в результате срабатывания ордера, выставленного из десктопного терминала |
POSITION_REASON_MOBILE | DEAL_REASON_MOBILE | ORDER_REASON_MOBILE | Операция совершена в результате ордера, выставленного из мобильного приложения |
POSITION_REASON_WEB | DEAL_REASON_WEB | ORDER_REASON_WEB | Операция совершена в результате срабатывания ордера, выставленного из веб-платформы |
POSITION_REASON_EXPERT | DEAL_REASON_EXPERT | ORDER_REASON_EXPERT | Операция совершена в результате срабатывания ордера, выставленного из MQL5-программы – советником или скриптом |
- | DEAL_REASON_SL | ORDER_REASON_SL | Операция совершена в результате срабатывания Stop Loss |
- | DEAL_REASON_TP | ORDER_REASON_TP | Операция совершена в результате срабатывания Take Profit |
- | DEAL_REASON_SO | ORDER_REASON_SO | Операция совершена в результате наступления события Stop Out |
- | DEAL_REASON_ROLLOVER | - | Сделка совершена по причине
переноса позиции |
- | DEAL_REASON_VMARGIN | - | Сделка совершена по причине начисления/списания вариационной маржи |
- | DEAL_REASON_SPLIT | - | Сделка совершена по причине сплита (понижения цены) акции или иного актива, по которому открыта имелась позиция на момент объявления сплита |
В MetaTrader 5 iOS добавлена возможность быстрого открытия предварительных (preliminary) счетов у брокера. Теперь достаточно выбрать пункт меню "Открыть реальный счет", а далее в списке серверов указать нужного брокера. После заполнения персональных данных остается только прикрепить два документа, подтверждающих личность и адрес, и отправить заявку на регистрацию. Таким образом, брокер может сразу же открыть вам реальный счет, запросив при необходимости дополнительную информацию.
В 1605-м билде MetaTrader 5 iOs также проведены оптимизация и редизайн почты:
Обновлена документация.
В MetaTrader 5 Android добавлено представление торговой истории в виде позиций. Ранее во вкладке "История" отражались только сделки и ордера из истории, теперь же анализ торговли можно проводить в разрезе позиций. Для этого все сделки, относящиеся к позиции, группируются в единую запись, где можно увидеть:
Добавлено представление торговой истории в виде позиций. Ранее во вкладке "История" отражались только сделки и ордера из истории, теперь в неё добавлены и позиции. Торговая платформа собирает данные по сделкам, относящимся к позиции, и группирует эти данные в единую запись. В ней можно увидеть:
//+------------------------------------------------------------------+ //| Шаблонная функция | //+------------------------------------------------------------------+ template<typename T1,typename T2> string Assign(T1 &var1,T2 var2) { var1=(T1)var2; return(__FUNCSIG__); } //+------------------------------------------------------------------+ //| Специальная перегрузка для случая bool+string | //+------------------------------------------------------------------+ string Assign(bool &var1,string var2) { var1=(StringCompare(var2,"true",false) || StringToInteger(var2)!=0); return(__FUNCSIG__); } //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { int i; bool b; Print(Assign(i,"test")); Print(Assign(b,"test")); }В результате выполнения кода мы увидим, что для пары int+string была использована шаблонная функция Assign(), а при втором вызове для пары bool+string уже использовалась перегруженная версия.
string Assign<int,string>(int&,string) string Assign(bool&,string)
template<typename T> T Func() { return (T)0; } void OnInit() { Func<double>(); // явная специализация шаблонной функции }Таким образом, специализация происходит не через параметры вызова, а прямым указанием типов.
Обновлена документация.
Обновлена документация.
Добавлена возможность авторизации и
регистрации MQL5.com-аккаунта через
Facebook. Теперь, если у вас есть профиль в этой социальной сети, вы можете в несколько кликов получить доступ к чатам и всему
набору сервисов для MetaTrader 5.
#resource путь_к_файлу_ресурса as тип_ресурсной_переменной имя_ресурсной_переменной
#resource "data.bin" as int ExtData[] // объявление массива числового типа, содержащего данные из файла data.bin #resource "data.bin" as MqlRates ExtData[] // объявление массива простых структур, содержащего данные из файла data.bin #resource "data.txt" as string ExtCode // объявление строки, содержащей данные файла data.txt #resource "data.txt" as string ExtCode[] // объявление строкового массива, содержащего строки файла data.txt #resource "image.bmp" as bitmap ExtBitmap[] // объявление одномерного массива, содержащего в себе растр из файла BMP, размер массива = height * width #resource "image.bmp" as bitmap ExtBitmap2[][] // объявление двумерного массива, содержащего в себе растр из файла BMP, размер массива [height][width]
Обновлена документация.