English 中文 Español Deutsch 日本語 Português
В MetaTrader 5 добавлена хеджинговая система учета позиций

В MetaTrader 5 добавлена хеджинговая система учета позиций

MetaTrader 5Трейдинг | 21 марта 2016, 13:01
25 372 37
MetaQuotes
MetaQuotes

Платформа MetaTrader 5 изначально создавалась для биржевой торговли с неттинговым учетом позиций. При неттинговом учете по одному финансовому инструменту можно иметь только одну позицию, поэтому все дальнейшие операции по нему ведут к изменению объема, закрытию или развороту существующей позиции. Чтобы расширить возможности трейдеров ритейл-форекса, в платформу добавлена вторая система учета — хеджинг. Теперь по инструменту можно иметь множество позиций, в том числе — разнонаправленных. Это позволяет реализовывать торговые стратегии с так называемым локированием — если цена пошла против трейдера, он имеет возможность открыть позицию в противоположном направлении.

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

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

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


Учет позиций зависит от торгового счета

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

Система учета позиций на текущем счете

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

Открытие демо-счета с хеджированием

Для открытия реального счета с хеджингом обратитесь к вашему брокеру.


Неттинговая система

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

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

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

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

Неттинговая система учета позиций

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


Хеджинговая система

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

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

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

Хеджинговая система учета позиций

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


Влияние системы учета

В зависимости от системы учета позиций на счете, некоторые торговые функции платформы ведут себя по-разному:

  • Изменяются правила наследования Стоп Лосса и Тейк Профита.
  • Для закрытия позиции в системе неттинга достаточно совершить торговую операцию по тому же символу и в том же объеме, но в обратном направлении. Для закрытия позиции в системе хеджинга явно выберите команду "Закрыть позицию" в контекстном меню позиции.
  • В системе хеджинга невозможно развернуть позицию. Фактически будет осуществлено закрытие текущей позиции и открытие новой с остаточным объемом.
  • В системе хеджинга появляется новое условие для расчета маржи — Хеджированная маржа.


Новый тип торговой операции Close By

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

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

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

Закрытие позиции встречной

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

Операция закрытия позиции встречной в истории счета


Особенности расчета маржи в хеджинговой системе учета позиций

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

Позиции/ордера открыты в одном направлении

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

Для отложенных ордеров (при ненулевом коэффициенте маржи) маржа считается по отдельности.

Разнонаправленные позиции/ордера

Хеджированными, или перекрытыми, считаются позиции, открытые по одному и тому же инструменту, но в разных направлениях. Существуют два способа расчета маржи для таких позиций. Способ расчета определяется брокером.

Настройки расчета хеджированной маржи в спецификации контракта


Базовый расчет
По наибольшей стороне
Используется, если в поле "Хеджированная маржа" в спецификации контракта не указано "расчет по наибольшей стороне".

Расчет состоит из нескольких этапов:
  • Для неперекрытого объема
  • Для перекрытого объема (если указан размер хеджированной маржи)
  • Для отложенных ордеров
Итоговый размер рассчитывается как сумма маржи, рассчитанной на каждом из этапов.

Расчет для неперекрытого объема
  • Рассчитывается суммарный объем по всем позициям и рыночным ордерам для каждой из сторон — buy и sell.
  • Для каждой стороны рассчитывается средневзвешенная цена открытия позиций и рыночных ордеров: (цена открытия позиции или ордера 1 * объем позиции или ордера 1 + ... + цена открытия позиции или ордера N * объем позиции или ордера N) / (объем позиции или ордера 1 + ... + объем позиции или ордера N).
  • Вычисляется неперекрытый объем (из объема большей стороны вычитается меньший).
  • Используя рассчитанный объем и средневзвешенную цену, производится расчет маржи по формуле, соответствующей типу инструмента.
  • При учете коэффициента маржи и конвертации из валюты маржи в валюту депозита используется средневзвешенное значение коэффициента и курса.

Расчет для перекрытого объема
Используется, если в спецификации контракта указано значение "Хеджированная маржа". В этом случае маржа взимается и для перекрытого и для неперекрытого объема.

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

Если первоначальная маржа не задана (равна 0), то в поле "Хеджированная" указывается размер контракта. Расчет маржи осуществляется по формуле, соответствующей типу инструмента, с использованием указанного размера контракта. Например, есть две позиции Buy EURUSD 1 lot и Sell EURUSD 1 lot, размер контракта равен 100 000. Если в поле "Хеджированная" указать значение 100 000, то за обе позиции маржа будет взята как за 1 лот. Если указать 0, то за перекрытый объем маржа взиматься не будет.

За каждый перекрытый лот позиций маржа взимается в соответствии со значением, указанным в поле "Хеджированная маржа" в спецификации контракта:
  • Вычисляется перекрытый объем по всем открытым позициями и рыночным ордерам (из объема большей стороны вычитается неперекрытый).
  • Рассчитывается средневзвешенная цена открытия позиций и рыночных ордеров: (цена открытия позиции или ордера 1 * объем позиции или ордера 1 + ... + цена открытия позиции или ордера N * объем позиции или ордера N) / (объем позиции или ордера 1 + ... + объем позиции или ордера N).
  • Используя рассчитанный объем, средневзвешенную цену и размер хеджированной маржи, производится расчет маржи по формуле, соответствующей типу инструмента.
  • При учете коэффициента маржи и конвертации из валюты маржи в валюту депозита используется средневзвешенное значение коэффициента и курса.

Расчет для отложенных ордеров
  • Рассчитывается маржа по каждому типу отложенных ордеров (отдельно для Buy Limit, отдельно для Sell Limit и т.д.).
  • При учете коэффициента маржи и конвертации из валюты маржи в валюту депозита используется средневзвешенное значение коэффициента и курса для каждого типа отложенных ордеров.
Используется, если в поле "Хеджированная маржа" в спецификации контракта указано "расчет по наибольшей стороне".
  • Рассчитывается маржа для короткой и для длинной стороны по всем открытым позициям и рыночным ордерам.
  • Рассчитывается маржа по каждому типу отложенных ордеров (отдельно для Buy Limit, отдельно для Sell Limit и т.д.).
  • Суммируется маржа по длинной стороне: длинные позиции и рыночные ордера + длинные отложенные ордера.
  • Суммируется маржа по короткой стороне: короткие позиции и рыночные ордера + короткие отложенные ордера.
  • В качестве итогового размера маржи используется наибольшее из рассчитанных значений.


Изменения в MQL5

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

При модификации или закрытии позиции в системе хеджинга обязательно указывайте ее тикет (MqlTradeRequest::ticket). В системе неттинга тикет также можно указывать, однако идентификация позиции осуществляется по имени символа.


MqlTradeRequest

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

  • position — тикет позиции. Следует заполнять при изменении и закрытии позиции для ее однозначной идентификации. Как правило, соответствует тикету ордера, в результате которого позиция была открыта.
  • position_by — тикет встречной позиции. Используется при закрытии позиции встречной — открытой по тому же инструменту, но в противоположном направлении.
struct MqlTradeRequest
  {
   ENUM_TRADE_REQUEST_ACTIONS    action;           // Тип выполняемого действия
   ulong                         magic;            // Штамп эксперта (идентификатор magic number)
   ulong                         order;            // Тикет ордера
   string                        symbol;           // Имя торгового инструмента
   double                        volume;           // Запрашиваемый объем сделки в лотах
   double                        price;            // Цена 
   double                        stoplimit;        // Уровень Stop Limit ордера
   double                        sl;               // Уровень Stop Loss ордера
   double                        tp;               // Уровень Take Profit ордера
   ulong                         deviation;        // Максимально приемлемое отклонение от запрашиваемой цены
   ENUM_ORDER_TYPE               type;             // Тип ордера
   ENUM_ORDER_TYPE_FILLING       type_filling;     // Тип ордера по исполнению
   ENUM_ORDER_TYPE_TIME          type_time;        // Тип ордера по времени действия
   datetime                      expiration;       // Срок истечения ордера (для ордеров типа ORDER_TIME_SPECIFIED)
   string                        comment;          // Комментарий к ордеру
   ulong                         position;         // Тикет позиции
   ulong                         position_by;      // Тикет встречной позиции
  };

MqlTradeTransaction

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

  • position — тикет позиции, на которую повлияла транзакция. Заполняется для транзакций, касающихся обработки рыночных ордеров (TRADE_TRANSACTION_ORDER_* кроме TRADE_TRANSACTION_ORDER_ADD, где тикет позиции еще не присвоен) и истории ордеров (TRADE_TRANSACTION_HISTORY_*).
  • position_by — тикет встречной позиции. Используется при закрытии позиции встречной — открытой по тому же инструменту, но в противоположном направлении. Заполняется только для ордеров на закрытие позиции встречной (close by) и сделок на закрытие встречной (out by).
struct MqlTradeTransaction
  {
   ulong                         deal;             // Тикет сделки
   ulong                         order;            // Тикет ордера
   string                        symbol;           // Имя торгового инструмента
   ENUM_TRADE_TRANSACTION_TYPE   type;             // Тип торговой транзакции
   ENUM_ORDER_TYPE               order_type;       // Тип ордера
   ENUM_ORDER_STATE              order_state;      // Состояние ордера
   ENUM_DEAL_TYPE                deal_type;        // Тип сделки
   ENUM_ORDER_TYPE_TIME          time_type;        // Тип ордера по времени действия
   datetime                      time_expiration;  // Срок истечения ордера
   double                        price;            // Цена 
   double                        price_trigger;    // Цена срабатывания стоп-лимитного ордера
   double                        price_sl;         // Уровень Stop Loss
   double                        price_tp;         // Уровень Take Profit
   double                        volume;           // Объем в лотах
   ulong                         position;         // Тикет позиции
   ulong                         position_by;      // Тикет встречной позиции
  };


PositionGetTicket

Новая функция PositionGetTicket возвращает тикет позиции по индексу в списке открытых позиций и автоматически выбирает эту позицию для дальнейшей работы с ней при помощи функций PositionGetDouble, PositionGetInteger, PositionGetString.

ulong  PositionGetTicket(
   int  index      // номер в списке позиций
   );


PositionSelectByTicket

Новая функция PositionSelectByTicket выбирает открытую позицию для дальнейшей работы с ней по указанному тикету.

bool  PositionSelectByTicket(
   ulong   ticket     // тикет позиции
   );


PositionSelect

PositionSelect выбирает позицию по имени символа для дальнейшей работы с ней при помощи функций PositionGetDouble, PositionGetInteger, PositionGetString. В хеджинговой системе учета, где по одному символу может быть несколько позиций, функция выберет позицию с наименьшим тикетом.


ACCOUNT_MARGIN_MODE

Новое свойство 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

Новое свойство SYMBOL_MARGIN_HEDGED позволяет получить размер хеджированной маржи по торговому инструменту. Особенности расчета маржи при хеджинговой системе учета приведены выше.


Новые торговые константы

В связи с добавлением нового типа торговой операции "Закрытие встречной" появились новые торговые свойства:

  • TRADE_ACTION_CLOSE_BY — новый тип торговой операции — закрытие позиции встречной.
  • ORDER_TYPE_CLOSE_BY — новый тип ордера — закрыть позицию встречной.
  • ORDER_POSITION_BY_ID  — новое свойство ордера — тикет встречной позиции, которая используется для закрытия текущей.
  • DEAL_ENTRY_OUT_BY — новый тип сделки — закрытие позиции встречной.


Хеджинг и MQL5 Cloud Network — дополнительный бонус

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

Обновляйтесь и используйте новые возможности!

Последние комментарии | Перейти к обсуждению на форуме трейдеров (37)
Vladimir Karputov
Vladimir Karputov | 4 февр. 2018 в 20:41
rosomah:

На терминале MQL5 хотел открыть хеджевый - новый демо-счёт. (Уже есть демо-счёт неттинг) При открытии счёта не активируется кнопка - Использовать хеджирование при торговле.

Вопрос: Может ли на одном и том же терминале быть и хедж. и нетт. форекс-счета? Или переустанавливать терминал?

Есть зависимость от того к какому торговому серверу Вы логинитесь. Подключитесь к MetaQuotes-Demo
Vladimir M.
Vladimir M. | 4 февр. 2018 в 21:03
Vladimir Karputov:
Есть зависимость от того к какому торговому серверу Вы логинитесь. Подключитесь к MetaQuotes-Demo
Получилось на MetaQuotes-Demo. Благодарю.
Sergiy Riehl
Sergiy Riehl | 13 мар. 2018 в 12:29
Подскажите, кто знает, не могу самостоятельно найти информацию. У брокера хеджинговые счета. Мой робот написан под нетинговые счета. Как средствами MQL5 закрыть позицию, на хеджинговом счете? Функции OrderClose() в MQL5 нет. Противоположная позиция, как в нетинговом учете, не закрывает открытую. 
Sergiy Riehl
Sergiy Riehl | 13 мар. 2018 в 12:38
Sergiy Riehl:
Подскажите, кто знает, не могу самостоятельно найти информацию. У брокера хеджинговые счета. Мой робот написан под нетинговые счета. Как средствами MQL5 закрыть позицию, на хеджинговом счете? Функции OrderClose() в MQL5 нет. Противоположная позиция, как в нетинговом учете, не закрывает открытую. 

 Может на хеджинговом счете в торговом запросе нужно ставить TRADE_ACTION_CLOSE_BY ??

или есть более корректное решение?

Vladimir Karputov
Vladimir Karputov | 13 мар. 2018 в 12:43
Sergiy Riehl:
Подскажите, кто знает, не могу самостоятельно найти информацию. У брокера хеджинговые счета. Мой робот написан под нетинговые счета. Как средствами MQL5 закрыть позицию, на хеджинговом счете? Функции OrderClose() в MQL5 нет. Противоположная позиция, как в нетинговом учете, не закрывает открытую. 

Используйте универсальный код обхода позиций - он работает и на неттинге и на хедж. Пример в коде GalacticExplosion - функция CloseAllPositions

//+------------------------------------------------------------------+
//| Close all positions                                              |
//+------------------------------------------------------------------+
void CloseAllPositions()
  {
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current positions
      if(m_position.SelectByIndex(i))     // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
            m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
  }
Графические интерфейсы III: Группы простых и многофункциональных кнопок (Глава 2) Графические интерфейсы III: Группы простых и многофункциональных кнопок (Глава 2)
Первая глава третьей части серии была посвящена простым и многофункциональным кнопкам. Во второй главе рассмотрим группы взаимосвязанных кнопок, позволяющих создавать в приложениях элементы, когда пользователь может выбирать какую-либо одну опцию из представленного набора (группы).
Графические интерфейсы III: Простые и многофункциональные кнопки (Глава 1) Графические интерфейсы III: Простые и многофункциональные кнопки (Глава 1)
Приступим к рассмотрению такого элемента управления, как кнопка. Будут показаны примеры нескольких классов для создания простой кнопки, кнопок с расширенным функционалом («кнопка с картинкой» и «сдвоенная кнопка»), а также кнопок, которые взаимосвязаны между собой (группы кнопок и «радио-кнопки»). Кроме этого, внесём некоторые дополнения в уже существующие классы элементов управления, чтобы расширить их возможности.
Глубокая нейросеть со  Stacked RBM. Самообучение, самоконтроль Глубокая нейросеть со Stacked RBM. Самообучение, самоконтроль
Статья является продолжением предыдущих статей по глубоким нейросетям и выбору предикторов. В ней мы рассмотрим особенность нейросети, инициируемой Stacked RBM, а также её реализации в пакете "darch".
Рецепты MQL5 - Программируем скользящие каналы Рецепты MQL5 - Программируем скользящие каналы
В данной статье представлен способ программирования системы равноудалённых каналов. Рассматриваются некоторые нюансы построения таких каналов. Приводится типизация каналов, предлагается способ универсального типа скользящих каналов. При реализации кода используется инструментарий ООП.