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


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


Теги:


Спасибо:




34 Ответов
< 1 2 
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:

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

Tauler

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


В событии вы выбрасываете новый экземпляр заявки , или все время один
и тот же? кторый сформировался на NewOrder?

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

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

Mikhail Sukhov

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


Всегда один и тот же.

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

Спасибо:

Tauler

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


Интерфес IClonable реализован?

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

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

Mikhail Sukhov

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


Это для ReRegister. В перегруженом методе, где передается не новая
заявка, а только новые цена и объем, сначала клонируется текущая
заявка, а затем ей заполняются новые параметры.

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

Спасибо:
< 1 2 

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

loading
clippy