Вопрос по времени сделки


Вопрос по времени сделки
Atom
8/21/2012


Замерял задержку между совершением сделки на ФОРТС и приходом сделки в программу. (Время компьютера синхронизировал перед тестом.) Код ниже не работает так, как ожидается.

Code

        protected override void OnStarting()
        {
            base.Security.Exchange.IsSupportAtomicReRegister = false;

            this.SuspendRules(() =>
            {
                base.Security.WhenNewTrades().Do(NewTrade).Apply(this);
            });

            base.OnStarting();
        }

        protected void NewTrade()
        {
            String od = base.Security.LastTrade.OrderDirection.HasValue
                ? base.Security.LastTrade.OrderDirection.Value.ToString()
                : "?";
            TimeSpan lt = DateTime.Now - base.Security.LastTrade.Time;
            this.AddInfoLog("{0} сделка {1} объемом {2} направление {3}. Запаздывание {4} мс.",
                base.Security.LastTrade.Time.ToString() + "." + base.Security.LastTrade.Time.Millisecond.ToString(),
                base.Security.LastTrade.Price,
                base.Security.LastTrade.Volume,
                od,
                lt.TotalMilliseconds);

            // дальше не интересно. :)
        }


Периодически в лог валятся записи, у которых отрицательное время задержки. То есть DateTime.Now - base.Security.LastTrade.Time меньше 0.

Я нашел Грааль, да?! То есть, посмотрел в Квик, там в окне "все сделки" время без миллисекунд, в логе время сделок тоже без миллисекунд. Есть ли правильный способ посчитать задержку от сделки до ее прихода в мою программу?

Tags:


Thanks:


1 2  >
Memory

Avatar
Date: 8/22/2012
Reply


1. Синхронизировали с чем?
2. Насколько большое отрицательное значение задержки?
Thanks:

Oppositus

Avatar
Date: 8/22/2012
Reply


Memory Go to
1. Синхронизировали с чем?

С time.windows.com

Memory Go to
2. Насколько большое отрицательное значение задержки?

-100 ... -300 мс.

Завтра попробую посчитать по-другому, раз уж у трейда точность до секунд. О методе и результатах расскажу.
Thanks:

Alexander

Avatar
Date: 8/22/2012
Reply


Обратный сигнал от time.windows.com тоже не мгновенно идёт...
Thanks:

Oppositus

Avatar
Date: 8/22/2012
Reply


Alexander Mukhanchikov Go to
Обратный сигнал от time.windows.com тоже не мгновенно идёт...


Quote:

http://ru.wikipedia.org/wiki/NTP

Система NTP чрезвычайно устойчива к изменениям латентности среды передачи.

NTP использует алгоритм Марзулло (предложен Кейтом Марзулло (Keith Marzullo) из Университета Калифорнии, Сан-Диего), включая такую особенность, как учёт времени передачи. В версии 4 способен достигать точности 10 мс (1/100 с) при работе через Интернет, и до 0,2 мс (1/5000 с) и лучше внутри локальных сетей.
Thanks:

Memory

Avatar
Date: 8/22/2012
Reply


А как именно вы синхронихировали. Зашли в часы, нажали "обновить сейчас" или "update now" и.... дальше что?
Thanks:

Oppositus

Avatar
Date: 8/22/2012
Reply


Memory Go to
А как именно вы синхронихировали. Зашли в часы, нажали "обновить сейчас" или "update now" и.... дальше что?


И дальше оно в этом диалоге написало "Время было успешно синхронизировано...". Потом я нажал ОК. :) Ну и при первой синхронизации заметил, что часы секунд на 10 изменились (до синхронизации отставали).

Очень странно, что отрицательное время валится в лог. Либо сервер времени не такой уж точный, либо протокол NTP перехвалили, либо сервер Квика округляет дату, либо на бирже время забывают синхронизировать. :) А может DateTime шалит или погода на Марсе испортилась.

Завтра посчитаю только задержки, у которых разница в 1 секунду:

Code

        protected void NewTrade()
        {
            if(DateTime.Now.Second - base.Security.LastTrade.Time.Second == 1
               && (DateTime.Now - base.Security.LastTrade.Time).TotalMilliseconds < 1999)
            {
                double ms = DateTime.Now.Millisecond;
                m_LatencyTotal += ms;
                m_LatencyTrades += 1;
                if(m_LatencyMax < ms)
                {
                    m_LatencyMax = ms;
                }
                if(m_LatencyMin > ms)
                {
                    m_LatencyMin = ms;
                }
            }

            if(base.Security.LastTrade.Time.Second == 0 && m_LatencyTrades > 0)
            {
                this.AddWarningLog("Задержка {0} ... {1} ... {2}", m_LatencyMin, (m_LatencyTotal / m_LatencyTrades), m_LatencyMax);
            }
        }


То есть, сделка прошла (например) в 12:03:45, а мое время 12:03:46. Тогда, если усреднить мои DateTime.Now.Millisecond для таких сделок - получится задержка более-менее похожая на правду.
Thanks:

Memory

Avatar
Date: 8/22/2012
Reply


Ага. Многие не дожидаются и сидя за файрволами добиваются синхронизации времени. :). Что касается точности, в реальной жизни, 10 мс. и ниже в локальной сети - вполне приемлемый результат. Относительно Windows, в Windows, насколько я помню, реализована упрощенная версия - SNTP. Как она снижает характеристики не знаю. На мой взгляд 200-300 мс это все равно много. Теперь относительно эксперимента. Для правильности необходимо не вот такая "одноразовая" синхронизация, а постоянная синхронизация с сервером времени. Да и в этом случае могут быть вопросы т.к. сервер биржи и ваш ПК синхронизируются от разных источников.
Thanks:

Mikhail Sukhov

Avatar
Date: 8/22/2012
Reply


Oppositus Go to

Я нашел Грааль, да?! То есть, посмотрел в Квик, там в окне "все сделки" время без миллисекунд, в логе время сделок тоже без миллисекунд. Есть ли правильный способ посчитать задержку от сделки до ее прихода в мою программу?


Если нет миллисекунд, то точность будет оставлять лучшего. В Квике есть миллисекунды?
Thanks:

Oppositus

Avatar
Date: 8/22/2012
Reply


Mikhail Sukhov Go to
Если нет миллисекунд, то точность будет оставлять лучшего. В Квике есть миллисекунды?


В Квике миллисекунд нет. И значение base.Security.LastTrade.Time.Millisecond всегда 0.
Thanks:

Oppositus

Avatar
Date: 8/22/2012
Reply


Вскрылись бездны ужаса: http://quik.ru/forum/quik/68503/68503/ Как теперь жить?! [bored]
Thanks:
1 2  >

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

loading
clippy