Здравствуйте. Реализовал стратегию, которая работала с одним лотом и все было хорошо. Как приходило событие NewMyTrades я понимал, что произошла сделка и делал действия необходимые в моей стратегии. Сейчас попробовал реализовать аналогичное с числом лотов равным 2 и потерпел неудачу. Мне нужно производить действия когда заявка полностью исчерпана, т.е куплены или проданы ВСЕ 2 лота. Попробовал очевидное решение - добавил в обработчик проверку foreach (MyTrade mt in NewMyTrades) { if (mt.Order.IsMatched()) { выполнилось все, сделать действие } }
но почему-то такое срабатывает не всегда. иногда заявка оказывалась полностью выполненной (в квике), а робот считал, что еще нет.
Тогда попытался обрабатывать событие QTrader.PositionsChanged, и при появлении этого события сравнивать position.CurrentValue с 0 или 2. если вдруг стало 0, то можно сказать, что сделка закрылась. если 2, то сделка полностью открылось. но столкнулся с аналогичными проблемами - в большинстве случаев работает, но не всегда. проблема как и раньше.
Есть какие либо идеи? Очень благодарен за ваш труд.
コメント (9)
ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください
Посмотрите в сторону Strategy.PositionManager.Position
спасибо, попробую.
до этого также пробывал подход position = QTrader.GetPosition(Portfolio, Security); position.CurrentValue
с аналогичным результатом - работало, но не всегда.
не подскажите, в чем отличие Strategy.PositionManager.Position от данного варианта и в чем могла быть ошибка в моих прошлых вариантах?
Насколько мне известно: PositionManager считает позицию по сделкам, совершенным в рамках стратегии. GetPosition получает позицию из таблиц квика.
спасибо. а информацию о сделках он как получает?
orderReverse = new Order ; QTrader.RegisterOrder(orderReverse);
отправил заявку и без какой-либо дополнительной обработки, я могу быть уверен, что Strategy.PositionManager.Position вернет верное, реальное значение?
Информацию о сделках получает из таблицы квик "мои сделки". Вы привели пример регистрации заявки, но в расчете позиции сами заявки по идее не участвуют. Чтобы Strategy.PositionManager.Position считала позицию по исполненным заявкам, заявку необходимо регистрировать из стратегии.
да, я понимаю, все что писалось выше делалось внутри стратегии.
все же не знаете чем могли быть вызванны ошибки выше?
сейчас переделал на PositionManager, буду тестировать. почему раньше не всегда работало не понятно
Добавьте обработчик не на NewMyTrades а на OrdersChanged.
большое спасибо, этот вариант как раз не пробывал. разрешите один вопрос - я выставил заявку и она могла либо ВЫПОЛНИТСЯ полностью, либо быть снята мной. в обоих случаях будет state Done Заявка больше не активна на бирже (была полностью удовлетворена или снята из программы). чтобы узнать что именно с ней произошло нужно посмотреть balance (продалась или отменена) ордера, так? это будет правильнее, чем получать позицию из квика?
хотел сказать Вам огромное спасибо за библиотеку, она сэкономила кучу времени и сил.