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


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


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

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

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


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

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

Tags:


Thanks:




41 Answers
1 2  >
Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 1/25/2011
Reply


Maxim Перейти

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

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


Можете это выразить небольшим кодом для теста?
Thanks:

Maxim

Avatar
Date: 1/25/2011
Reply


Добавляем две синхронизации:
Код

private ManualResetEventSlim waitDone = new ManualResetEventSlim(false);
private ManualResetEventSlim waitActiveOrFailed = new ManualResetEventSlim(false);


В обработчик события Global.Quik.NewOrders добавляем строку waitActiveOrFailed.Set()
А в обработчик события Global.Quik.OrdersChanged добавляем строку waitDone.Set();

После соединения с квиком и подпиской на событие, запускаем код:
Код

Security paperSecurity = null;

foreach (Security sec in Global.Quik.Securities)
if (sec.Code == "SBER03")
paperSecurity = sec;


for (int i = 0; i < 10; i++)
{
Debug.WriteLine(" ");
Debug.WriteLine("Start " + i.ToString());

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 = 100;
_newOrder.Price = paperSecurity.BestAsk.Price + 5;


waitActiveOrFailed.Reset();
waitDone.Reset();

Global.Quik.RegisterOrder(_newOrder);

waitActiveOrFailed.Wait();

if (_newOrder.State == OrderStates.Active)
{
Global.Quik.CancelOrder(_newOrder);

waitDone.Wait();

Debug.WriteLine((_newOrder.Volume - _newOrder.Balance).ToString());

Thread.Sleep(1000);

Debug.WriteLine((_newOrder.Volume - _newOrder.Balance).ToString());
}

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

Debug.WriteLine("Finish " + i.ToString());

Thread.Sleep(1000);
}




Получаем результат:
Код

Start 0
0
100
TransactionId:57912511
Finish 0

Start 1
0
100
TransactionId:57912513
Finish 1

Start 2
0
100
TransactionId:57912515
Finish 2

Start 3
0
100
TransactionId:57912517
Finish 3

Start 4
0
100
TransactionId:57912519
Finish 4

Start 5
0
100
TransactionId:57912521
Finish 5

Start 6
0
100
TransactionId:57912523
Finish 6

Start 7
0
100
TransactionId:57912525
Finish 7

Start 8
0
100
TransactionId:57912527
Finish 8

Start 9
0
100
TransactionId:57912529
Finish 9


Topic starter
Thanks:

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 1/27/2011
Reply


Maxim Перейти
Добавляем две синхронизации:
Код

private ManualResetEventSlim waitDone = new ManualResetEventSlim(false);
private ManualResetEventSlim waitActiveOrFailed = new ManualResetEventSlim(false);



Самое главное упустили - код в OrdersChanged. Прогнал простой тест (советую и Вам так сделать, всего одну строчку вывести):

Код
qt.OrdersChanged += orders =>
{
    foreach (var order in orders)
    {
        Debug.WriteLine("Id {0} State {1} Balance {2}".Put(order.Id, order.State, order.Balance));
    }
};


QuikTrader.IsAsyncMode = true.

Везде, где вывод c Done баланс был равен 0 (заявки глубоко в рынок кидал).
Thanks:

Maxim

Avatar
Date: 1/27/2011
Reply


Первоначально в обработчике OrdersChanged просто был один метод: waitDone.Set()

Я это и имел ввиду, кода писал:
Цитата:

В обработчик события Global.Quik.NewOrders добавляем строку waitActiveOrFailed.Set()
А в обработчик события Global.Quik.OrdersChanged добавляем строку waitDone.Set();



Теперь обработчик выгладит так:
Код

waitDone.Set();
Debug.WriteLine("OrdersChanged begin");
foreach (var order in orders)
{
Debug.WriteLine("Id {0} State {1} Balance {2}".Put(order.Id, order.State, order.Balance));
}
Debug.WriteLine("OrdersChanged end");



Обновленный результат вывода привожу ниже.
Состояние «State Done» и «Balance 100» в выводе есть.
Что говорит о том, что что-то не так.

Забыл упомянуть, этот сценарий наблюдается на тестовом Квике. Если это имеет значение.
На реальном пока не тестировал.



Код

Start 0
OrdersChanged begin
0
Id 1076401848 State Done Balance 100
OrdersChanged end
OrdersChanged begin
Id 1076401848 State Done Balance 0
OrdersChanged end
OrdersChanged begin
Id 1076401848 State Done Balance 0
OrdersChanged end
OrdersChanged begin
Id 1076401848 State Done Balance 0
OrdersChanged end
100
OrderId:1076401848
Finish 0

Start 1
OrdersChanged begin
Id 1076401877 State Done Balance 100
OrdersChanged end
0
0
OrderId:1076401877
Finish 1
OrdersChanged begin
Id 1076401877 State Done Balance 0
OrdersChanged end
OrdersChanged begin
Id 1076401877 State Done Balance 0
OrdersChanged end

Start 2
OrdersChanged begin
Id 1076401900 State Done Balance 100
OrdersChanged end
0
OrdersChanged begin
Id 1076401900 State Done Balance 0
OrdersChanged end
OrdersChanged begin
Id 1076401900 State Done Balance 0
OrdersChanged end
OrdersChanged begin
Id 1076401900 State Done Balance 0
OrdersChanged end
100
OrderId:1076401900
Finish 2

Start 3
OrdersChanged begin
0
Id 1076401920 State Done Balance 100
OrdersChanged end
OrdersChanged begin
Id 1076401920 State Done Balance 78
OrdersChanged end
OrdersChanged begin
Id 1076401920 State Done Balance 28
OrdersChanged end
OrdersChanged begin
Id 1076401920 State Done Balance 0
OrdersChanged end
OrdersChanged begin
Id 1076401920 State Done Balance 0
OrdersChanged end
OrdersChanged begin
Id 1076401920 State Done Balance 0
OrdersChanged end
100
OrderId:1076401920
Finish 3

Start 4
OrdersChanged begin
Id 1076401942 State Done Balance 100
OrdersChanged end
0
OrdersChanged begin
Id 1076401942 State Done Balance 88
OrdersChanged end
OrdersChanged begin
Id 1076401942 State Done Balance 34
OrdersChanged end
OrdersChanged begin
Id 1076401942 State Done Balance 1
OrdersChanged end
OrdersChanged begin
Id 1076401942 State Done Balance 0
OrdersChanged end
OrdersChanged begin
Id 1076401942 State Done Balance 0
OrdersChanged end
OrdersChanged begin
Id 1076401942 State Done Balance 0
OrdersChanged end
100
OrderId:1076401942
Finish 4

Start 5
OrdersChanged begin
Id 1076401958 State Done Balance 100
OrdersChanged end
0
OrdersChanged begin
Id 1076401958 State Done Balance 0
OrdersChanged end
OrdersChanged begin
Id 1076401958 State Done Balance 0
OrdersChanged end
OrdersChanged begin
Id 1076401958 State Done Balance 0
OrdersChanged end
100
OrderId:1076401958
Finish 5

Start 6
OrdersChanged begin
Id 1076402004 State Done Balance 100
OrdersChanged end
0
OrdersChanged begin
Id 1076402004 State Done Balance 0
OrdersChanged end
OrdersChanged begin
Id 1076402004 State Done Balance 0
OrdersChanged end
OrdersChanged begin
Id 1076402004 State Done Balance 0
OrdersChanged end
100
OrderId:1076402004
Finish 6

Start 7
OrdersChanged begin
Id 1076402026 State Done Balance 100
OrdersChanged end
0
OrdersChanged begin
Id 1076402026 State Done Balance 0
OrdersChanged end
OrdersChanged begin
Id 1076402026 State Done Balance 0
OrdersChanged end
OrdersChanged begin
Id 1076402026 State Done Balance 0
OrdersChanged end
100
OrderId:1076402026
Finish 7

Start 8
OrdersChanged begin
Id 1076402094 State Done Balance 100
0
OrdersChanged end
OrdersChanged begin
Id 1076402094 State Done Balance 0
OrdersChanged end
OrdersChanged begin
Id 1076402094 State Done Balance 0
OrdersChanged end
100
OrderId:1076402094
Finish 8

Start 9
OrdersChanged begin
Id 1076402236 State Done Balance 100
OrdersChanged end
0
OrdersChanged begin
Id 1076402236 State Done Balance 0
OrdersChanged end
OrdersChanged begin
Id 1076402236 State Done Balance 0
OrdersChanged end
OrdersChanged begin
Id 1076402236 State Done Balance 0
OrdersChanged end
100
OrderId:1076402236
Finish 9
Topic starter
Thanks:

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 1/27/2011
Reply


Maxim Перейти
Первоначально в обработчике OrdersChanged просто был один метод: waitDone.Set()


А если убрать все блокировки и просто выводить в лог? Код слишком сложным получился с теми, так с ходу не разобраться, где ошибка.
Thanks:

Maxim

Avatar
Date: 1/27/2011
Reply


А как без использования блокировщика отменять заявку?

Если не дождаться когда заявка станет Active — отменять ее нельзя.
Как без блокировщика понять, что заявка перешла в статус Active и ее можно отменить?


Немного подумал и попробовал сделать все без блокировщиков.
В результатах все так же есть вариант с «State Done Balance 100».

Вариант тестового кода
Код

Global.Quik.NewOrders += orders =>
{
    foreach (var order in orders)
        Global.Quik.CancelOrder(order);
};

Global.Quik.OrdersChanged += orders =>
{
    foreach (var order in orders)
        Debug.WriteLine("Id {0} State {1} Balance {2}".Put(order.TransactionId, order.State, order.Balance));
};

Security paperSecurity = null;

foreach (Security sec in Global.Quik.Securities)
    if (sec.Code == "SBER03")
        paperSecurity = sec;


for (int i = 0; i < 10; i++)
{
    Debug.WriteLine(" ");
    Debug.WriteLine("Start " + i.ToString());

    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 = 100;
    _newOrder.Price = paperSecurity.BestAsk.Price + 5;    
    
    Global.Quik.RegisterOrder(_newOrder);
    
    Debug.WriteLine("OrderId:" + _newOrder.TransactionId.ToString());

    Debug.WriteLine("Finish " + i.ToString());

    Thread.Sleep(1000);
}



Результат:
Код

Start 0
OrderId:62050658
Finish 0
Id 62050658 State Done Balance 100
Id 62050658 State Done Balance 50
Id 62050658 State Done Balance 0
Id 62050658 State Done Balance 0
Id 62050658 State Done Balance 0

Start 1
OrderId:62050660
Finish 1
Id 62050660 State Done Balance 100
Id 62050660 State Done Balance 0
Id 62050660 State Done Balance 0
Id 62050660 State Done Balance 0

Start 2
OrderId:62050662
Finish 2
Id 62050662 State Done Balance 100
Id 62050662 State Done Balance 0
Id 62050662 State Done Balance 0
Id 62050662 State Done Balance 0

Start 3
OrderId:62050664
Finish 3
Id 62050664 State Done Balance 100
Id 62050664 State Done Balance 0
Id 62050664 State Done Balance 0
Id 62050664 State Done Balance 0

Start 4
OrderId:62050666
Finish 4
Id 62050666 State Done Balance 100

Start 5
OrderId:62050668
Finish 5
Id 62050668 State Done Balance 100
Id 62050666 State Done Balance 0
Id 62050668 State Done Balance 0
Id 62050666 State Done Balance 0
Id 62050668 State Done Balance 0
Id 62050666 State Done Balance 0
Id 62050668 State Done Balance 0

Start 6
OrderId:62050670
Finish 6
Id 62050670 State Done Balance 100
Id 62050670 State Done Balance 0
Id 62050670 State Done Balance 0
Id 62050670 State Done Balance 0

Start 7
OrderId:62050672
Finish 7
Id 62050672 State Done Balance 100
Id 62050672 State Done Balance 0
Id 62050672 State Done Balance 0

Start 8
OrderId:62050674
Finish 8
Id 62050674 State Done Balance 100
Id 62050674 State Done Balance 0
Id 62050674 State Done Balance 0
Id 62050674 State Done Balance 0

Start 9
OrderId:62050676
Finish 9
Id 62050676 State Done Balance 100
Id 62050676 State Done Balance 0
Id 62050676 State Done Balance 0
Id 62050676 State Done Balance 0

Topic starter
Thanks:

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 1/28/2011
Reply


Maxim Перейти
Немного подумал и попробовал сделать все без блокировщиков.
В результатах все так же есть вариант с «State Done Balance 100».


Тоже поймал такую ситуацию. С воспроизведением проблема. В начале стабильно приходил Done с балансом 100. Теперь стабильно Done с балансом 0. Видимо еще ситуация со стаканом значение имеет.
Thanks:

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 1/28/2011
Reply


Mikhail Sukhov Перейти
Maxim Перейти
Немного подумал и попробовал сделать все без блокировщиков.
В результатах все так же есть вариант с «State Done Balance 100».


Тоже поймал такую ситуацию. С воспроизведением проблема. В начале стабильно приходил Done с балансом 100. Теперь стабильно Done с балансом 0. Видимо еще ситуация со стаканом значение имеет.


Ошибку добавил в список багов так как она подтвердилась. Пока не буду ее искать, так как сейчас занимаюсь релизом 3.0. Выпущу на след. неделе. После этого начну анализировать код. + к вам просьба небольшая. Так сказать отвергнуть предположения о неправильных данных в ДДЕ. Можете подписаться на событие PreProcessDdeData, и посмотреть, идет ли там совместно ненулевой баланс вместе с состоянием matched. Если в этом виноват сам Квик, то это будет уже сложнее поправить.
Thanks:

Maxim

Avatar
Date: 1/28/2011
Reply


Состояние matched не обнаружил.
Везде где наблюдался случай «State Done Balance 100» была ситуация, которая описана ниже.

Сначала было событие OrdersChanged с «Balance 100».
После этого событие PreProcessDdeData с «FILLED».
После этого событие OrdersChanged с«Balance 0».

Код

Id 58247606 State Done Balance 100

String: заявки
Row: 0
         Column: 0 Object: 1077843467
         Column: 1 Object: SBER03
         Column: 2 Object: QJSIM
         Column: 3 Object: 112.41
         Column: 4 Object: 100
         Column: 5 Object: 0
         Column: 6 Object: B
         Column: 7 Object: FILLED
         Column: 8 Object: 16:19:27
         Column: 9 Object:
         Column: 10 Object: NL0011100043
         Column: 11 Object: LSQ
         Column: 12 Object: qtest061/S#
         Column: 13 Object: 58247606
         Column: 14 Object: 28.01.2011
         Column: 15 Object: 3747

Id 58247606 State Done Balance 0



Этого достаточно или надо еще что либо проверить?
Topic starter
Thanks:

Maxim

Avatar
Date: 2/8/2011
Reply


Михаил, добрый день.

Рассматривали ли Вы более подробно данную проблему?
Есть ли какой либо прогресс?

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

Без решения этой ошибки я не могу продолжить работать и использовать робота.

Как временно обойти данную ситуацию придумать не могу.
Как понять, что заявка уже отработана и по ней не будет никаких изменений?

Надеюсь на понимание.
Спасибо.
Topic starter
Thanks:

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 2/10/2011
Reply


Maxim Перейти
Михаил, добрый день.

Рассматривали ли Вы более подробно данную проблему?
Есть ли какой либо прогресс?


Да, я нашел закономерность. Выложу 3.0.1 в конце недели.
Thanks:

Maxim

Avatar
Date: 4/19/2011
Reply


Михаил, вечер добрый.

К сожалению сообщаю, что данная ошибка не устранена окончательно.
В процессе торгов появляются случаи, когда заявка имеет статус Done,
но значение разницы Volume - Balance больше нуля, но меньше,
чем реальный объем сделок прошедших в Квике по этой заявке.

С данной ситуацией я уже столкнулся в третий раз.

К сожалению не удается произвести данную ошибку на тестовом Квике.
Возможно связано с тем, что поведение тестового Квика и реального отличаются.


Прошу Вас обратить внимание на данную ошибку и еще раз проанализировать Ваш код.
Немного удручает, что программа продает или покупает не то количество бумаг, которое необходимо.
Со своей стороны постараюсь добиться повторяемости ошибки в тестовом Квике.
Topic starter
Thanks:

alexhat

Avatar
Date: 4/20/2011
Reply


Добрый день, Михаил.
Я обнаружил при работе (в боевом режиме с боевым квиком) аналогичную проблему. Зарегистрировался и нашел этот топик.

Ситуация такая (используется версия библиотеки 2.6.2 и асинхронный режим):
1. Зарегистрирован ордер на продажу (SBER-RTSST)
2. приходит сообщение об изменении ордера с новым статусом OrderStates.Done, при этом Balance = Volume
3. Спустя некоторый промежуток времени приходит сообщение о новой сделке по этому ордеру
4. Еще через некоторое время - сообщение об изменении ордера, где уже Balance = 0

В реальности алгоритмом выставляются подряд 2 ордера (по 2 разным инстументам) и при этом по второму ордеру этой "ошибки" нет - уже на втором шаге Balance = 0, но при этом после выставления заявки не приходит начальное сообщение NewOrders (сразу OrdersChanged - хотя здесь я не до конца уверен, м.б. это какая-то ошибка в моем коде).

Проблема очень критична, поскольку между пунктами 2 и 3 алгоритм успевает учесть этот ордер, т.к. уже не ждет по нему сделок.
Нужен какой-то work-around.


С уважением, Алексей.
Thanks:

Maxim

Avatar
Date: 4/20/2011
Reply


alexhat Перейти
используется версия библиотеки 2.6.2


В 3.0.1 частично эта проблема была решена.
Рекомендую обновить библиотеку, хоть проблема и не решена окончательно.
Topic starter
Thanks:

alexhat

Avatar
Date: 4/20/2011
Reply


Боюсь обновлятся, т.к. объем работы для перетестирования всего очень большой. Если других шансов нет, то конечно придется.

Но, как вы пишите, проблема в не была окончательно решена, поэтому я решил узнать, есть ли возможности обхода.
К.м.к, если есть возможность как-то получить точную информацию о том есть ли по ордеру в статусе Done еще не пришедшие сделки (или, например, окончательное общее число сделок на бирже) - то я смогу скорректировать приходящий статус ордера в своем алгоритме, анализируя количество еще непришедших сделок.
Thanks:

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 4/21/2011
Reply


Давайте проинспектируем проблему:

1. QuikTrader.IsAyncMode?
2. Такие заявки снимаются, перерегистрируются или только регистрируются?
3. Логи NewOrders OrdersChanged PreProcessDdeData.
Thanks:

alexhat

Avatar
Date: 4/21/2011
Reply


Добрый день, Михаил.

1. QuikTrader.IsAyncMode = true
2. Только регистрируются
3. Я обновился с 2.6.2 до 3.0.19 и сейчас ошибка не возникает (тут правда есть момент, что ошибка происходила пока я был в отпуске на весьма слабой машине у меня дома (т.е. в виндовой виртуальной машине, под VirtualBox), сейчас я на работе и здесь на родном виндовом сервере с производительностью проблем нет).
Если я снова увижу эту проблему на своем сервере, какой код вставить в обработчики сообщений NewOrders OrdersChanged PreProcessDdeData для логирования?
Thanks:

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 4/21/2011
Reply


alexhat Перейти
Если я снова увижу эту проблему на своем сервере, какой код вставить в обработчики сообщений NewOrders OrdersChanged PreProcessDdeData для логирования?


Чтобы можно было потом логи понять.
Thanks:

alexhat

Avatar
Date: 4/21/2011
Reply


Mikhail Sukhov Перейти
alexhat Перейти
Если я снова увижу эту проблему на своем сервере, какой код вставить в обработчики сообщений NewOrders OrdersChanged PreProcessDdeData для логирования?


Чтобы можно было потом логи понять.


Я новичек в этой теме (stock#), прошу простить. поскольку я не знаю что именно в этих логах нужно выводить, можно дать конкретный пример кода?
Thanks:

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 4/21/2011
Reply


alexhat Перейти
Я новичек в этой теме (stock#), прошу простить. поскольку я не знаю что именно в этих логах нужно выводить, можно дать конкретный пример кода?


Номер заявки, транзакции, объем, баланс, состояние... Может еще что-то попутно понадобиться, так сложно сказать. Вы начните, там и видно будет.
Thanks:

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
Topic starter
Thanks:

Maxim

Avatar
Date: 4/25/2011
Reply


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

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

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

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 4/25/2011
Reply


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


Order.State

Maxim Перейти

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

3) Так же заметил, что в некоторых заявках после того, как 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?
Или я ошибаюсь?
Topic starter
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 не приходят.



2) Время 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. Это мое предположение, могу и ошибаться.

Topic starter
Thanks:
1 2  >

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

loading
clippy