Матчинг ордеров и заявок

Матчинг ордеров и заявок
Atom
6/8/2012
igork


Хотелось бы понять, как матчить ордера и их исполнение (трэйды), чтобы отследить полное исполнение заявки.

Допустим, один из режимов работы будущего робота будет "синхронный", то есть выбрасывается несколько ордеров по маркету (допустим), и затем ожидание их исполнения, и только после этого пойдет последующая расстановка ордеров и т.д. Проблема усложняется тем, что на том же счету будет работать несколько роботов (в будущем) с теми же инструментами, и следовательно MyTrades и Orders будут сыпаться во все роботы синхронно, и их нужно как-то разделять. Так как объект Strategy не удалось для этого прикрутить, после недолгого размышления пришла мысль использовать коментарии (Order.Comment).

Все выглядит примерно так.

  1. В методе Connect

    trader.NewOrders += orders => { ProcessNewOrder(orders) }; trader.OrderChanged += orders => {ProcessNewOrders(orders) }; trader.OrderRegisterFailed += .... trader.OrderCancelFailed += .... trader.NewMyTrades += trades => { ProcessMyTrades(trades) };

  2. В методе запуска ордеров

    а. Создаем потокобезопасную коллекцию, в которой храним Comment + нужные нам данные.

    _collection = new ThreadSafeObservableCollection<MyCollection>();

    б. Создаем ордер. o = new Order { Market, Price, Volume, Direction, Comment = StrategyID.ToString() + Type.ToString() + Portfolio.Name + Security.ID + Direction.ToString() + RND.Next().ToString() };

    в. Регистрируем его в коллекции. MyCollection col = new MyCollection(); MyCollection.Comment = o.Comment; _collection.Add(col);

    г. запускаем Order. trader.RegisterOrder(o);

    и далее последовательно несколько ордеров в том же цикле. На этом выставление завершается, ждем подтверждений.

Теперь в методе

private void ProcessNewOrder(orders) { foreach (Order o in orders) { String Comment = o.Comment; var c = _collection.FirstOrDefault( cc => cc.Comment == Comment); if (var != null) нашли наш ордер, который мы запускали. } }

и далее по шагам:

  • когда order.State != Done - в коллекции отмечаем, что он не выполнен, следовательно весь цикл не имеет смысла, отыгрываем позицию назад (логика исключительно для примера).

  • когда Order.State == Done - отмечаем это, и ждем прихода MyTrades по этому ордеру.

  • если в процессе ожидания исполнения лимитных заявок рынок ушел, то убить все неисполненные ордера, запустить ордера для возврата позиции в исходное состояние (где отрботал sell туда дать Buy), и войти заново по новым уровням....

  • в событии ProcessMyTrades(trades) через вложенный Order по комментарию находим элемент коллекции и ждем, когда в трэйдах придет все то количество, которое мы размещали в Order.Volume.

  • и так далее с очень разветвленным алгоритмом.

Собственно вопрос: есть ли более элегантный метод матчинга, чем генерация комментариев через SID и rnd, чтобы не сравнивать строки? Я надеялся (казалось, логично) на TransactionID, но он всегда нулевой.

P.S. Не знаю, баг это или специфическое поведение, но согласно документации Объект MyTrade фактически содержит в себе два объекта Trade и Order. В процессе матчинга я пытался проверять, одинаковые ли MyTrade.Trade.OrderDirection и MyTrade.Order.Direction (мало ли :-) ). Оказалось, что MyTrade.Trade.OrderDirection всегда есть null, и следовательно, когда получаешь новый MyTrade по событию trader.NewMyTrades +>, то направление трэйда можно получить только из вложенного ордера. Версия 4.0.20.


Tags:


Thanks:


Alexander

Avatar
Date: 6/8/2012
Reply


Самый элегантный метод матчинга - order.WhenMatched().Do(blablabla).Apply(this);

P.S. Есть направление сделки, есть направление заявки. Это разные вещи. Шлюз смарткома не передаёт информацию по направлению сделки, поэтому они и null.

Thanks: igork

igork

Avatar
Date: 6/9/2012
Reply


Вот как раз эта конструкция Do(bla-bla-bla).Apply(this) для меня сложновата, а примера не нашел. Здесь помимо простого Matched все равно нужно отслеживать еще и NotMatched и прочие состояния, поэтому все равно придется подписываться и анализировать все подряд. Например, если запустить на тестовом стенде ITInvest заявку на GAZR-9.12, к примеру, то в OrderCancelFired прилетает сообщение "Заявка не была принята системой", никаких сообщений типа NewOrder со статусом Failed не приходит, и WhenMatched не будет никогда.

Тем не менее спасибо за оперативный ответ. Вопрос снимается, разобрался, через TransactionID тоже можно матчить.

P.S. Есть направление сделки, есть направление заявки. Это разные вещи Золотые слова "это разные вещи", и я об этом же. Но если в Smartcom этого нет, то будем считать, что это одно и то же :-). Спасибо за помощь.

Thanks:


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

loading
clippy