Не всегда приходит инструмент


Не всегда приходит инструмент
Atom Reply
10/22/2010


eaa

Avatar
Наблюдаю странную ситуацию на тестовом сервере (на рабочем не проверял):
ловлю событие NewSecurities, мне надо отловить бумагу RIZ0. Получаю ее не каждый раз :(
Т.е. коннекчусь, смотрю что приходит, например:

один раз так:
....
AZKM
RU000A0JPB41
GM32500BL0
VB13000BX0
KBSB
RU000A0JPD98
....

другой раз так:
....
AZKM
RU000A0JPB41
GM32500BL0
RIZ0
VB13000BX0
KBSB
RU000A0JPD98
....

Как видно, в первом случае RIZ0 почему-то отсутствует, все остальные бумаги на месте.
Собственно вопрос - куда исчезает бумага?
Причем происходит это вроде бы случайным образом. Или может есть какая-то хитрая настройка или
какая другая причина столь странного поведения?

Tags:


Thanks:




11 Answers
Mikhail Sukhov

Avatar
Date: 10/24/2010
Reply


У меня код:

Code
trader.NewSecurities += securities =>
{
    foreach (var security in securities)
    {
        if (security.Code == "RIZ0")
        {
            _riz0 = security;
            trader.RegisterSecurity(_rim0);
        }
    }
};


и на демо и на реале стабильно находил фьюч. Но я не проверял порядок прихода инструментов. Может быть там не всегда одна и так же сортировка?
Thanks:

eaa

Avatar
Date: 10/24/2010
Reply


у меня то же самое, разве что в цикле печатает все, что приходит.
стабильно работает, работает, а потом так же стабильно эта бумага не появляется. Потом опять начинает появляться...
это и смущает. сначала думал что может оно где-то лочится в коде, но вроде нет - остальное-то приходит стабильно.
Topic starter
Thanks:

eaa

Avatar
Date: 10/26/2010
Reply


Вот еще заметил такую вещь...

Code

trader.NewSecurities += securities =>
{
foreach (var security in securities)
{
if (security.Code == "RIZ0")
{
_riz0 = security;
trader.RegisterSecurity(_rim0);
waitHandle.Set();
}
}
};

waitHandle.WaitOne();


Если ставлю точку останова на waitHandle.WaitOne() и потом продолжаю выполнение - приходят все коды, если убираю - некоторые теряются, в т.ч. тот, который мне нужен, хотя не только он...
Пробовал перед ним ставить sleep() - толку нет.

Может есть мысль, как победить?
Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 10/26/2010
Reply


eaa
Вот еще заметил такую вещь...

Если ставлю точку останова на waitHandle.WaitOne() и потом продолжаю выполнение - приходят все коды, если убираю - некоторые теряются, в т.ч. тот, который мне нужен, хотя не только он...
Пробовал перед ним ставить sleep() - толку нет.

Может есть мысль, как победить?


Я весь код не вижу, но думаю это то, о чем я писал выше. Инструменты приходят не всегда в одном и том же порядке. А Вы в коде ожидаете, что RIZ придется одним из первых. В качестве проверки сделайте простое приложение, которое выводит в консоль момент прихода RIZ0:

Code
trader.NewSecurities += securities =>
{
foreach (var security in securities)
{
if (security.Code == "RIZ0")
{
Console.WriteLine("Пришло!!!");
}
}
};

Console.ReadLine();


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

eaa

Avatar
Date: 10/27/2010
Reply


Нашел как обойти, но так и не понял причину.

Собственно, когда я ставлю точку останова, то приходит событие NewSecurities, если я ее не ставлю, то приходит SecuritiesChanged, и ловить эту бумагу надо в другом обработчике...
Странно, но факт.

Если кто знает почему так - отпишите плз.
Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 10/28/2010
Reply


eaa

Если кто знает почему так - отпишите плз.


А мой ответ чем не подошел?
Thanks:

eaa

Avatar
Date: 10/28/2010
Reply


Он не объясняет, почему в одном случае приходит NewSecurity, а в другом - SecurityChanged.
Topic starter
Thanks:

Mikhail Sukhov

Avatar
Date: 10/28/2010
Reply


eaa
Он не объясняет, почему в одном случае приходит NewSecurity, а в другом - SecurityChanged.


Я думаю проблема в синхронизации данных. Вы пробовали создать простой приложение с кодом, которое я написал? Всегда ли приходит фьюч на РТС?
Thanks:

Alex2

Avatar
Date: 10/29/2010
Reply


Mikhail Sukhov
eaa
Он не объясняет, почему в одном случае приходит NewSecurity, а в другом - SecurityChanged.


Я думаю проблема в синхронизации данных. Вы пробовали создать простой приложение с кодом, которое я написал? Всегда ли приходит фьюч на РТС?


Подтверждаю, такая же проблема с RIZ0
Пробовал приведенный вами код для NewSecurities не срабатывает:

trader.NewSecurities += securities =>
{
foreach (var security in securities)
{
if (security.Code == "RIZ0")
{
Console.WriteLine(security.Code);
}
}

Бумага не находится.

А вот если поместить этот же код в trader.SecuritiesChanged RIZ0 находится.

ps: если бы не инфа в предыдущих постах о SecuritiesChanged - до сих пор ломал бы голову, почему не приходит RIZ0
Thanks:

Mikhail Sukhov

Avatar
Date: 10/29/2010
Reply


Alex2

Подтверждаю, такая же проблема с RIZ0
Пробовал приведенный вами код для NewSecurities не срабатывает:


Ок, понятно. Проблема в том, что инструмент инициализируется позднее. Из-за того, что сделки (или заявки) по инструменту приходят раньше, чем сама информация по инструменту. Из-за этого в NewSecurities посылается не полностью инициализированный объект Security. Как вариант - смотрите на Security.Id, а не на Code. Он не изменяется в процессе работы.
Thanks:

Alex2

Avatar
Date: 10/30/2010
Reply


Mikhail Sukhov
Alex2

Подтверждаю, такая же проблема с RIZ0
Пробовал приведенный вами код для NewSecurities не срабатывает:


Ок, понятно. Проблема в том, что инструмент инициализируется позднее. Из-за того, что сделки (или заявки) по инструменту приходят раньше, чем сама информация по инструменту. Из-за этого в NewSecurities посылается не полностью инициализированный объект Security. Как вариант - смотрите на Security.Id, а не на Code. Он не изменяется в процессе работы.


Да, это помогло. Спасибо.
Thanks:


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

loading
clippy