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


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


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

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

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

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


Tags:


Thanks:


artemox

Avatar
Date: 10/14/2010
Reply


Посмотрите в сторону Strategy.PositionManager.Position
Thanks:

pave111

Avatar
Date: 10/14/2010
Reply


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

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

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

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




Thanks:

artemox

Avatar
Date: 10/14/2010
Reply


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

pave111

Avatar
Date: 10/14/2010
Reply


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

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

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

artemox

Avatar
Date: 10/15/2010
Reply


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

pave111

Avatar
Date: 10/16/2010
Reply


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

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

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

Mikhail Sukhov

Avatar
Date: 10/16/2010
Reply


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


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

pave111

Avatar
Date: 10/16/2010
Reply


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

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

Mikhail Sukhov

Avatar
Date: 10/17/2010
Reply


pave111

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


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


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy