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

Серьезный трабл с ассинхронным режимом
Atom
07.07.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


Теги:


Спасибо:


< 1 2 3 4  >
Tauler

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


потому что робот у меня в WorkFlow нарисован. А там - детерменированый подход. А предполагаю что свойства меняются не одновременно, а что сперва баланс, а потом - состояние заявки.

Спасибо:

Mikhail Sukhov

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


у Вас sequential?

Спасибо:

Tauler

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


в 4м дотнете нет такого понятия. там один вид воркфлоу.

Спасибо:

Tauler

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


а никак нельзя лочить объект во время его апдейта?

Спасибо:

Tauler

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


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

On 7 июл, 17:51, Tauler <vladimir_igo...@mail.ru> wrote:

Спасибо:

Tauler

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


Короче придумал я костыль - класс-репозиторий, кторый подписывается на NewOrder и OrderChanged, и оттуда форкфлоу запрашивает заявку перед ее проверкой.

On 7 июл, 17:54, Tauler <vladimir_igo...@mail.ru> wrote:

Спасибо:

Mikhail Sukhov

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


Да, я еще вчера посмотрел как идет обновлением. Статус обновляется последним.

On 8 июл, 12:37, Tauler <vladimir_igo...@mail.ru> wrote:

Спасибо:

Tauler

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


Тогда вообще не понятно, почему у меня был статус Done, но баланс ненулевой на целиком закрытой заявке.

On 8 июл, 12:38, Mikhail Sukhov <msou...@gmail.com> wrote:

Спасибо:

Mikhail Sukhov

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


OrdersChanged должен был помочь разгадать загадку.

On 8 июл, 13:26, Tauler <vladimir_igo...@mail.ru> wrote:

Спасибо:

Tauler

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


Не прокатывает мое решение с репозиторием - такая же фигня.

икак не пойму как так получется

вот класс репозитория

public class OrderRepository { private ITrader trader; private List<Order> orders = new List<Order>();

   private object locker = new object();

   public OrderRepository(ITrader trader)
    {
        this.trader = trader;
        trader.OrdersChanged += new

Action<IEnumerable<Order>>(trader_OrdersChanged); trader.NewOrders += new Action<IEnumerable<Order>>(trader_NewOrders); }

   public Order GetOrderById(long id)
    {
        lock (locker)
        {
            Order order = orders.LastOrDefault(ord => ord.Id ==

id); if (order != null) { orders.RemoveAll(ord => ord.Id == id); orders.Add(order); }

           return order;
        }
    }

   public Order GetOrderByTransId(long id)
    {
        lock (locker)
        {
            Order order = orders.LastOrDefault(ord =>

ord.TransactionId == id); if (order != null) { orders.RemoveAll(ord => ord.TransactionId == id); orders.Add(order); Console.WriteLine(String.Format("GetOrderByTransId TRID = {0} St = {1} bal = {2} ID = {3}",

order.TransactionId, order.State, order.Balance, order.Id)); }

           return order;
        }
    }

   void trader_NewOrders(IEnumerable<Order> obj)
    {
        lock (locker)
        {
            orders.AddRange(obj);
        }

   }

   void trader_OrdersChanged(IEnumerable<Order> obj)
    {
        lock (locker)
        {
            orders.AddRange(obj);
        }
    }
}

воркфлоу перед какждыйм циклом проверки заявки лезет сюда за заявкой

но каким то чудом он получает из репозиторя заявку со стутусом Done, но с целым балансом. И тут же вылетает лог события что заявка изменилась, статус Доне, и баланс 0. Ваще ничего не понимаю :(

On 8 июл, 13:31, Mikhail Sukhov <msou...@gmail.com> wrote:

Спасибо:
< 1 2 3 4  >

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

loading
clippy