Как получить значение комиссии для открытой позиции?

 

Пожалуйста, подскажите, как получить значение комиссии для открытой позиции при торговле на инструментах рынка FOREX на счёте с хеджинговым учётом позиций?

Я всегда полагался в этом на стандартную библиотеку, в частности, её класс CPositionInfo. У него есть метод Comission(), описание которого в справочнике MQL5 звучит так: "Получает размер комиссии по позиции".

Однако сегодня в другой ветке уважаемый @Alexey Viktorov упомянул, что комиссия берётся не за позицию, а за сделку. И по этой причине она не отображается в терминале во вкладке "Торговля", а её следует искать во вкладке "История" среди сделок.

Это сподвигло меня задаться вопросом, каким же образом метод Comission() класса CPositionInfo из стандартной библиотеки вычисляет комиссию для позиции. Я открыл определение этого метода в файле MQL5\Inclide\Trade\PositionInfo.mqh и вот что обнаружил (строки 178-184):

//+------------------------------------------------------------------+
//| Get the property value "POSITION_COMMISSION"                     |
//+------------------------------------------------------------------+
double CPositionInfo::Commission(void) const
  {
   return(PositionGetDouble(POSITION_COMMISSION));
  }

Однако в описании функции PositionGetDouble сказано, что она принимает значение типа ENUM_POSITION_PROPERTY_DOUBLE. А в этом перечислении нет значения POSITION_COMMISSION!

Пожалуйста, подскажите, как такое возможно? И как на самом деле можно получить значение комиссии для открытой позиции при торговле на инструментах рынка FOREX на счёте с хеджинговым учётом позиций?

 

Наверное, в справке попросту не указали это значение для перечисления (забыли после нововведения). Да и как константа это значение не подсвечивается. Тем не менее, POSITION_COMMISSION успешно распознается компилятором, а поиск в справке приводит на страницу перечисления ENUM_POSITION_PROPERTY_DOUBLE. Так что такой код вполне может использоваться, раз его использовали в стандартной библиотеке.

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

 
Не используйте POSITION_COMMISSION - это рудимент. Для нахождения комиссии позиции - просуммируйте комиссии всех формирующих её сделок (входящих и выходящих).
 
То есть вместо вызова одной функции вы предлагаете запустить цикл с перебором всех ордеров в терминале и проверкой на предмет их принадлежности определённой позиции? В чём преимущество такого подхода?
 

Janis Ozols #:
То есть вместо вызова одной функции вы предлагаете запустить цикл с перебором всех ордеров в терминале и проверкой на предмет их принадлежности определённой позиции? В чём преимущество такого подхода?

Всё гораздо проще.

bool  HistorySelectByPosition(
   long   position_id     // идентификатор позиции - POSITION_IDENTIFIER
   );

POSITION_IDENTIFIER

Идентификатор позиции - это уникальное число, которое присваивается каждой вновь открытой позиции и не изменяется в течение всей ее жизни. Соответствует тикету ордера, которым была открыта позиция.

 

Идентификатор позиции указывается в каждом ордере (ORDER_POSITION_ID) и сделке (DEAL_POSITION_ID), которая ее открыла, изменила или закрыла. Используйте это свойство для поиска ордеров и сделок, связанных с позицией.

 

При развороте позиции в режиме неттинга (единой сделкой in/out) идентификатор позиции POSITION_IDENTIFIER не изменяется. Однако при этом POSITION_TICKET изменяется на тикет ордера, в результате которого произошел разворот. В режиме хеджинга разворот позиции не предусмотрен.

long

DEAL_COMMISSION

Комиссия по сделке

double


Правда цикл всё-же будет нужен. Ведь в формировании позиции может быть не одна сделка даже на hadge

Документация по MQL5: Торговые функции / HistorySelectByPosition
Документация по MQL5: Торговые функции / HistorySelectByPosition
  • www.mql5.com
HistorySelectByPosition - Торговые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov #:

Правда цикл всё-же будет нужен. Ведь в формировании позиции может быть не одна сделка даже на hadge

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

 
JRandomTrader #:

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

Комиссия зависит от брокера, а не от советника
 
Artyom Trishkin #:
Комиссия зависит от брокера, а не от советника

Да, но советник может желать знать комиссию только по своей виртуальной позиции, а не по суммарной при неттинге.

 
JRandomTrader #:

Да, но советник может желать знать комиссию только по своей виртуальной позиции, а не по суммарной при неттинге.

У сделки тоже существует магик.

DEAL_MAGIC

Magic number для сделки (смотри ORDER_MAGIC)

long

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Свойства ордеров - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov #:

У сделки тоже существует магик.

DEAL_MAGIC

Magic number для сделки (смотри ORDER_MAGIC)

long

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

 
Valeriy Yastremskiy #:

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

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

И если не лениво, ткните в сцильку и почитайте. Если останутся вопросы, обращайтесь.