"Отложенный ордер сработал частично - открылась позиция с Position_ID = Order_Ticket." - Это всегда соответствует? Независимо от того что открыта только часть ордера?
Если "ДА" то всё в соответствии с документацией.
"Остаток ордера исполнился - открылась позиция с Position_ID != Order_Ticket." - А тикету какого ордера должно соответствовать? Тому, часть которого уже исполнена, или тому который остался после частичного исполнения? И с каким вы сравнивали?
(не уверен, проверить сложно,по аналогии с частичным закрытием позиций)
Это все работает так:
1) отложенный ордер сработал частично - открылась позиция с Position_ID = Order_Ticket1
2) остаток ордера формируется в новый ордер Order_Ticket2 и ждет своего исполнения, новый Order_Ticket2 != Order_Ticket1, так как не может быть 2 ордера в истории с одинаковыми Order_Ticket
3) остаток ордера исполнился - открылась позиция с Position_ID = Order_Ticket2
в истории два ордера в терминале две позиции, все соответствует
2) остаток ордера формируется в новый ордер Order_Ticket2 и ждет своего исполнения, новый Order_Ticket2 != Order_Ticket1, так как не может быть 2 ордера в истории с одинаковыми Order_Ticket
Не просто так есть ORDER_STATE_PARTIAL. Т.е. новый ордер с остатком не создается. При частичном исполнении Сделка может быть еще без Ордера в Истории.
Если считать, что это штатное поведение MT5, а не особенности хака брокера, то
ORDER_STATE_PARTIAL у исторических ордеров не бывает.
Исполненнные ордера всегда имеют статус ORDER_STATE_FILLED.
При частичном исполнении создаются соответствующие новые маркет ордера торговым сервером (ORDER_REASON_CLIENT - даже если исходный ордер выставлен автоматом(EXPERT)).
Старый живой ордер (тикет не изменяется) остается висеть с уменьшенным объемом (ORDER_VOLUME_CURRENT).
Старый живой ордер при этом получает статус ORDER_STATE_PARTIAL. Фактически, этот флаг является результатом сравнения ORDER_VOLUME_CURRENT и ORDER_VOLUME_INITIAL.
Все открываемые позиции получают ID == OrderTicket. Где OrderTicket - тикеты, порождаемые торговым сервером.
Торговая сделка всегда имеет ровно один исторический ордер и его статус ORDER_STATE_FILLED.
Каждый исполненный исторический ордер имеет ровно одну сделку.
У любого исполненного ордера ORDER_VOLUME_INITIAL равен объему, на который он исполнился. Т.е. даже исходный раздербаненный ордер после полного исполнения имеет ORDER_VOLUME_INITITAL равный объему порожденной им сделки.
Время исходного ордера (который частично исполнялся) не меняется и не равно времени его сделки.
В исторической таблице идет сортировка по времени ордеров (ORDER_TIME_SETUP), не сделок. Поэтому если делать HistorySelect от DEAL_TIME, можно не получить в историческую таблицу соответствующий ордер.
HistorySelectByPosition всегда возвращает необходимое множество сделок/ордеров.
Для любой торговой сделки можно вычислить величину проскальзывания.
Недостатки
Не хватает ORDER_REASON_PARTIAL, DEAL_REASON_PARTIAL и POSITION_REASON_PARTIAL. При этом в соответствующих перечислениях эти флаги должны быть помещены сразу после REASON_EXPERT.
Соответствующие маркет-ордера при частичном исполнении лимитных ордеров по своей природе могут иметь отрицательное проскальзывание. Похоже, это ошибка только в типе ордеров и на самом деле маркет-ордера нет - создается только внутри MT5 и не идет наружу.
(не уверен, проверить сложно,по аналогии с частичным закрытием позиций)
Это все работает так:
1) отложенный ордер сработал частично - открылась позиция с Position_ID = Order_Ticket1
2) остаток ордера формируется в новый ордер Order_Ticket2 и ждет своего исполнения, новый Order_Ticket2 != Order_Ticket1, так как не может быть 2 ордера в истории с одинаковыми Order_Ticket
3) остаток ордера исполнился - открылась позиция с Position_ID = Order_Ticket2
в истории два ордера в терминале две позиции, все соответствует
А мне странно, что никак не могу получить ID. Ети строки возврощают Тикет
А в историю так :
Здесь : Позиция=66702123 (записал в коментар, совпадает с Тикет ордера на открытия), а ID=6737227 - что на порядок меньше . Почему ?
А мне странно, что никак не могу получить ID. Ети строки возврощают Тикет
А в историю так :
Здесь : Позиция=66702123 (записал в коментар, совпадает с Тикет ордера на открытия), а ID=6737227 - что на порядок меньше . Почему ?
Почему Вы решили, что предоставленной информации достаточно для ответа?
Давайте по-порядку:
"Отложенный ордер сработал частично - открылась позиция с Position_ID = Order_Ticket." - Это всегда соответствует? Независимо от того что открыта только часть ордера?
Если "ДА" то всё в соответствии с документацией.
"Остаток ордера исполнился - открылась позиция с Position_ID != Order_Ticket." - А тикету какого ордера должно соответствовать? Тому, часть которого уже исполнена, или тому который остался после частичного исполнения? И с каким вы сравнивали?
(не уверен, проверить сложно,по аналогии с частичным закрытием позиций)
Это все работает так:
1) отложенный ордер сработал частично - открылась позиция с Position_ID = Order_Ticket1
2) остаток ордера формируется в новый ордер Order_Ticket2 и ждет своего исполнения, новый Order_Ticket2 != Order_Ticket1, так как не может быть 2 ордера в истории с одинаковыми Order_Ticket
3) остаток ордера исполнился - открылась позиция с Position_ID = Order_Ticket2
в истории два ордера в терминале две позиции, все соответствует
2) остаток ордера формируется в новый ордер Order_Ticket2 и ждет своего исполнения, новый Order_Ticket2 != Order_Ticket1, так как не может быть 2 ордера в истории с одинаковыми Order_Ticket
Не просто так есть ORDER_STATE_PARTIAL. Т.е. новый ордер с остатком не создается. При частичном исполнении Сделка может быть еще без Ордера в Истории.
Не сплю, на вахте.
Ждемс.
А мне странно, что никак не могу получить ID. Ети строки возврощают Тикет
А в историю так :
Здесь : Позиция=66702123 (записал в коментар, совпадает с Тикет ордера на открытия), а ID=6737227 - что на порядок меньше . Почему ?
на картинке не тот ID о котором вы думаете
Не просто так есть ORDER_STATE_PARTIAL. Т.е. новый ордер с остатком не создается.
я думал об этом, так же есть такая надпись
но мне кажется что просто кто-то не хотел разжёвывать и написал общий принцип
на самом деле первый ордер исполняется в том объеме в котором смог, и он уже в истории
а остатки формируются в новый ордер, и тогда уже ему присваивается статус ORDER_STATE_PARTIAL
на самом деле первый ордер исполняется в том объеме в котором смог, и он уже в истории
а остатки формируются в новый ордер и уже ему присваивается статус ORDER_STATE_PARTIAL
Это был бы лучший вариант. Если ордера в Истории могут иметь ORDER_STATE_PARTIAL, то, скорее всего, так и есть.
Добился частичного исполнения. Выставил BuyLimit на 1 лот через скрипт.
Вкладка Позиции
Ордера/Сделки
Журнал
Натравленный скрипт на торговое окружение
Результат
Выводы
Если считать, что это штатное поведение MT5, а не особенности хака брокера, то
Недостатки
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
POSITION_TICKET != POSITION_IDENTIFIER
Pavel Kolchin, 2018.02.12 13:31
(не уверен, проверить сложно,по аналогии с частичным закрытием позиций)
Это все работает так:
1) отложенный ордер сработал частично - открылась позиция с Position_ID = Order_Ticket1
2) остаток ордера формируется в новый ордер Order_Ticket2 и ждет своего исполнения, новый Order_Ticket2 != Order_Ticket1, так как не может быть 2 ордера в истории с одинаковыми Order_Ticket
3) остаток ордера исполнился - открылась позиция с Position_ID = Order_Ticket2
в истории два ордера в терминале две позиции, все соответствует
значит можно уверенно сказать что в hedge счетах всегда POSITION_TICKET == POSITION_IDENTIFIER ?
в таком случае по сабжу можно обойтись без перебора (зная тикет сделки - выбрать позицию)