MetaTrader 5 build 1325: Торговля с хеджированием и тестирование по реальным тикам

Для расширения возможностей ритейл-форекса в платформу добавлена вторая система учета — хеджинг

22 апреля 2016

Terminal

  1. Для расширения возможностей ритейл-форекса в платформу добавлена вторая система учета — хеджинг. Теперь по инструменту можно иметь множество позиций, в том числе — разнонаправленных. Это позволяет реализовывать торговые стратегии с так называемым локированием — если цена пошла против трейдера, он имеет возможность открыть позицию в противоположном направлении.

    Новая система учета аналогична используемой в MetaTrader 4, она будет привычна трейдерам. При этом они смогут использовать все преимущества пятой версии платформы — исполнение ордеров несколькими сделками (в том числе — частичное), мультивалютный и многопоточный тестер с поддержкой вычислительной сети MQL5 Cloud Network и многое другое.

    Теперь на одном счете можно торговать на бирже, где используется неттинг и по одному инструменту можно иметь только одну позицию. При этом в той же платформе, но на другом счете можно торговать на форексе и использовать хеджирование.

    Как открыть счет с хеджированием и где посмотреть тип учета позиций
    Тип учета позиций задается на уровне счета, он показывается в заголовке окна терминала, а также в журнале:



    Чтобы открыть демо-счет с хеджингом, включите соответствующую опцию:




    Неттинговая система
    Эта система учета подразумевает, что в один момент времени на счете может быть только одна открытая позиция по одному и тому же символу:

    • Если по инструменту существует позиция, при совершении сделки в том же направлении происходит наращивание объема этой позиции.
    • При совершении сделки в обратном направлении происходит уменьшение объема существующей позиции, ее закрытие (при совершении сделки в объеме, равном объему текущей позиции) либо разворот (если объем противоположной сделки больше текущей позиции).


    При этом не имеет значения, в результате какого действия совершается сделка в противоположном направлении — в результате исполнения рыночного ордера или срабатывания отложенного.

    Ниже приведен пример совершения двух сделок на покупку EURUSD объемом 0.5 лота каждая:


    Результатом исполнения этих сделок стала одна общая позиция объемом 1 лот.

    Хеджинговая система
    Эта система учета позволяет иметь на счету множество торговых позиций по одному и тому же инструменту, в том числе — разнонаправленных.

    Если по торговому инструменту есть открытая позиция и трейдер совершает новую сделку (или срабатывает отложенный ордер), происходит открытие новой позиции. Существующая позиция не изменяется.

    Ниже приведен пример совершения двух сделок на покупку EURUSD объемом 0.5 лота каждая:


    Результатом исполнения этих сделок стало открытие двух отдельных позиций.

    Новый тип торговой операции Close By
    Для счетов с хеджинговым учетом позиций добавлен новый вид торговых операций — закрытие позиции встречной. Эта операция позволяет одновременно закрыть две разнонаправленные позиции по одному и тому же инструменту. Если встречные позиции имеют разное количество лотов, то открытым останется только один ордер из двух. Его объем будет равен разности лотов двух закрытых позиций, а направление позиции и цена открытия — большей (по объему) из закрываемых позиций.

    По сравнению с одиночным закрытием двух позиций, закрытие встречной позволяет сэкономить трейдеру один спред:

    • При одиночном закрытии трейдер дважды платит спред: закрывает покупку по меньшей цене (Bid), а продажу — по большей (Ask).
    • При встречном закрытии для закрытия первой позиции используется цена открытия второй позиции, а для второй позиции — цена открытия первой.


    При закрытии позиции встречной выставляется ордер типа "close by". В комментарии к нему указываются тикеты закрываемых позиций. Закрытие пары встречных позиций происходит двумя сделками типа "out by". Размер итоговой прибыли/убытка, полученного в результате закрытия обеих позиций, указывается только в одной сделке.


  2. В дополнение к поддержке хеджинга в платформе расширились возможности переноса счетов из MetaTrader 4. Теперь брокеры могут в автоматическом режиме переносить счета в MetaTrader 5 вместе со всеми операциями: открытыми и отложенными ордерами, а также всей торговой историей.

    При первом подключении счету, перенесенному из MetaTrader 4, вы увидите приветственное окно. Перенос осуществляется безопасно. Для начала работы укажите пароль от счета, который ранее использовался в MetaTrader 4, а затем задайте новый пароль.



    После подключения вы сможете работать в обычном режиме, как если бы счет был изначально открыт в MetaTrader 5, при этом вся история сделок из MetaTrader 4 автоматически сохранится на новом счете.

    При импорте тикеты ордеров и позиций (в том числе ордеров истории) не сохраняются, поскольку одной записи в торговой истории MetaTrader 4 может соответствовать до 4 записей в истории MetaTrader 5. Всем торговым записям проставляются новые тикеты.

    Номера счетов могут быть сохранены или заменены новыми в зависимости от того, как брокер произведет импорт.


  3. Добавлен Чат. Теперь прямо в торговой платформе можно общаться с друзьями и коллегами на MQL5.community. В чате показываются все личные сообщения из MQL5-аккаунта. Для начала общения войдите в свой аккаунт прямо из окна чата или через настройки платформы: Сервис -> Настройки -> Сообщество.




  4. Упрощен диалог открытия демо-счета, добавлена возможность открытия счетов с хеджированием. Теперь не нужно заполнять большую анкету, достаточно указать основные данные и выбрать торговые параметры: тип счета, депозит, плечо и возможность хеджирования.



  5. Для быстрого начала работы с платформой добавлено автоматическое выделение демо-счета. Если в платформе еще нет ни одного счета, то при запуске выделяется демо-счет на первом доступном торговом сервере. После успешного открытия счет сразу же будет подключен.

  6. Теперь у каждой позиции есть тикет — уникальный номер. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Всем ранее открытым позициям тикет будет назначен автоматически после обновления на новую версию терминала.




  7. Исправлена установка уровней Стоп Лосс и Тейк Профит при выставлении рыночного ордера, приводящего к изменению направления позиции. Ранее соответствующие уровни у новой позиции не устанавливались.
  8. Исправлено отображение цен с четырьмя и более знаками после запятой на элементах управления панели торговли одним кликом.
  9. Исправлена ошибка отображения новости в окне предварительного просмотра перед печатью.
  10. Исправлены ошибки отображения тикового графика.
  11. Исправлено открытие стакана цен после аварийного завершения работы терминала.
  12. Добавлены проверки на разрешенность рыночных ордеров при отображении элементов управления панели торговли одним кликом.
  13. Оптимизирован расчет прибыли и маржи при большом количестве открытых ордеров и позиций.
  14. Добавлен перевод пользовательского интерфейса на малайский язык.
  15. Полностью обновлено руководство пользователя. Свежий дизайн, интерактивные скриншоты и встроенные видеоролики — все, чтобы сделать обучение торговли при помощи MetaTrader 5 максимально простым и удобным:




  16. Исправлено отображение графических объектов в режиме "График сверху".

Tester

  1. Добавлена возможность тестирования торговых роботов и технических индикаторов по реальной тиковой истории.

    Тестирование и оптимизация на реальных тиках являются максимально приближенными к реальным условиям. Вместо сгенерированных на основе минутных данных используются реальные тики, накопленные брокером по финансовым инструментам. Это тики с бирж и от поставщиков ликвидности.

    Чтобы начать тестирование или оптимизацию по реальным тикам, выберите соответствующий режим в тестере стратегий:



    Тиковые данные имеют значительно больший размер, чем минутные. При первом запуске тестирования их скачивание может занять продолжительное время. Скачанные тиковые данные хранятся по месяцам в TKC-файлах в каталоге \bases\[имя торгового сервера]\ticks\[имя символа]\.

    Особенности тестирования по реальным тикам
    При тестировании на реальных тиках спред в пределах минутного бара может меняться, тогда как при генерации тиков внутри минуты используется спред, зафиксированный в соответствующем баре.

    Если по инструменту транслируется биржевой стакан цен, бары строятся строго по ценам исполнения последней сделки — Last. В ином случае, тестер сначала пытается строить бары по ценам Last, и только если их нет, использует цены Bid. Событие прихода тика OnTick срабатывает на всех тиках, независимо от того, была ли в них цена Last или нет.

    Обратите внимание, что торговые операции всегда совершаются по ценам Bid и Ask, даже если график строится по ценам Last. Например, эксперт, использующий для торговли только цены открытия бара (в частности, встроенный Moving Average), получит сигнал по одной цене (Last), но сделку совершит уже по другой (Bid или Ask в зависимости от направления). При использовании режима генерации "Все тики", бары строятся по ценам Bid, а сделки совершаются по Bid и Ask. При этом Ask рассчитывается как Bid + фиксированный спред соответствующего минутного бара.

    Если в истории символа есть минутный бар, но тиковых данных за эту минуту нет, тестер сгенерирует тики в режиме "Все тики". Это позволяет протестировать советника на запланированном периоде в случае неполных тиковых данных у брокера. Если в истории символа нет минутного бара, но тиковые данные за эту минуту есть, то эти тики игнорируются. Минутные данные считаются более достоверными.

    Тестирование по реальным тикам в сети облачных вычислений MQL5 Cloud Network
    Тестирование по реальным тикам доступно не только на локальных и удаленных агентах, но и через облачную сеть MQL5 Cloud Network. Оптимизацию стратегии, которая могла бы занять месяцы, можно выполнить за несколько часов, используя вычислительную мощность тысяч компьютеров.

    Для тестирования через сеть включите использование облачных агентов:



    При тестировании на реальных тиках через MQL5 Cloud Network может передаваться большой объем интернет-трафика. Это может существенно повлиять на итоговую стоимость использования вычислительной сети.

  2. Исправлена ошибка, в результате которой не рассчитывалась комиссия на некоторых типах торговых инструментов.
  3. Исправлено заполнение поля Expert у торговых ордеров, возникших в результате срабатывания SL/TP, в соответствии со значением поля Expert у соответствующей позиции. Ранее оно не заполнялось.
  4. Исправлено переключение на вкладки результатов обычной и форвардной оптимизации.
  5. Исправлен расчет и отображение индикатора "Envelopes".
  6. Оптимизировано выполнение визуального тестирования.
  7. Оптимизирован расчет прибыли и маржи при большом количестве открытых ордеров и позиций.
  8. Оптимизировано выполнение торговых операций при высокочастотной торговле.
  9. Теперь синхронизация истории не производится при запросе свойств неосновного символа, не требующих текущих котировок. Например,  SYMBOL_SELECT, SYMBOL_DIGITS, SYMBOL_SPREAD_FLOAT, SYMBOL_TRADE_CALC_MODE, SYMBOL_TRADE_MODE, SYMBOL_TRADE_STOPS_LEVEL, SYMBOL_TRADE_FREEZE_LEVEL, SYMBOL_TRADE_EXEMODE и т.п. Раньше при любом запросе свойства неосновного символа производилась синхронизация истории по данному символу.
  10. Исправлен расчет свопов в процентах годовых.

MQL5

  1. Изменился формат исполняемых EX5-файлов в связи с добавлением новых возможностей в язык MQL5 и появлением хеджинга в платформе MetaTrader 5. Все старые EX5-программы, скомпилированные в MetaEditor предыдущих билдов, будут после обновления работать корректно - таким образом, совместимость снизу вверх сохранена полностью.

    В то же время, EX5-программы, скомпилированные на билдах 1325 и выше, не будут работать в терминалах старых билдов - обратной совместимости нет.

  2. Добавлена поддержка абстрактных классов и чисто виртуальных функций.

    Абстрактные классы предназначены для создания обобщенных сущностей, на основе которых в дальнейшем предполагается создавать более конкретные производные классы. Абстрактный класс – это класс, который может использоваться лишь в качестве базового класса для некоторого другого класса, поэтому невозможно создать объект типа абстрактного класса.

    Класс, содержащий хотя бы одну чисто виртуальную функцию, является абстрактным. Поэтому классы, производные от абстрактного класса, должны реализовать все его чисто виртуальные функции, иначе они также будут абстрактными классами.

    Виртуальная функция объявляется как "чистая" с помощью синтаксиса спецификатора чистоты. Рассмотрим в качестве примера класс CAnimal, который создается только для того, чтобы предоставлять общие функции – сами объекты типа CAnimal имеют слишком общий характер для практического применения. Таким образом, класс CAnimal является хорошим кандидатом в абстрактный класс:
    class CAnimal
      {
    public:
                          CAnimal();     // конструктор
       virtual void       Sound() = 0;   // чисто виртуальная функция
    private:
       double             m_legs_count;  // количество ног животного
      };
    Здесь функция Sound() является чисто виртуальной, потому что она объявлена со спецификатором чисто виртуальной функции PURE (=0).

    Чисто виртуальными функциями являются только такие виртуальные функции, для которых указан спецификатор чистоты  PURE, а  именно: (=NULL) или (=0). Пример объявления и использования абстрактного класса:
    class CAnimal
      {
    public:
       virtual void       Sound()=NULL;   // PURE method, должен быть переопределен в потомке, сам класс CAnimal стал абстрактным и не может быть создан
      };
    //--- потомок от абстрактного класса
    class CCat : public CAnimal
     {
    public:
      virtual void        Sound() { Print("Myau"); } // PURE переопределен, класс CCat не абстрактный и может быть создан
     };
    
    //--- примеры неправильного использования
    new CAnimal;         // ошибка 'CAnimal' - компилятор выдаст ошибку "cannot instantiate abstract class"
    CAnimal some_animal; // ошибка 'CAnimal' - компилятор выдаст ошибку "cannot instantiate abstract class"
    
    //--- примеры правильного использования
    new CCat;  // ошибки нет - класс CCat не абстрактный
    CCat cat;  // ошибки нет - класс CCat не абстрактный
    Ограничения на использование абстрактных классов
    При вызове конструктором абстрактного класса чистой виртуальной функции (прямо или косвенно) результат будет неопределенным.
    //+------------------------------------------------------------------+
    //| Абстрактный базовый класс                                        |
    //+------------------------------------------------------------------+
    class CAnimal
      {
    public:
       //--- чисто виртуальная функция
       virtual void      Sound(void)=NULL;
       //--- функция
       void              CallSound(void) { Sound(); }
       //--- конструктор
       CAnimal()
        {
         //--- явный вызов виртуального метода
         Sound();
         //--- неявный вызов (через третью функцию)
         CallSound();
         //--- в конструкторе и/или деструкторе всегда вызываются свои функции,
         //--- несмотря на виртуальность и переопределение вызываемой функции в потомке
         //--- если вызываемая функция чисто виртуальная, то
         //--- вызов приведет к критической ошибке выполнения: "pure virtual function call"
        }
      };
    Однако конструкторы и деструкторы абстрактных классов могут вызывать другие функции-члены.

  3. Для облегчения организации событийных моделей добавлена поддержка указателей на функции.

    Чтобы объявить указатель на функцию, определите тип "указатель на функцию", например:
    typedef int (*TFunc)(int,int);
    Теперь TFunc является типом и можно объявить переменную-указатель на функцию:
    TFunc func_ptr;
    В переменную func_ptr можно сохранить адрес функции, чтобы в дальнейшем ее вызывать:
    int sub(int x,int y) { return(x-y); }
    int add(int x,int y) { return(x+y); }
    int neg(int x)       { return(~x);  }
    
    func_ptr=sub;
    Print(func_ptr(10,5));
    
    func_ptr=add;
    Print(func_ptr(10,5));
    
    func_ptr=neg;           // ошибка: neg не имеет тип  int (int,int)
    Print(func_ptr(10));    // ошибка: должно быть два параметра
    Указатели на функции можно хранить и передавать в качестве параметра. Нельзя получить указатель на нестатический метод класса.

  4. В структуру торгового запроса MqlTradeRequest добавлены два новых поля:

    • position — тикет позиции. Следует заполнять при торговле с хеджированием при изменении и закрытии позиции для ее однозначной идентификации. При торговле с неттинговой системой учета заполнение этого поля ни на что не влияет, поскольку идентификация позиции происходит по имени торгового инструмента.
    • position_by — тикет встречной позиции. Используется при закрытии позиции встречной — открытой по тому же инструменту, но в противоположном направлении. Используется только при хеджинговом учете позиций.

  5. В перечисление типов торговых операций ENUM_TRADE_REQUEST_ACTIONS добавлено значение TRADE_ACTION_CLOSE_BY — закрытие позиции встречной. Используется только при хеджинговом учете позиций.

  6. В перечисления свойств ордеров, сделок и позиций добавлены тикеты соответствующих торговых операций:

    • В ENUM_ORDER_PROPERTY_INTEGER добавлено свойство ORDER_TICKET — тикет ордера. Уникальное число, которое присваивается каждому ордеру.
    • В ENUM_DEAL_PROPERTY_INTEGER добавлено свойство DEAL_TICKET — тикет сделки. Уникальное число, которое присваивается каждой сделке.
    • В ENUM_POSITION_PROPERTY_INTEGER добавлено свойство POSITION_TICKET — тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта позиция, следует использовать свойство POSITION_IDENTIFIER. Значение POSITION_TICKET соответствует MqlTradeRequest::position.

  7. В перечисление типов ордеров ENUM_ORDER_TYPE добавлено значение ORDER_TYPE_CLOSE_BY — ордер на закрытие позиции встречной позицией.
  8. В перечисление свойств ордеров ENUM_ORDER_PROPERTY_INTEGER добавлено значение ORDER_POSITION_BY_ID — идентификатор встречной позиции для ордеров типа ORDER_TYPE_CLOSE_BY.
  9. В перечисление направлений сделки ENUM_DEAL_ENTRY добавлено значение DEAL_ENTRY_OUT_BY — сделка произошла в результате закрытия позиции встречной.
  10. В структуру торговой транзакции MqlTradeTransaction добавлены два аналогичных поля:

    • position — тикет позиции, на которую повлияла транзакция. Заполняется для транзакций, касающихся обработки рыночных ордеров (TRADE_TRANSACTION_ORDER_* кроме TRADE_TRANSACTION_ORDER_ADD, где тикет позиции еще не присвоен) и истории ордеров (TRADE_TRANSACTION_HISTORY_*).
    • position_by — тикет встречной позиции. Используется при закрытии позиции встречной — открытой по тому же инструменту, но в противоположном направлении. Заполняется только для ордеров на закрытие позиции встречной (close by) и сделок на закрытие встречной (out by).

  11. Добавлена функция PositionGetTicket — возвращает тикет позиции по индексу в списке открытых позиций и автоматически выбирает эту позицию для дальнейшей работы с ней при помощи функций PositionGetDouble, PositionGetInteger, PositionGetString.
    ulong  PositionGetTicket(
       int  index      // номер в списке позиций
       );

  12. Добавлена функция PositionSelectByTicket — выбирает открытую позицию для дальнейшей работы с ней по указанному тикету.
    bool  PositionSelectByTicket(
       ulong   ticket     // тикет позиции
       );

  13. В перечисление свойств торговых инструментов ENUM_SYMBOL_INFO_DOUBLE добавлено значение SYMBOL_MARGIN_HEDGED — размер контракта или маржи для одного лота перекрытых позиций (разнонаправленные позиции по одному символу).

    • Если для инструмента задана первоначальная маржа (SYMBOL_MARGIN_INITIAL), то хеджированная маржа указывается как абсолютное значение (в деньгах).
    • Если первоначальная маржа не задана (равна 0), то в SYMBOL_MARGIN_HEDGED указывается размер контракта, который будет использован при расчете маржи по формуле, соответствующей типу торгового инструмента (SYMBOL_TRADE_CALC_MODE).

    Особенности расчета маржи для захеджированных позиций описаны в руководстве пользователя торговой платформы MetaTrader 5.

  14. В перечисление свойств счета ENUM_ACCOUNT_INFO_INTEGER добавлено значение ACCOUNT_MARGIN_MODE — режим расчета маржи для текущего торгового счета:

    • ACCOUNT_MARGIN_MODE_RETAIL_NETTING — используется для внебиржевого рынка при учете позиций в режиме "неттинг" (по одному символу может быть только одна позиция). Расчет маржи осуществляется на основе типа инструмента (SYMBOL_TRADE_CALC_MODE).
    • ACCOUNT_MARGIN_MODE_EXCHANGE — используется для биржевого рынка. Расчет маржи осуществляется на основе дисконтов, указанных в настройках инструментов. Дисконты устанавливаются брокером, однако не могут быть ниже значений, определенных биржей.
    • ACCOUNT_MARGIN_MODE_RETAIL_HEDGING — используется для внебиржевого рынка при независимом учете позиций ("хеджинг", по одному символу может быть несколько позиций). Расчет маржи осуществляется на основе типа инструмента (SYMBOL_TRADE_CALC_MODE) и с учетом размера захеджированной маржи (SYMBOL_MARGIN_HEDGED).

  15. В перечисление свойств клиентского терминала ENUM_TERMINAL_INFO_INTEGER добавлено значение TERMINAL_SCREEN_DPI — разрешающая способность вывода информации на экран измеряется в количестве точек на линейный дюйм поверхности (DPI). Знание этого параметра позволяет задавать размеры графических объектов таким образом, чтобы они выглядели одинаково на мониторах с различной разрешающей способностью.

  16. В перечисление свойств клиентского терминала ENUM_TERMINAL_INFO_INTEGER добавлено значение TERMINAL_PING_LAST — последнее известное значение пинга до торгового сервера в микросекундах. В одной секунде миллион микросекунд.

  17. Исправлен возврат результата вызова функции SendFTP. Ранее при удачной отсылке возвращалось значение FALSE вместо TRUE.
  18. Исправлена ошибка в функции StringConcatenate, в некоторых случаях приводившая к ошибке выполнения "Access violation".
  19. Исправлен ряд ошибок при работе с функциями-шаблонами.
  20. Теперь функции Print, Alert и Comment могут выводить строки размером более 4000 символов.
  21. Исправлена ошибка в функции ArrayCompare, возникавшая при сравнении массива с самим собой, но с разным смещением стартовой позиции от начала.
  22. В стандартную библиотеку добавлена поддержка торговли с хеджированием:

    CPosition
    Добавлены методы:

    • SelectByMagic — выбирает позицию по магическому номеру и символу для дальнейшей работы.
    • SelectByTicket — выбирает позицию по тикету для дальнейшей работы.

    CTrade
    Добавлены методы:

    • RequestPosition — получает тикет позиции.
    • RequestPositionBy — получает тикет встречной позиции.
    • PositionCloseBy — закрывает позицию с указанным тикетом позицией встречного направления.
    • SetMarginMode — устанавливает режим расчета маржи в соответствии с настройками текущего счета.

    Добавлена перегрузка для методов:

    • PositionClose — закрывает позицию по тикету.
    • PositionModify — модифицирует позицию по тикету.

    CAccountInfo
    Изменены методы:

    • MarginMode — теперь получает режим расчета маржи. Ранее работал аналогично новому методу StopoutMode.
    • MarginDescription — теперь получает режим расчета маржи как строку. Ранее работал аналогично новому методу StopoutModeDescription.

    Добавлены методы:

    • StopoutMode — получает режим задания минимального уровня залога.
    • StopoutModeDescription — получает режим задания минимального уровня залога как строку.

    CExpert
    Добавлены методы:

    • SelectPosition — выбирает позицию для последующей работы с ней.

  23. Внесен ряд исправлений в стандартную библиотеку.
  24. Исправлена ошибка выгрузки DLL-библиотек.
  25. Добавлена поддержка шаблонных конструкторов классов.

Сигналы

  1. Исправлен ряд ошибок отображения витрины торговых сигналов.

MetaEditor

  1. Исправлен поиск слова по файлам в режиме "Только слово целиком".
  2. Добавлен переход к файлу по двойному клику на строке результата компиляции соответствующего файла.
  3. Исправлено отображение некоторых элементов управления в Windows XP.
  4. Обновлена документация.