
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Karputov Vladimir И упростить OnTradeTransaction() - рассматривать только добавление сделки в историю - никаких ордеров
Ну и будет у Вас всё нормально, даже и не начинайте писать (не тратьте время).
А начал разбираться с этим вопросом, потому что на реале сбои пошли.
Похоже на выходных обновили сервер. Миллисекунды появились. Возможно будут еще сюрпризы.
Видимо функция OnTradeTransaction работает независимо от журнала операций.
Думаю такое поведение функции оправдано, незачем тормозить поток операций и ждать пока в журнале все запишется и посчитается.
В вашем случае наверное лучше использовать OnTrade,
или ждать и периодически с минимальной паузой проверять когда сделка появится в истории.
Похоже на выходных обновили сервер. Миллисекунды появились. Возможно будут еще сюрпризы.
Видимо функция OnTradeTransaction работает независимо от журнала операций.
Думаю такое поведение функции оправдано, незачем тормозить поток операций и ждать пока в журнале все запишется и посчитается.
В вашем случае наверное лучше использовать OnTrade,
или ждать и периодически с минимальной паузой проверять когда сделка появится в истории.
Привет, Сергей!
Да обновили, но не в выходные, а в четверг после вечерней сессии (спрашивал у брокера).
Я не могу использовать событие Trade() и ждать, когда обновятся данные в терминале.
Эксперт был написан давно, и до недавнего времени работал "как часы" (возможно мне везло, и событие TRADE_TRANSACTION_DEAL_ADD всегда приходило первым).
Эксперту важно как можно быстрее совершить ответную сделку, поэтому ассинхронный режим и OnTradeTransaction().
Сейчас, эксперт отсылает (иногда) дублирующие ордера на открытие и закрытие позиции.
Вы: "Думаю такое поведение функции оправдано, незачем тормозить поток операций и ждать пока в журнале все запишется и посчитается".
Всё равно пишется и считается после прихода TRADE_TRANSACTION_DEAL_ADD :)
Дело в том, что TRADE_TRANSACTION_DEAL_ADD может потерятся, а TRADE_TRANSACTION_HISTORY_ADD прийти, и тогда в терминале будут устаревшие данные о позиции. :(,
что собственно и происходит.
Странно, что разработчики не подумали об этом.
TRADE_TRANSACTION_HISTORY_ADD приходит лишь в том случае, если ордер исполнился или удалён (отменён), следовательно,
при изменении состояния ордера (соответственно позиция может изменится), в терминал должна поступить информация об изменении позиции,
даже, если TRADE_TRANSACTION_DEAL_ADD - потерялось
Посмотрим, что ответят разработчики.
Karputov Vladimir И упростить OnTradeTransaction() - рассматривать только добавление сделки в историю - никаких ордеров
Ну и будет у Вас всё нормально, даже и не начинайте писать (не тратьте время).
Просьба к "учителям" и "всезнайкам" выступать по существу,
а не просто ногу задирать у столба, чтобы отметится.
Прежде чем выпендриваться пред людьми желающими вам помочь, сформулировали бы нормально свой вопрос. Причем здесь асиннхронная отправка ордера, если частичное закрытие выполняется функцией OrderSend(). Вы вообще о чем вопрос то задаете?
Супер!
Это нужно рассматривать как помощь?
А Карпутов вообще не причём, просто когда я писал своё сообщение он уже запостил своё, а я не видел.
Изначально вопрос ставился так (если лень ситать сначала)
Как построить логирование, чтобы показать разработчикам наличие ошибки?
Зачем, я сам всё сделал и с логах отчётливо видно, что
после прихода TRADE_TRANSACTION_HISTORY_ADD (перед TRADE_TRANSACTION_DEAL_ADD)
терминал не обновляет информацию о позиции.
prostotrader, Вам Дмитрий правильно подсказывает, что частичное (и полное) закрытие идёт не в асинхронном порядке в вашем коде, а в синхронном... значит программа ждёт отклика с сервера...
Вероятно, что OnTradeTransaction срабатывает быстрее, чем изменяется сама позиция.
Потом тут:
можно попробовать зациклить проверку позиции. Может поможет....
Вот как-то так:
Не зная точный алгоритм (ТО, ЧТО нужно от программы), сложно оценивать правильность его реализации...
Изменил полностью на ассинхронный режим
Но ничего не изменилось
Это было очевидно, но "ради чистоты" эксперимента...
Полные логи в подвале
1. >Не зная точный алгоритм (ТО, ЧТО нужно от программы), сложно оценивать правильность его реализации...
Думал, что не сложно понять, что делает программа, ну если не понятно, то
Экперт открывает позизию на рынке ФОРТС объёмом 2 контракта, если позизия открыта, то она частично закрывается объёмом в 1 контракт,
затем, позиция закрывается полностью. И так несколько раз, пока счётчик tr_cnt<50
2. Вы можете "крутить" PositionSelect() хоть миллион раз - это ничего не изменит, потому что
пока вы в цикле, событие TRADE_TRANSACTION_DEAL_ADD не поступит, а значит терминал не обновит
информацию о позициию
...
Я выше говорил - не увлекайтесь ордерами: смотрите на сделки. Вот короткий код, который показывает КОГДА изменяется объём позиции и какой тип транзакции при этом:
И вот принты, при частичном закрытии:
Хорошо видно, что как только прошло события с типом торговой транзакции TRADE_TRANSACTION_DEAL_ADD - всё, данные позиции в терминале обновлены.