Кстати, я вот проверил всё. Оказывается, OnTradeTransaction() работает нормально в том числе и в отладчике. Всё показывает корректно, в отличие от OnTrade(). Поэтомулучшн работать с OnTradeTransaction() и не натыкаться на костыли OnTrade().
На данный момент, есть нестыковка логическая, если говорить о OnTradeTransaction() в присутствии TRADE_TRANSACTION_REQUEST. Этот тип полуячается, возвращает признак того, что произолшла какая-то операция(сделка) и всё. Как по мне, это лишнее. Проще проверять конкретно.. сработал тип такой-то, тогда делаем то-то и всё..
Я имел ввиду, странно спроектирована структура работы с событиями в этом плане. TRADE_TRANSACTION_REQUEST не нужен вообще. Проще было бы сразу отлавливать необходимое событие. Приведу пример, без какой-либо конкретики, т.к. мы говорим о том, что я думаю, а не о том, что имеется. Например, мне хочется что-то сделать, если последний открытый ордер перейдёт в состояние позиции.
Вместо того, что бы узнавать от сервера, что произошло событие TRADE_TRANSACTION_REQUEST, что не является конкретным, а лишь даёт возможность дальше по цепочке узнавать необходимую информацию, можно было бы сделать проще:
if (произошло добавление новой позиции.. что означает ордер сработал) {
делаем то, что нам нужно
}
Вот и всё. А, то что я вижу на самом деле, чутка удивляет. Мы получаем от сервера ответ не канкретный, а то, что что-то произошло. Дальше нужно проверять что.. Вот что я имею ввиду. Это излишество.
Я имел ввиду, странно спроектирована структура работы с событиями в этом плане. TRADE_TRANSACTION_REQUEST не нужен вообще. Проще было бы сразу отлавливать необходимое событие. Приведу пример, без какой-либо конкретики, т.к. мы говорим о том, что я думаю, а не о том, что имеется. Например, мне хочется что-то сделать, если последний открытый ордер перейдёт в состояние позиции.
Вместо того, что бы узнавать от сервера, что произошло событие TRADE_TRANSACTION_REQUEST, что не является конкретным, а лишь даёт возможность дальше по цепочке узнавать необходимую информацию, можно было бы сделать проще:
Вот и всё. А, то что я вижу на самом деле, чутка удивляет. Мы получаем от сервера ответ не канкретный, а то, что что-то произошло. Дальше нужно проверять что.. Вот что я имею ввиду. Это излишество.
Где в моём тексте Вы увидели TRADE_TRANSACTION_REQUEST (Уведомление о том, что торговый запрос обработан сервером, и результат его обработки получен)? Я говорил о TRADE_TRANSACTION_DEAL_ADD (Добавление сделки в историю. Осуществляется в результате исполнения ордера или проведения операций с балансом счета).
IO 018:13:33.195 TradeProcessor (EURUSD,H1) ---===Транзакция===---
NK 018:13:33.195 TradeProcessor (EURUSD,H1) Тикет сделки: 0
RR 018:13:33.195 TradeProcessor (EURUSD,H1) Тип сделки: DEAL_TYPE_BUY
DE 018:13:33.195 TradeProcessor (EURUSD,H1) Тикет ордера: 0
JS 018:13:33.195 TradeProcessor (EURUSD,H1) Состояние ордера: ORDER_STATE_STARTED
JN 018:13:33.195 TradeProcessor (EURUSD,H1) Тип ордера: ORDER_TYPE_BUY
FD 018:13:33.195 TradeProcessor (EURUSD,H1) Цена: 0.0000
FN 018:13:33.195 TradeProcessor (EURUSD,H1) Уровень Stop Loss: 0.0000
HF 018:13:33.195 TradeProcessor (EURUSD,H1) Уровень Take Profit: 0.0000
FQ 018:13:33.195 TradeProcessor (EURUSD,H1) Цена срабатывания стоп-лимитного ордера: 0.0000
RR 018:13:33.195 TradeProcessor (EURUSD,H1) Торговый инструмент:
HD 018:13:33.195 TradeProcessor (EURUSD,H1) Срок истечения отложенного ордера: 1970.01.0100:00
GS 018:13:33.195 TradeProcessor (EURUSD,H1) Тип ордера по времени действия: ORDER_TIME_GTC
DN 018:13:33.195 TradeProcessor (EURUSD,H1) Тип торговой транзакции: TRADE_TRANSACTION_REQUEST
FK 018:13:33.195 TradeProcessor (EURUSD,H1) Объём в лотах: 0.00
NS 018:13:33.195 TradeProcessor (EURUSD,H1)
QG 018:13:33.195 TradeProcessor (EURUSD,H1) ---===Запрос===---
IQ 018:13:33.195 TradeProcessor (EURUSD,H1) Тип выполняемого действия: TRADE_ACTION_PENDING
OE 018:13:33.195 TradeProcessor (EURUSD,H1) Комментарий к ордеру:
PQ 018:13:33.195 TradeProcessor (EURUSD,H1) Отклонение от запрашиваемой цены: 0
QS 018:13:33.195 TradeProcessor (EURUSD,H1) Срок истечения ордера: 1970.01.0100:00
FI 018:13:33.195 TradeProcessor (EURUSD,H1) Магик советника: 0
CM 018:13:33.195 TradeProcessor (EURUSD,H1) Тикет ордера: 22535983
PK 018:13:33.195 TradeProcessor (EURUSD,H1) Цена: 1.6500
KR 018:13:33.195 TradeProcessor (EURUSD,H1) Уровень Stop Loss ордера: 0.0000
OI 018:13:33.195 TradeProcessor (EURUSD,H1) Уровень Take Profit ордера: 0.0000
QK 018:13:33.195 TradeProcessor (EURUSD,H1) Уровень StopLimit ордера: 0.0000
QQ 018:13:33.195 TradeProcessor (EURUSD,H1) Торговый инструмент: GBPUSD
RD 018:13:33.195 TradeProcessor (EURUSD,H1) Тип ордера: ORDER_TYPE_BUY_LIMIT
LS 018:13:33.195 TradeProcessor (EURUSD,H1) Тип ордера по исполнению: ORDER_FILLING_RETURN
MN 018:13:33.195 TradeProcessor (EURUSD,H1) Тип ордера по времени действия: ORDER_TIME_GTC
IK 018:13:33.195 TradeProcessor (EURUSD,H1) Объём в лотах: 0.14
NS 018:13:33.195 TradeProcessor (EURUSD,H1)
CD 018:13:33.195 TradeProcessor (EURUSD,H1) ---===Ответ===---
RQ 018:13:33.195 TradeProcessor (EURUSD,H1) Код результата операции: 10009
JI 018:13:33.195 TradeProcessor (EURUSD,H1) Тикет сделки: 0
GM 018:13:33.195 TradeProcessor (EURUSD,H1) Тикет ордера: 22535983
LF 018:13:33.195 TradeProcessor (EURUSD,H1) Объём сделки: 0.14
JN 018:13:33.195 TradeProcessor (EURUSD,H1) Цена в сделке: 0.0000
MK 018:13:33.195 TradeProcessor (EURUSD,H1) Бид: 0.0000
CM 018:13:33.195 TradeProcessor (EURUSD,H1) Аск: 0.0000
IG 018:13:33.195 TradeProcessor (EURUSD,H1) Комментарий к операции:
DQ 018:13:33.195 TradeProcessor (EURUSD,H1) Идентификатор запроса: 1
Транзакция как таковая нам вообще не нужна, по сути. Как в любом фреймворке. Возьмём, например, браузер. Есть запрос.. есть ответ. Всё.. Зачем нам возвращать поля структуры транзакции? Ведь она пустая. Данных в ней нет вообще. Вот в чём суть. Здесь не логически думаешь, а приходится просто запоминать что-ли..
Где в моём тексте Вы увидели TRADE_TRANSACTION_REQUEST (Уведомление о том, что торговый запрос обработан сервером, и результат его обработки получен)? Я говорил о TRADE_TRANSACTION_DEAL_ADD (Добавление сделки в историю. Осуществляется в результате исполнения ордера или проведения операций с балансом счета).
Разницу видите?
Да. я же написал, что перескочил на OnTradeTransaction(), потому что у него хоть какие-то возможности есть. а в OnTrade(0 скудно совсем. но не всё так как хотелось бы. Выше написал свои мысли..
Viktar Dzemikhau: Да. я же написал, что перескочил на OnTradeTransaction(), потому что у него хоть какие-то возможности есть. а в OnTrade(0 скудно совсем. но не всё так как хотелось бы. Выше написал свои мысли..
Не могу понять Вашу логику - скачите из одного -в другое.
Однако на биржевых инструментах по ордеру может свершиться несколько сделок и остаток объема по ордеру еще останется активным. В этом случае можно проверять, что ордер перемещеается в историю и состояние ордера станет FILLED
Однако на биржевых инструментах по ордеру может свершиться несколько сделок и остаток объема по ордеру еще останется активным. В этом случае можно проверять, что ордер перемещеается в историю и состояние ордера станет FILLED
Если ордер исполнился частично, то его не будет в Истории до тех пор, пока он не исполнится полностью (но здесь делать FILLED-проверку делать бессмыленно), либо будет отменен (но здесь и STATE станет Canceled, т.е. опять же FILLED-проверка не актуальна).
***
На данный момент, есть нестыковка логическая, если говорить о OnTradeTransaction() в присутствии TRADE_TRANSACTION_REQUEST. Этот тип полуячается, возвращает признак того, что произолшла какая-то операция(сделка) и всё. Как по мне, это лишнее. Проще проверять конкретно.. сработал тип такой-то, тогда делаем то-то и всё..
Этот абзац я вообще не понял.
Этот абзац я вообще не понял.
Я имел ввиду, странно спроектирована структура работы с событиями в этом плане. TRADE_TRANSACTION_REQUEST не нужен вообще. Проще было бы сразу отлавливать необходимое событие. Приведу пример, без какой-либо конкретики, т.к. мы говорим о том, что я думаю, а не о том, что имеется. Например, мне хочется что-то сделать, если последний открытый ордер перейдёт в состояние позиции.
Вместо того, что бы узнавать от сервера, что произошло событие TRADE_TRANSACTION_REQUEST, что не является конкретным, а лишь даёт возможность дальше по цепочке узнавать необходимую информацию, можно было бы сделать проще:
if (произошло добавление новой позиции.. что означает ордер сработал) { делаем то, что нам нужно }Вот и всё. А, то что я вижу на самом деле, чутка удивляет. Мы получаем от сервера ответ не канкретный, а то, что что-то произошло. Дальше нужно проверять что.. Вот что я имею ввиду. Это излишество.
Я имел ввиду, странно спроектирована структура работы с событиями в этом плане. TRADE_TRANSACTION_REQUEST не нужен вообще. Проще было бы сразу отлавливать необходимое событие. Приведу пример, без какой-либо конкретики, т.к. мы говорим о том, что я думаю, а не о том, что имеется. Например, мне хочется что-то сделать, если последний открытый ордер перейдёт в состояние позиции.
Вместо того, что бы узнавать от сервера, что произошло событие TRADE_TRANSACTION_REQUEST, что не является конкретным, а лишь даёт возможность дальше по цепочке узнавать необходимую информацию, можно было бы сделать проще:
Вот и всё. А, то что я вижу на самом деле, чутка удивляет. Мы получаем от сервера ответ не канкретный, а то, что что-то произошло. Дальше нужно проверять что.. Вот что я имею ввиду. Это излишество.
Где в моём тексте Вы увидели TRADE_TRANSACTION_REQUEST (Уведомление о том, что торговый запрос обработан сервером, и результат его обработки получен)? Я говорил о TRADE_TRANSACTION_DEAL_ADD (Добавление сделки в историю. Осуществляется в результате исполнения ордера или проведения операций с балансом счета).
Разницу видите?
Даже вот в статье:
Где в моём тексте Вы увидели TRADE_TRANSACTION_REQUEST (Уведомление о том, что торговый запрос обработан сервером, и результат его обработки получен)? Я говорил о TRADE_TRANSACTION_DEAL_ADD (Добавление сделки в историю. Осуществляется в результате исполнения ордера или проведения операций с балансом счета).
Разницу видите?
Да. я же написал, что перескочил на OnTradeTransaction(), потому что у него хоть какие-то возможности есть. а в OnTrade(0 скудно совсем. но не всё так как хотелось бы. Выше написал свои мысли..
Не могу понять Вашу логику - скачите из одного -в другое.
Вышел из дискуссии.
Все просто.
OnTrade() сообщает, что произошли изменения.
OnTradeTransaction() сообщает, что произошли изменения и какие именно.
Соответственно, для задачи типикстартера лучше подходит OnTradeTransaction.
Для обнаружения срабатывания лимитного ордера и превращения его в позицию нужно искать сообщение о свершившейся сделке с номером по этому ордеру.
trans.type == TRADE_TRANSACTION_DEAL_ADD && trans.order == ИНТЕРЕСУЮЩИЙ ОРДЕРОднако на биржевых инструментах по ордеру может свершиться несколько сделок и остаток объема по ордеру еще останется активным. В этом случае можно проверять, что ордер перемещеается в историю и состояние ордера станет FILLED
Однако на биржевых инструментах по ордеру может свершиться несколько сделок и остаток объема по ордеру еще останется активным. В этом случае можно проверять, что ордер перемещеается в историю и состояние ордера станет FILLED
Если ордер исполнился частично, то его не будет в Истории до тех пор, пока он не исполнится полностью (но здесь делать FILLED-проверку делать бессмыленно), либо будет отменен (но здесь и STATE станет Canceled, т.е. опять же FILLED-проверка не актуальна).