Как мониторить факт срабатывания отложенного ордера? - страница 3

 
Кстати, я вот проверил всё. Оказывается, OnTradeTransaction() работает нормально в том числе и в отладчике. Всё показывает корректно, в отличие от  OnTrade(). Поэтомулучшн работать с OnTradeTransaction() и не натыкаться на костыли OnTrade().
 
Viktar Dzemikhau:

***

На данный момент, есть нестыковка логическая, если говорить о OnTradeTransaction() в присутствии TRADE_TRANSACTION_REQUEST. Этот тип полуячается, возвращает признак того, что произолшла какая-то операция(сделка) и всё. Как по мне, это лишнее. Проще проверять конкретно.. сработал тип такой-то, тогда делаем то-то и всё..

Этот абзац я вообще не понял. 

 
Vladimir Karputov:

Этот абзац я вообще не понял. 

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

Вместо того, что бы узнавать от сервера, что произошло событие TRADE_TRANSACTION_REQUEST, что не является конкретным, а лишь даёт возможность дальше по цепочке узнавать необходимую информацию, можно было бы сделать проще:

if (произошло добавление новой позиции.. что означает ордер сработал) {
  делаем то, что нам нужно
}

Вот и всё. А, то что я вижу на самом деле, чутка удивляет. Мы получаем от сервера ответ не канкретный, а то, что что-то произошло. Дальше нужно проверять что.. Вот что я имею ввиду. Это излишество.

 
Viktar Dzemikhau:

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

Вместо того, что бы узнавать от сервера, что произошло событие TRADE_TRANSACTION_REQUEST, что не является конкретным, а лишь даёт возможность дальше по цепочке узнавать необходимую информацию, можно было бы сделать проще:

Вот и всё. А, то что я вижу на самом деле, чутка удивляет. Мы получаем от сервера ответ не канкретный, а то, что что-то произошло. Дальше нужно проверять что.. Вот что я имею ввиду. Это излишество.

Где в моём тексте Вы увидели TRADE_TRANSACTION_REQUEST (Уведомление о том, что торговый запрос обработан сервером, и результат его обработки получен)? Я говорил о TRADE_TRANSACTION_DEAL_ADD (Добавление сделки в историю. Осуществляется в результате исполнения ордера или проведения операций с балансом счета).

Разницу видите?

 

Даже вот в статье:

IO      0       18:13:33.195    TradeProcessor (EURUSD,H1)      ---===Транзакция===---
NK      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Тикет сделки: 0
RR      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Тип сделки: DEAL_TYPE_BUY
DE      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Тикет ордера: 0
JS      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Состояние ордера: ORDER_STATE_STARTED
JN      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Тип ордера: ORDER_TYPE_BUY
FD      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Цена: 0.0000
FN      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Уровень Stop Loss: 0.0000
HF      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Уровень Take Profit: 0.0000
FQ      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Цена срабатывания стоп-лимитного ордера: 0.0000
RR      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Торговый инструмент: 
HD      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Срок истечения отложенного ордера: 1970.01.01 00:00
GS      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Тип ордера по времени действия: ORDER_TIME_GTC
DN      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Тип торговой транзакции: TRADE_TRANSACTION_REQUEST
FK      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Объём в лотах: 0.00
NS      0       18:13:33.195    TradeProcessor (EURUSD,H1)      

QG      0       18:13:33.195    TradeProcessor (EURUSD,H1)      ---===Запрос===---
IQ      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Тип выполняемого действия: TRADE_ACTION_PENDING
OE      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Комментарий к ордеру: 
PQ      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Отклонение от запрашиваемой цены: 0
QS      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Срок истечения ордера: 1970.01.01 00:00
FI      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Магик советника: 0
CM      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Тикет ордера: 22535983
PK      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Цена: 1.6500
KR      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Уровень Stop Loss ордера: 0.0000
OI      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Уровень Take Profit ордера: 0.0000
QK      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Уровень StopLimit ордера: 0.0000
QQ      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Торговый инструмент: GBPUSD
RD      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Тип ордера: ORDER_TYPE_BUY_LIMIT
LS      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Тип ордера по исполнению: ORDER_FILLING_RETURN
MN      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Тип ордера по времени действия: ORDER_TIME_GTC
IK      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Объём в лотах: 0.14
NS      0       18:13:33.195    TradeProcessor (EURUSD,H1)      
CD      0       18:13:33.195    TradeProcessor (EURUSD,H1)      ---===Ответ===---
RQ      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Код результата операции: 10009
JI      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Тикет сделки: 0
GM      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Тикет ордера: 22535983
LF      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Объём сделки: 0.14
JN      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Цена в сделке: 0.0000
MK      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Бид: 0.0000
CM      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Аск: 0.0000
IG      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Комментарий к операции: 
DQ      0       18:13:33.195    TradeProcessor (EURUSD,H1)      Идентификатор запроса: 1


Транзакция как таковая нам вообще не нужна, по сути. Как в любом фреймворке. Возьмём, например, браузер. Есть запрос.. есть ответ. Всё.. Зачем нам возвращать поля структуры транзакции? Ведь она пустая. Данных в ней нет вообще. Вот в чём суть. Здесь не логически думаешь, а приходится просто запоминать что-ли..
 
Vladimir Karputov:

Где в моём тексте Вы увидели TRADE_TRANSACTION_REQUEST (Уведомление о том, что торговый запрос обработан сервером, и результат его обработки получен)? Я говорил о TRADE_TRANSACTION_DEAL_ADD (Добавление сделки в историю. Осуществляется в результате исполнения ордера или проведения операций с балансом счета).

Разницу видите?

Да. я же написал, что перескочил на OnTradeTransaction(), потому что у него хоть какие-то возможности есть. а в OnTrade(0 скудно совсем. но не всё так как хотелось бы. Выше написал свои мысли..
 
Viktar Dzemikhau:
Да. я же написал, что перескочил на OnTradeTransaction(), потому что у него хоть какие-то возможности есть. а в OnTrade(0 скудно совсем. но не всё так как хотелось бы. Выше написал свои мысли..

Не могу понять Вашу логику - скачите из одного -в другое.

Вышел из дискуссии.

 

Все просто.

OnTrade() сообщает, что произошли изменения.

OnTradeTransaction() сообщает, что произошли изменения и какие именно.

Соответственно, для задачи типикстартера лучше подходит OnTradeTransaction.

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

trans.type == TRADE_TRANSACTION_DEAL_ADD && trans.order == ИНТЕРЕСУЮЩИЙ ОРДЕР

Однако на биржевых инструментах по ордеру может свершиться несколько сделок и остаток объема по ордеру еще останется активным. В этом случае можно проверять, что ордер перемещеается в историю и состояние ордера станет FILLED

if ( trans.type == TRADE_TRANSACTION_HISTORY_ADD )
{
        HistoryOrderSelect( trans.order );
        if ( HistoryOrderGetInteget( trans.order , ORDER_STATE ) == ORDER_STATE_FILLED )
        {
                ...
        }
}
 
Ilya Baranov:

Однако на биржевых инструментах по ордеру может свершиться несколько сделок и остаток объема по ордеру еще останется активным. В этом случае можно проверять, что ордер перемещеается в историю и состояние ордера станет FILLED

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

 
Во-втором примере не совсем универсально. Может быть, что ордер не заполнился весь и можно так прождать.. зазимовать ))