Изменение Order.Balance после того, как заявка получила OrderStates == Done

Изменение Order.Balance после того, как заявка получила OrderStates == Done
Atom
1/24/2011
Maxim


Михаил, добрый день. Обращаюсь по привычке к Вам, так как не в курсе, поддерживает ли S# еще кто либо. Если я ошибаюсь, поправьте меня.

Михаил, прошу помочь разобраться в следующем. Ситуация:

  1. Проверяю состояние заявки.
  2. Если состояние заявки Active, отменяю асинхронно заявку.
  3. Дожидаюсь события OrdersChanged, когда заявка станет Done.
  4. Проверяю Balance, он равен Volume.
  5. Проверяю в Квике состояние заявки, заявка оказывается полностью удовлетворена. То-есть Balance должен был быть равен нулю в пункте 4.

Если между пунктом 3 и 4 сделать пауза в 1 секунду, то Balance будет равен нулю.

Из этого я могу предположить, что Balance может изменится после того, как заявка приобрела статус Done. Хотя в мануале написано: «Done - заявка более не активна на бирже, и по ней не может прийти ни одно изменение.»

Так ли это? Сталкивались ли Вы с этим?


Tags:


Thanks:


< 1 2 3 4 5  >
Maxim

Avatar
Date: 4/25/2011
Reply


  1. QuikTrader.IsAyncMode = true
  2. Заявки регистрируются, а потом снимаются.
  3. Настроил логирование, но как теперь выяснилось, оно работало не совсем коректно. В частности, нет информации по PreProcessDdeData и в OrdersChanged нет времени. Оставлю пока информацию, которую собрал. Переделаю логирование и соберу более полную информацию.

Безрезультатно пытаюсь повторить эту ошибку в тестовом Квике. Михаил, а может эта ошибка быть вызвана некоректным поведением брокерского сервера?

Первая заявка:

NewOrders

InitDate 2011-04-25 18:36:44.4077500 Date 0001-01-01 00:00:00.0000000 CancelDate NULL Price 101.72 Volume 2927 Balance 2927 Id 1973988474 TransactionId 66671920 Direction S StockName SBER03 State Active Status Accepted ExecutionCondition PutInQueue Type Limit

OrdersChanged

TransactionId: 66671920 Balance: 1992 Volume: 2927 State: Active TransactionId: 66671920 Balance: 1992 Volume: 2927 State: Active TransactionId: 66671920 Balance: 782 Volume: 2927 State: Active TransactionId: 66671920 Balance: 782 Volume: 2927 State: Active TransactionId: 66671920 Balance: 782 Volume: 2927 State: Done TransactionId: 66671920 Balance: 742 Volume: 2927 State: Done TransactionId: 66671920 Balance: 732 Volume: 2927 State: Done

Вторая заявка:

NewOrders

InitDate 2011-04-25 18:37:22.2358750 Date 0001-01-01 00:00:00.0000000 CancelDate NULL Price 101.66 Volume 7884 Balance 7884 Id 1973994793 TransactionId 66671954 Direction S StockName SBER03 State Active Status Accepted ExecutionCondition PutInQueue Type Limit

OrdersChanged

Line 232: OrdersChanged TransactionId: 66671954 Balance: 7874 Volume: 7884 State: Active Line 233: OrdersChanged TransactionId: 66671954 Balance: 7874 Volume: 7884 State: Active Line 235: OrdersChanged TransactionId: 66671954 Balance: 7874 Volume: 7884 State: Active Line 237: OrdersChanged TransactionId: 66671954 Balance: 7374 Volume: 7884 State: Active Line 238: OrdersChanged TransactionId: 66671954 Balance: 7294 Volume: 7884 State: Active Line 239: OrdersChanged TransactionId: 66671954 Balance: 7294 Volume: 7884 State: Active Line 240: OrdersChanged TransactionId: 66671954 Balance: 7264 Volume: 7884 State: Active Line 241: OrdersChanged TransactionId: 66671954 Balance: 7164 Volume: 7884 State: Active Line 242: OrdersChanged TransactionId: 66671954 Balance: 7164 Volume: 7884 State: Active Line 243: OrdersChanged TransactionId: 66671954 Balance: 7064 Volume: 7884 State: Active Line 244: OrdersChanged TransactionId: 66671954 Balance: 6994 Volume: 7884 State: Active Line 245: OrdersChanged TransactionId: 66671954 Balance: 6994 Volume: 7884 State: Active Line 246: OrdersChanged TransactionId: 66671954 Balance: 6994 Volume: 7884 State: Active Line 247: OrdersChanged TransactionId: 66671954 Balance: 6864 Volume: 7884 State: Active Line 248: OrdersChanged TransactionId: 66671954 Balance: 6764 Volume: 7884 State: Active Line 249: OrdersChanged TransactionId: 66671954 Balance: 6714 Volume: 7884 State: Active Line 250: OrdersChanged TransactionId: 66671954 Balance: 6714 Volume: 7884 State: Active Line 251: OrdersChanged TransactionId: 66671954 Balance: 6584 Volume: 7884 State: Active Line 252: OrdersChanged TransactionId: 66671954 Balance: 6484 Volume: 7884 State: Active Line 253: OrdersChanged TransactionId: 66671954 Balance: 6474 Volume: 7884 State: Active Line 254: OrdersChanged TransactionId: 66671954 Balance: 6474 Volume: 7884 State: Active Line 255: OrdersChanged TransactionId: 66671954 Balance: 6304 Volume: 7884 State: Active Line 256: OrdersChanged TransactionId: 66671954 Balance: 6304 Volume: 7884 State: Active Line 257: OrdersChanged TransactionId: 66671954 Balance: 6256 Volume: 7884 State: Active Line 258: OrdersChanged TransactionId: 66671954 Balance: 6256 Volume: 7884 State: Active Line 259: OrdersChanged TransactionId: 66671954 Balance: 6239 Volume: 7884 State: Active Line 260: OrdersChanged TransactionId: 66671954 Balance: 6239 Volume: 7884 State: Active Line 261: OrdersChanged TransactionId: 66671954 Balance: 6139 Volume: 7884 State: Active Line 262: OrdersChanged TransactionId: 66671954 Balance: 6089 Volume: 7884 State: Active Line 263: OrdersChanged TransactionId: 66671954 Balance: 6039 Volume: 7884 State: Active Line 264: OrdersChanged TransactionId: 66671954 Balance: 6039 Volume: 7884 State: Active Line 265: OrdersChanged TransactionId: 66671954 Balance: 5735 Volume: 7884 State: Active Line 266: OrdersChanged TransactionId: 66671954 Balance: 5735 Volume: 7884 State: Active Line 267: OrdersChanged TransactionId: 66671954 Balance: 5175 Volume: 7884 State: Active Line 268: OrdersChanged TransactionId: 66671954 Balance: 5175 Volume: 7884 State: Active Line 269: OrdersChanged TransactionId: 66671954 Balance: 5045 Volume: 7884 State: Active Line 270: OrdersChanged TransactionId: 66671954 Balance: 4435 Volume: 7884 State: Active Line 271: OrdersChanged TransactionId: 66671954 Balance: 4312 Volume: 7884 State: Active Line 272: OrdersChanged TransactionId: 66671954 Balance: 4312 Volume: 7884 State: Active Line 273: OrdersChanged TransactionId: 66671954 Balance: 4312 Volume: 7884 State: Done Line 275: OrdersChanged TransactionId: 66671954 Balance: 4159 Volume: 7884 State: Done Line 276: OrdersChanged TransactionId: 66671954 Balance: 4041 Volume: 7884 State: Done

Thanks:

Maxim

Avatar
Date: 4/25/2011
Reply


1)Михаил, а в каком свойстве класса Order находится информация из столбца «Состояние» Квика?

2)Заметил следующее. При отмене заявки в Квике заполняется столбик «Снята(время)». Но на момент, когда состояние заявки становится Order.State == Done, свойство Order.CancelTime остается неопределенным. Это происходит не всегда. Из 16 отмененных заявок в 4 заявках свойство Order.CancelTime все же определилось. Из этого могу предположить, что все таки после того, как Order.State стал Done, заявки изменяются.

  1. Так же заметил, что в некоторых заявках после того, как Order.State стал Done, свойство Order.Time равно «0001-01-01 00:00:00.0000000». Что аналогично второму пункту свидетельствует о том, что заявка изменяется после того, как получила Order.State == Done.
Thanks:

Mikhail Sukhov

Avatar
Date: 4/26/2011
Reply


Maxim: 1)Михаил, а в каком свойстве класса Order находится информация из столбца «Состояние» Квика?

Order.State

Maxim: 2)Заметил следующее. При отмене заявки в Квике заполняется столбик «Снята(время)». Но на момент, когда состояние заявки становится Order.State == Done, свойство Order.CancelTime остается неопределенным. Это происходит не всегда. Из 16 отмененных заявок в 4 заявках свойство Order.CancelTime все же определилось. Из этого могу предположить, что все таки после того, как Order.State стал Done, заявки изменяются.

  1. Так же заметил, что в некоторых заявках после того, как Order.State стал Done, свойство Order.Time равно «0001-01-01 00:00:00.0000000». Что аналогично второму пункту свидетельствует о том, что заявка изменяется после того, как получила Order.State == Done.

Нужны логи из ДДЕ.

Thanks:

Maxim

Avatar
Date: 4/26/2011
Reply


Mikhail Sukhov: Order.State

Но зная Order.State нельзя определить, была ли отменена заявка, правильно? Получается, что единственный признак того, что заявка была отменена, это наличие Order.CancelTime? Или я ошибаюсь?

Thanks:

Maxim

Avatar
Date: 4/26/2011
Reply


Mikhail Sukhov: Нужны логи из ДДЕ.

  1. Неверное время Order.Time «0001-01-01 00:00:00.0000000»

В файле можно найти данные из OrdersChanged и PreProcessDdeData: эксель

Данные из NewOrders


InitDate	2011-04-26 12:20:32.0277086
Date	0001-01-01 00:00:00.0000000
CancelDate	NULL
Price	102.22
Volume	39
Balance	39
Id	259271
TransactionId	44300176
Direction	B
StockName	SBER03
State	Active
Status	Accepted
ExecutionCondition	CancelBalance
Type	Limit

InitDate	2011-04-26 12:20:32.9495954
Date	0001-01-01 00:00:00.0000000
CancelDate	NULL
Price	102.22
Volume	39
Balance	39
Id	259356
TransactionId	44300177
Direction	B
StockName	SBER03
State	Active
Status	Accepted
ExecutionCondition	CancelBalance
Type	Limit

В этих данных можно посмотреть на заявки 44300176 и 44300177. После того, как Order.State поменялся на Done, в заявке 44300176 свойство Order.Time было «2011-04-26 12:20:31.0000000». Тогда как, в заявке 44300177 свойство Order.Time было «0001-01-01 00:00:00.0000000».

Просмотрев DDE данные, заметил, что в первом случае данные PreProcessDdeData приходят перед тем, как появится событие OrdersChanged. Во втором случае перед первым OrdersChanged данные из PreProcessDdeData не приходят.

  1. Время Order.CancelTime отсутствует, а должно быть.

В файле можно найти данные из OrdersChanged и PreProcessDdeData: эксель

Данные из NewOrders:


InitDate	2011-04-26 12:21:34.1535038
Date	0001-01-01 00:00:00.0000000
CancelDate	NULL
Price	102.13
Volume	39
Balance	39
Id	260883
TransactionId	44300189
Direction	S
StockName	SBER03
State	Active
Status	Accepted
ExecutionCondition	CancelBalance
Type	Limit


InitDate	2011-04-26 12:21:38.5910606
Date	0001-01-01 00:00:00.0000000
CancelDate	NULL
Price	102.18
Volume	1
Balance	1
Id	260975
TransactionId	44300190
Direction	S
StockName	SBER03
State	Active
Status	Accepted
ExecutionCondition	PutInQueue
Type	Limit

В этих данных можно посмотреть на заявки 44300189 и 44300190. После того, как Order.State поменялся на Done, в заявке 44300189 свойство Order.CancelTime было «2011-04-26 12:21:34.0000000». Тогда как, в заявке 44300190 свойство Order.CancelTime было пустым.

В данных DDE можно увидеть, что событие первое событие OrdersChanged , когда Order.State поменялся на Done, происходит самопроизвольно, без поступления данных из DDE. Это мое предположение, могу и ошибаться.

Thanks:

Serg

Avatar
Date: 4/26/2011
Reply


Maxim, вы могли бы выложить свой проект для детального разбора?

Thanks:

Maxim

Avatar
Date: 4/26/2011
Reply


Не совсем понял, что подразумевается под «свой проект»? Что конкретно не хватает для повторения ошибки? Вопрос касается снятия и выставления заявок. Ничего необычного в моей программе не используется. Выше в этом посту я уже приводил пример куска кода. Правда в этот раз я его не использовал для получения ошибок, но уверен, что этот код даст такие же результаты.

Кстати, насчет первого вопроса есть отдельный пост. http://stocksharp.com/forum/878/Order-Time-vozvrashchaiet-00-00-00-0001-ghoda/

Thanks:

Maxim

Avatar
Date: 4/26/2011
Reply


Serg: Maxim, вы могли бы выложить свой проект для детального разбора?

Немного исправил код, который упоминал выше. При помощи этого кода на тестовом Квике получилось добиться двух ошибок описанных выше:


  Object quikPreProcessDdeDataLock = new Object();

            _quik.PreProcessDdeData += (String str, IList<IList<Object>> array) =>
            {
                lock (quikPreProcessDdeDataLock)
                {
                    if (str.Contains("все сделки") == false && str.Contains("[стакан]") == false && str.Contains("портфель по бумагам") == false && str.Contains("позиции по бумагам") == false)
                    {
                        Debug.WriteLine("PreProcessDdeData  DateNow:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fffffff") + " String: " + str);

                        for (int i = 0; i < array.Count; i++)
                        {
                            Debug.WriteLine("PreProcessDdeData  DateNow:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fffffff") + " Row: " + i.ToString());
                            for (int k = 0; k < array[i].Count; k++)
                            {
                                Debug.WriteLine("PreProcessDdeData  DateNow:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fffffff") + "           " + "Column: " + k.ToString() + " Object: " + array[i][k].ToString());
                            }
                        }
                    }
                }
            };



            _quik.NewOrders += orders =>
            {
                foreach (var _order in orders)
                {
                    String _query =
                              @"NewOrders 
                                DateNow: {0},      
                                InitDate: {1}, 
                                Date: {2}, 
                                CancelDate: {3}, 
                                Price: {4}, 
                                Volume: {5}, 
                                Balance: {6}, 
                                Id: {7}, 
                                TransactionId: {8}, 
                                Direction: {9}, 
                                StockName: {10},
                                State: {11},
                                Status: {12},
                                ExecutionCondition: {13},
                                Type: {14}";

                    _query = String.Format(
                        _query,
                        DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fffffff"),
                        _order.InitializationTime.ToString("yyyy-MM-dd HH:mm:ss.fffffff"),
                        (_order.Time != null ? "'" + _order.Time.ToString("yyyy-MM-dd HH:mm:ss.fffffff") + "'" : "NULL"),
                        (_order.CancelTime.HasValue ? "'" + _order.CancelTime.Value.ToString("yyyy-MM-dd HH:mm:ss.fffffff") + "'" : "NULL"),
                        _order.Price.ToString(),
                        _order.Volume.ToString(),
                        _order.Balance.ToString(),
                        _order.Id.ToString(),
                        _order.TransactionId.ToString(),
                        (_order.Direction == OrderDirections.Buy ? "B" : "S"),
                        _order.Security.Code,
                        _order.State.ToString(),
                        _order.Status.ToString(),
                        _order.ExecutionCondition.ToString(),
                        _order.Type.ToString());

                    Debug.WriteLine(_query);                    

                    _quik.CancelOrder(_order);
                }
            };

            _quik.OrdersChanged += orders =>
            {
                foreach (var order in orders)
                    Debug.WriteLine(
                        "OrdersChanged DateNow:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fffffff") + 
                        " TransactionId: " + order.TransactionId + 
                        " Balance: " + order.Balance + 
                        " Volume: " + order.Volume + 
                        " State: " + order.State +
                        " CancelTime: " + order.CancelTime.ToString() + 
                        " Status: " + order.Status +
                        " Time: " + order.Time.ToString("yyyy-MM-dd HH:mm:ss.fffffff"));
            };

            Security paperSecurity = null;

            foreach (Security sec in _quik.Securities)
                if (sec.Code == "SBER03")
                    paperSecurity = sec;            
           
            Debug.WriteLine("Start ");

            Order _newOrder = new Order();
            _newOrder.Portfolio = Global.Portfolio;
            _newOrder.Direction = OrderDirections.Buy;
            _newOrder.Security = paperSecurity;
            _newOrder.ExecutionCondition = OrderExecutionConditions.PutInQueue;
            _newOrder.Comment = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fffffff");
            _newOrder.Volume = 150;
            _newOrder.Price = paperSecurity.BestBid.Price;

            _quik.RegisterOrder(_newOrder);

            Debug.WriteLine("OrderId:" + _newOrder.TransactionId.ToString());                         

            Debug.WriteLine("Finish ");


Thanks:

Mikhail Sukhov

Avatar
Date: 4/26/2011
Reply


У меня файлы не скачиваются.

Thanks:

Maxim

Avatar
Date: 4/26/2011
Reply


Mikhail Sukhov: У меня файлы не скачиваются.

Можно скачать по номерам: 5286502 и 5286555 http://www.webfile.ru/

Thanks:
< 1 2 3 4 5  >

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

loading
clippy