Вопрос по обработке сделок


Ситуация такая, стратегия отправляет заявки на биржу метод RegisterOrder(Order) и по таймауту или исполнению некого условия снимает через метод Trader.CancelOrder(Order). Учет закрытых позиций и цены происходит при событии появлении новой сделки order.NewTrades() (нужно для работы робота),
По событию снятия заявки .Order.Canceled() или её полного исполнения заявка считается закрытой.

В каждом событии стоит проверка - если статус заявки Done и количество учтенных роботом позиций равно ОбъемЗаявки - БалансЗаявки. То исключаем её из списка робота, и считаем что закрыта, т.е. робот считает что вся информация по заявке получена.
Учитывается ситуация если сделки пришли позже, чем заявка была снята/исполнена, так же есть обработка события неудачной отмены заявки. Код основательно перерыт и перепроверен.

Но иногда примерно с одной-двумя из 500 заявок возникает ситуация когда условие проверки выполняется заявка исключается, но Робот учитывает не все сделки прошедшие по заявке. Как вариант может быть такое, что в какой-то момент статус заявки Done, а баланс по ней ещё может изменится?
В чем может быть причина, может сталкивался кто-то? Уже просто не знаю что с этим делать.
Сейчас все работает на тестовом сервере РТС, Forts Plaza - II.

Теги:


Спасибо:


1 2 3  >
Самунджян Артем

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


Александр (ПАА)

Ситуация такая, стратегия отправляет заявки на биржу метод RegisterOrder(Order) и по таймауту или
Но иногда примерно с одной-двумя из 500 заявок возникает ситуация когда условие проверки выполняется заявка исключается, но Робот учитывает не все сделки прошедшие по заявке. Как вариант может быть такое, что в какой-то момент статус заявки Done, а баланс по ней ещё может изменится?
В чем может быть причина, может сталкивался кто-то? Уже просто не знаю что с этим делать.
Сейчас все работает на тестовом сервере РТС, Forts Plaza - II.

Если я всё правильно понял, то могу посоветовать использовать strategyRule и непосредственно опираться на событие изменения самого ордера , то есть переписать полностью алгоритм на событийную модель.
Если состояние у заявки Done , то никакое изменение по ней прийти уже не может.Попробуй включить логирование , если неизвестно как , я отпишусь...Не совсем понял , как работает "проверка", может быть её можно как-нибудь доработать.
Код


 this.When(_order.Matched())
                            .Do(o =>
                                    {
                                        //алгоритм работы с ордером
                                    });

Спасибо:

Alexander

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


Артём Самунджян
Если состояние у заявки Done , то никакое изменение по ней прийти уже не может.


Может.
Мы можем done выставить как ответ на заявку по транзакционному потоку, а затем нам пришло изменение по таблице заявок.

В данном случае, как совершенно верно ответил Артём, лучше пользоваться правилами.

И просьба всегда указывать версию при описании проблем. В случае с плазой изменений в 4.1 было крайне много и если пользуетесь 4.0 - совет переходить на 4.1 как можно скорее.
Спасибо:

Александр (ПАА)

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


Спасибо за ответы. В принципе я и так использую событийную модель. Может если кусок кода показать понятнее будет, о чем я.
Происходит это так, в стратегии объявлена публичная функция RegisterOrder(JointRequest order), JointRequest - это собственный класс, в нем содержится Заявка Order и дополнительная информация. Стратегия занимается только тем что регистрирует/снимает заявки и обрабатывает соответствующие события, остальной частью занимается другой класс, который и вызывает Strategy.RegisterOrder или Strategy.CancelOrder.

Код
 public void RegisterOrder(JointRequest order)
        {
            order.State = StateJointRequest.Sended;
            JointRequests.Add(order);
            try
            {
                base.RegisterOrder(order.Order);
                OnJointRequestChanged(order);
                order.Save();
                this
                   .When(order.Order.Matched())
                   .Do((Action)(() => RequestMatched(order)));
                this
                  .When(order.Order.NewTrades())
                  .Do((Action<IEnumerable<MyTrade>>)((newTrades) => NewTradesRequest(order, newTrades)));
            }
            catch  
            {
                order.State = StateJointRequest.None;
            }
        }

        public void NewTradesRequest(JointRequest order,IEnumerable<MyTrade> MyTrades)
        {
            order.ClosePositions(MyTrades);
            //то самое условие
            if (order.Order.State == OrderStates.Done && (order.Order.Volume - order.Order.Balance == order.ClosedCount))
                order.CloseJR();
        }
  public void RequestMatched(JointRequest order)
        {
            //то самое условие
            if (order.Order.State == OrderStates.Done && (order.Order.Volume - order.Order.Balance == order.ClosedCount))
                order.CloseJR();
        }

аналогично и со снятием заявки. ClosedCount считается в order.ClosePositions(MyTrades) считается правильно.

Использую 4.0.23, а где можно скачать 4.1 чтобы перейти? по ссылке с сайта на скачивание вижу только 4.0 и более ранние версии.
Спасибо:

Alexander

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


NewTrades может быть раньше чем order.Matched, а может и нет.
+ выше дал пояснения по тому как баланс может меняться после Done.

4.1 брать с stocksharp.codeplex.com из sources, папка dev\references
Спасибо:

Александр (ПАА)

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


Спасибо, Александр, а как тогда лучше организовать проверку все ли сделки по заявке учтены? С Matched() то понятно там Order.Balance = 0, а если событие Order.Canceled()?
Спасибо:

Alexander

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


Александр (ПАА)
Спасибо, Александр, а как тогда лучше организовать проверку все ли сделки по заявке учтены? С Matched() то понятно там Order.Balance = 0, а если событие Order.Canceled()?


давайте немного с другой стороны зайдём.
расскажите для чего вам это нужно. мне кажется, подход немного не верный.
Спасибо:

Александр (ПАА)

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


Давайте попробуем. Суть в том что у меня есть много модулей, каждый из который торгует по некоему алгоритму, часто бывает так, что нужно отправить на биржу одновременно несколько заявок от разных модулей, чтобы сократить количество отправляемых заявок а так же исключить встречные заявки от модулей, я составляю одну - которая и отправляется на биржу через стратегию, но после исполнения или снятия этой объединенной заявки информацию по ней необходимо разобрать и вернуть каждому модулю сколько и как исполнилось по нему.
Спасибо:

Alexander

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


тогда не отслеживайте done, а отслеживайте только new trades.
приходит новая сделка - сообщили модулую.
когда у модуля исполненный объём станет равен посланному - считаем что заявка исполнилась полностью.
Спасибо:

Александр (ПАА)

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


А как быть если заявка полностью не исполниться?
Я же снимаю ее по таймауту, и она может либо быть частично исполнена, либо вообще не исполнена...
Спасибо:

Alexander

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


У вас баланс меняется после Done только для снятой заявки?
Спасибо:
1 2 3  >

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

loading
clippy