Проблема при работе с лотом, больше чем одна заявка.
Atom Ответить
14.10.2010


Здравствуйте.
Реализовал стратегию, которая работала с одним лотом и все было хорошо. Как приходило событие NewMyTrades я понимал, что произошла сделка и делал действия необходимые в моей стратегии.
Сейчас попробовал реализовать аналогичное с числом лотов равным 2 и потерпел неудачу.
Мне нужно производить действия когда заявка полностью исчерпана, т.е куплены или проданы ВСЕ 2 лота.
Попробовал очевидное решение - добавил в обработчик проверку
foreach (MyTrade mt in NewMyTrades)
{
if (mt.Order.IsMatched())
{
выполнилось все, сделать действие
}
}

но почему-то такое срабатывает не всегда. иногда заявка оказывалась полностью выполненной (в квике), а робот считал, что еще нет.

Тогда попытался обрабатывать событие QTrader.PositionsChanged, и при появлении этого события сравнивать position.CurrentValue с 0 или 2. если вдруг стало 0, то можно сказать, что сделка закрылась. если 2, то сделка полностью открылось. но столкнулся с аналогичными проблемами - в большинстве случаев работает, но не всегда. проблема как и раньше.

Есть какие либо идеи?
Очень благодарен за ваш труд.


Теги:


Спасибо:




9 Ответов
artemox

Фотография
Дата: 14.10.2010
Ответить


Посмотрите в сторону Strategy.PositionManager.Position
Спасибо:

pave111

Фотография
Дата: 14.10.2010
Ответить


спасибо, попробую.

до этого также пробывал подход
position = QTrader.GetPosition(Portfolio, Security);
position.CurrentValue

с аналогичным результатом - работало, но не всегда.

не подскажите, в чем отличие Strategy.PositionManager.Position от данного варианта и в чем могла быть ошибка в моих прошлых вариантах?




Автор топика
Спасибо:

artemox

Фотография
Дата: 14.10.2010
Ответить


Насколько мне известно:
PositionManager считает позицию по сделкам, совершенным в рамках стратегии.
GetPosition получает позицию из таблиц квика.
Спасибо:

pave111

Фотография
Дата: 14.10.2010
Ответить


спасибо. а информацию о сделках он как получает?

orderReverse = new Order
{
Portfolio = Portfolio,
Price = price,
Security = Security,
Volume = vol,
Direction = dir,
};
QTrader.RegisterOrder(orderReverse);

отправил заявку и без какой-либо дополнительной обработки, я могу быть уверен, что Strategy.PositionManager.Position вернет верное, реальное значение?
Автор топика
Спасибо:

artemox

Фотография
Дата: 15.10.2010
Ответить


Информацию о сделках получает из таблицы квик "мои сделки".
Вы привели пример регистрации заявки, но в расчете позиции сами заявки по идее не участвуют.
Чтобы Strategy.PositionManager.Position считала позицию по исполненным заявкам, заявку необходимо регистрировать из стратегии.
Спасибо:

pave111

Фотография
Дата: 16.10.2010
Ответить


да, я понимаю, все что писалось выше делалось внутри стратегии.

все же не знаете чем могли быть вызванны ошибки выше?

сейчас переделал на PositionManager, буду тестировать. почему раньше не всегда работало не понятно
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 16.10.2010
Ответить


pave111
Здравствуйте.
Попробовал очевидное решение - добавил в обработчик проверку
foreach (MyTrade mt in NewMyTrades)
{
if (mt.Order.IsMatched())
{
выполнилось все, сделать действие
}
}


Добавьте обработчик не на NewMyTrades а на OrdersChanged.
Спасибо:

pave111

Фотография
Дата: 16.10.2010
Ответить


большое спасибо, этот вариант как раз не пробывал.
разрешите один вопрос -
я выставил заявку и она могла либо ВЫПОЛНИТСЯ полностью, либо быть снята мной. в обоих случаях будет state Done Заявка больше не активна на бирже (была полностью удовлетворена или снята из программы).
чтобы узнать что именно с ней произошло нужно посмотреть balance (продалась или отменена) ордера, так? это будет правильнее, чем получать позицию из квика?

хотел сказать Вам огромное спасибо за библиотеку, она сэкономила кучу времени и сил.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 16.10.2010
Ответить


pave111

я выставил заявку и она могла либо ВЫПОЛНИТСЯ полностью, либо быть снята мной. в обоих случаях будет state Done Заявка больше не активна на бирже (была полностью удовлетворена или снята из программы).
чтобы узнать что именно с ней произошло нужно посмотреть balance (продалась или отменена) ордера, так? это будет правильнее, чем получать позицию из квика?


1. order.IsMatched() order.IsCanceled()
2. это будет правильнее, потому что позиция обновляется с запозданием + так будет проще, потому что позиция - это совокупность исполненных частей заявок.
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy