На нашем
сайте мы решили разместить статистику Раунд-трипа разных протоколов и инструментов:
FIX_CURR USD
Plaza2 Si и TWIME Si
TWIME: GAZ, LUK, VTB...
Plaza2 RTS
SPB_BINARY
http://fkviking.ru/roundtrip.php
Графики можно увидеть на сайте и поиграть с ними.
да и для подобных граффиков лучше строить распределение.
Если человек торгует только тейкером, то у него раундтрип есть только тех заявок, которые были «вкусные» т.е. тех которые хотело бОльшее кол-во участников рынка а это уже значит что возрастает нагрузка на шлюз и далее увеличенный раундтрип.
И дальше если разбирать, то можно вот еще что нарыть: участников на разных инструментах разное кол-во, кол-во выпущенных заявок на «вкусные» цены, следовательно тоже разное. Очевидно, на Si-шке в разы больше трейдят, чем на остальных и следовательно в пиковые моменты, когда цена «вкусная», скажем на лукойле, в шлюз посылается транзакций гораздо меньше, чем в такие же моменты для Si-шки. А учитывая ограниченные возможности наших шлюзов и раундтрип возрастает в одни моменты сильнее чем в другие.
Я думаю, что если делать чистые тесты, например просто кидать заявку в пустоту каждые n-секунд по разным инструментам, то в этом случае раундтрип у них будет одинаковый. А вот если снимать метки по живым стратегиям, то разница будет неизбежна и чем слабее пропускная способность шлюза, тем сильнее будет разница.
И sockperf умеем гонять
Так будьте технически грамотными людьми, разрисуйте подробней ваш test harness, покажите где вы ставите метки и как по этим меткам вы вычисляете latency.
Вы публикуете результат своего исследования на достаточно широкую публику, при этом вы коммерческая организация, а не исследовательская, но после первого прочтения складывается впечатления, ну очередной «брат финансист» измеряет, что-то на проводах, а потом данные волшебным образом попадают в компьютер.
SiXX_test HWAdds 0 < 407; 2 < 407; 4 < 407; 8 < 21; 10 < 0; 12 < 0; 16 < 0; 32 < 0; 48 < 0; 64 < 0; avg = 6582nsec
Для каждого типа измерения должна быть своя метрика. И четкое понимание, что вы измеряете, в данном контексте между чем и чем осуществляется замер.
Допустим, если вы, что покрутил с драйверами карточек 10G и настройками операционки, поставьте простой тест.
Эмуляция market data ( 1/2 UDP round trip ) отправляете с одного сервера UPD пакет 64 байта с меткой, в обратку эмулируете execution feed (1/2 TCP round trip)
отправляете TCP пакет 400 байт с меткой. Прогнали объем данных, сохранили логи, потом скриптом прошлись посчитали стату, показали совой min, max, average.
Вот ваши абсолютные значения и понятно, что и как вы измеряете.
Если речь про вашу библиотеку и вы делаете замеры трактов обработки данных, то тоже самое, сперва опишите, что вы измеряете и самое главное как.
Не хочу комментировать измерения на примере вашей стратегии, это как то application specific очень. На мой взгляд banchmark должен быть по generic стадиям обработки. Допустим ваша замечательная библиотека декодирует поток заявок, фильтрует, нормализует данные и строит стакан, далее вы предоставляете ваше API для дальнейшей работы. Опять разрисуйте test harness, покажите, что вы, допустим, измеряете от выхода MAC на вашей 10G карточки (где и ставится аппаратная метка) до callback'a вашего API. Возьмите один торговый день на moex постройте гистограмму распределения плотности потока UDP пакетов рыночных данных.
Сразу будет понятно, что 99.99% сообщений как раз 64 байта (2 инкрементальных апдейта). Вот и измерьте вашу латентность на 50%, 99%, 99.9% и 99.99% сообщений. Тогда ваши результаты будут понятны и интересны широкому кругу людей.
Ну и не забываем, что по классике computer science latency это величина измеряющая задержку от первого байта на входе системы до первого байта на выходе системы. А от первого на входе до последнего на выходе это уже throughput.
Я бы сказал, отпечатались тяжелым наследием.
А подобные данные по сравнению FAST/PLAZA2 у вас есть? Интересно проигрывает ли фаст плазе по тому же потоку сделок и ордеров.