Серьезный трабл с ассинхронным режимом

Серьезный трабл с ассинхронным режимом
Atom
7/7/2010
Tauler


Михаил, у меня сложилось ощущение что ассинхронный режим работает иногда некорректно. поппытаюсь сейчас объяснить. Я пишу арбитражера, сут ье го работы - выставить заявку при появлении определенного сигнала и дальше 2 варианта - либо по исполнении ее выброзить еще одну заявку, либо , если сигнал ушел - снять первую заявку.

Это преамбула. (бага на версии 2.0.1, т.к. с 2.1 у меня известные вам траблы)

Амбула - т.к. режим асинхронный, когда уходит сигнал, успевает пройти запрос на снятие раз 15, прежде чем заявка снимется и поменяет статус на Canceled, у меня как только заявка становится Canceled или Matched срабатывает ветка в коде, кторая проверяет Volume-Blance и на эту разницу выкидывает вторую заявку (если Canceled), либо (если Matched) выкидывают вторую заявку на Volume первой.И у меня складывается ощущения, что в какой то момент сбивается или нарушается (не знаю как скзаать) процесс обновления полей в экземпляре заявки. Как эт овыглядит (в прилагаемом скрине, я далее для удобства буду давать только послдение 4 цифры номера заявки)

Сработал сигнал, выставилась заявка 6984, сигнал ушел, я отправляю trader.CancelOrder(order) до тех пор пока order.State != Canceled. как только Canceled, делаю order = null и дальше слушать сигнал.В логах так и написано - заявка стала Canceled, Balance = 2

Сигнал срабатывает второй раз, выставялю снвоа заявку order = new Order () .... (перменная та же самая), trader.RegisterOrder(order). Высталяется заявка (номер у нее 8248) Что происходит далее - на бирже заявка исполняется, но сигнал уходит. Робот честно пытается ее отменить до тех пор, пока статус у нее Active. как только статус заявки меняется на Исполнена(в квике), робот видит изменение статуса, но! в логах пишет мне что заявка Canceled, и Balance у нее 2. (то есть данные из заявки 6984). ну и соответсвенно не выкидаывает правую часть. и другая бага (наверно изза тгого, что уходит 10-15 запросов на снятие заявки до тех пора пока она станет Canceled - были случаи ,когда аявки часто тсавилис снимались, что например идут заявки 1,2,3,4,5,6 , они выставляются- снимают, но по логам заявка под номером например 4 вообще не снималась.То есть робот ее не снимал.Может быть это изза тго, что между первым запросом на снятие и реальным изменением ее статуса на Canceled на сервер уходит штук 15 транзакций на снятие?

скрин списка заявок - файл 07.07.png


Tags:


Thanks:


1 2 3  > >>
Mikhail Sukhov

Avatar
Date: 7/7/2010
Reply


По скрину. Пустые номера транзакций - это ручками? Номера транзакций уникальны? А то я смотрю у Вас с 1 начинается. До этого 1 не встречался? Уникальность должна быть в пределах всей таблицы (тоесть, робот запускали несколько раз и между запусками должна сохраняться уникальность). Заявки никак не меняются в коде? Если выставили заявку, то ее уже никак нельзя менять. Это иногда вводит в путаницу, когда используют ФОРЦ мув. Даже при нем нельзя менять заявку.

Thanks:

Tauler

Avatar
Date: 7/7/2010
Reply


Путсые - да, руками закрывал позы.ну каждый запуск робота - это с 1 начинается генерация. генератор - ваш, кторый не тики берет, а инкрементальный. Уникальность транзакций попробуем обеспечить. муваю я просто -

public Order MoveOrder(Order order, decimal price) { var newOrder = makeOrder(order.Direction, order.Security, order.Volume, order.Security.ShrinkPrice((double)price), order.Account); if (order.Price != newOrder.Price) { bool succes = CancelOrder(order); if (succes) {

TradeBasketHelperLogger.Logger.Debug(String.Format("Try moving order ID = {0}", order.Id)); trader.RegisterOrder(newOrder);

TradeBasketHelperLogger.Logger.Debug(String.Format("Moving order succes. New order ID = {0}", newOrder.Id)); return newOrder; } return order; } return order; }

Thanks:

Mikhail Sukhov

Avatar
Date: 7/7/2010
Reply


В Вашем случае такое не подойдет (надо в доке отразить). Сделайте свой генератор (по сути там только один метод реализовать). Который такты проца берет. Уж он то точно будет уникью =)

Thanks:

Tauler

Avatar
Date: 7/7/2010
Reply


Если затык тока в генераторе - поставлю вам памятник нерукотворный :)

Thanks:

Mikhail Sukhov

Avatar
Date: 7/7/2010
Reply


Я не знаю. По картинке выше не видно, были еще заявки с таким номером или нет.

Thanks:

Tauler

Avatar
Date: 7/7/2010
Reply


наверняка были - робот несколько раз запускался

Thanks:

Tauler

Avatar
Date: 7/7/2010
Reply


IncrementTransactionIdGenerator tranGen = new IncrementTransactionIdGenerator

; trader.TransactionIdGenerator = tranGen;

вот так я думаю прокатывать будет всегда :)

Thanks:

Tauler

Avatar
Date: 7/7/2010
Reply


нет, не катит - пишет что превышен размер . щас буду думать. я хрен знает как тики проца взять, и разбираться лень.

Thanks:

Mikhail Sukhov

Avatar
Date: 7/7/2010
Reply


Да, дилема... Штука в том, что транзакция не может превышать int.MaxValue. А если брать тики (+такты) то без разрядности long ну никак. Есть обходной маневр. Попробовать в начале инициализировать не количество тиков, а количество секунд с начала дня. Как то так:

{CurrentTransactionId = (DateTime.Now - DateTime.Today).TotalSeconds};

Thanks:

Tauler

Avatar
Date: 7/7/2010
Reply


Ну вполне рабочий такой work around.Надеюсь в версии 2.2 будет еще один генератор транзакций, для таких как я :)

Thanks:
1 2 3  > >>

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

loading
clippy