QUIK-> DDE->робот->API-> (ч.2)

20 февраля, 2012

Автор: Николай Камынин

Как известно, получить информацию из QUIK можно по DDE, ODBC и API.

Проверка показала, что информация о сделках  и заявках быстрее приходит по DDE, чем по API.

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

Первые измерения дали странный результат.

Интервал обновления стакана получился ровно 1 секунда.

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

И действительно, нигде в документации об это ни слова.

После установки в файле инициализации интервала обмена по DDE 10 ms (это минимальный интервал),

я получил очень странные результаты.

Интервал обновления стакана при передаче по DDE во внешнее приложение изменяется в диапазоне от 15 ms до 1 секунды, без видимых на то причин.

Разработчики обещали выслать свои средства тестирования, чтобы разобраться в данном явлении и измерить реальные интервалы  обновления биржевой информации в терминале QUIK.

Продолжение следует…

QUIK-> DDE->робот->API->

19 февраля, 2012

Автор:  Николай Камынин

В данной заметке  приведу результаты исследований скорости получения информации по протоколу DDE из QUIK в разработанную мною СУБД.

Информация из лог-файла:

[1]2=R1C1:R41C44; Name=Trades:    lt=5875; lts=5.87; Sun Feb 19 22:41:32 2012
[1]0=R1C1:R2C33; Name=Orders:    lt=15; lts=5.89; Sun Feb 19 22:41:32 2012
[0]5=R1C1:R2C29; Name=Marginal:    lt=16; lts=5.9; Sun Feb 19 22:41:32 2012
[0]4=R1C1:R2C19; Name=FuturesClientHoldings:    lt=16; lts=5.92; Sun Feb 19 22:41:32 2012
[0]3=R1C1:R2C15; Name=FuturesClientLimits:    lt=15; lts=5.93; Sun Feb 19 22:41:32 2012
[4]1=R1C1:R1C2; Name=EQBR_SBER:    lt=0; lts=5.93; Sun Feb 19 22:41:32 2012
[1]1=R1C1:R1C48; Name=StopOrders:    lt=16; lts=5.95; Sun Feb 19 22:41:32 2012
[0]1=R1C1:R2C11; Name=MoneyLimits:    lt=15; lts=5.96; Sun Feb 19 22:41:32 2012
[3]0=R1C1:R16384C6; Name=AllTrades:    lt=16; lts=5.98; Sun Feb 19 22:41:32 2012
[3]0=R16385C1:R32768C6; Name=AllTrades:    lt=31; lts=6.01; Sun Feb 19 22:41:32 2012
[3]0=R32769C1:R49152C6; Name=AllTrades:    lt=16; lts=6.03; Sun Feb 19 22:41:33 2012
[3]0=R49153C1:R65536C6; Name=AllTrades:    lt=16; lts=6.04; Sun Feb 19 22:41:33 2012
[3]0=R65537C1:R81920C6; Name=AllTrades:    lt=15; lts=6.06; Sun Feb 19 22:41:33 2012
[3]0=R81921C1:R98304C6; Name=AllTrades:    lt=16; lts=6.07; Sun Feb 19 22:41:33 2012
[3]0=R98305C1:R114688C6; Name=AllTrades:    lt=15; lts=6.09; Sun Feb 19 22:41:33 2012
[3]0=R114689C1:R131072C6; Name=AllTrades:    lt=16; lts=6.1; Sun Feb 19 22:41:33 2012
[3]0=R131073C1:R147456C6; Name=AllTrades:    lt=31; lts=6.14; Sun Feb 19 22:41:33 2012
[3]0=R147457C1:R163840C6; Name=AllTrades:    lt=16; lts=6.15; Sun Feb 19 22:41:33 2012
[3]0=R163841C1:R180224C6; Name=AllTrades:    lt=31; lts=6.18; Sun Feb 19 22:41:33 2012
[3]0=R180225C1:R196608C6; Name=AllTrades:    lt=31; lts=6.21; Sun Feb 19 22:41:33 2012
[3]0=R196609C1:R212992C6; Name=AllTrades:    lt=32; lts=6.25; Sun Feb 19 22:41:33 2012
[3]0=R212993C1:R229376C6; Name=AllTrades:    lt=31; lts=6.28; Sun Feb 19 22:41:33 2012
[3]0=R229377C1:R245760C6; Name=AllTrades:    lt=16; lts=6.29; Sun Feb 19 22:41:33 2012
[3]0=R245761C1:R262144C6; Name=AllTrades:    lt=31; lts=6.32; Sun Feb 19 22:41:33 2012
[3]0=R262145C1:R278528C6; Name=AllTrades:    lt=31; lts=6.35; Sun Feb 19 22:41:33 2012
[3]0=R278529C1:R294912C6; Name=AllTrades:    lt=31; lts=6.39; Sun Feb 19 22:41:33 2012
[3]0=R294913C1:R311296C6; Name=AllTrades:    lt=32; lts=6.42; Sun Feb 19 22:41:33 2012
[3]0=R311297C1:R327680C6; Name=AllTrades:    lt=31; lts=6.45; Sun Feb 19 22:41:33 2012
[3]0=R327681C1:R344064C6; Name=AllTrades:    lt=31; lts=6.48; Sun Feb 19 22:41:33 2012
[3]0=R344065C1:R360448C6; Name=AllTrades:    lt=31; lts=6.51; Sun Feb 19 22:41:33 2012
[3]0=R360449C1:R376832C6; Name=AllTrades:    lt=16; lts=6.53; Sun Feb 19 22:41:33 2012
[3]0=R376833C1:R393216C6; Name=AllTrades:    lt=31; lts=6.56; Sun Feb 19 22:41:33 2012
[3]0=R393217C1:R409600C6; Name=AllTrades:    lt=31; lts=6.59; Sun Feb 19 22:41:33 2012
[3]0=R409601C1:R425984C6; Name=AllTrades:    lt=32; lts=6.62; Sun Feb 19 22:41:33 2012
[3]0=R425985C1:R442368C6; Name=AllTrades:    lt=31; lts=6.65; Sun Feb 19 22:41:33 2012
[3]0=R442369C1:R458752C6; Name=AllTrades:    lt=31; lts=6.68; Sun Feb 19 22:41:33 2012
[3]0=R458753C1:R475136C6; Name=AllTrades:    lt=31; lts=6.71; Sun Feb 19 22:41:33 2012
[3]0=R475137C1:R491520C6; Name=AllTrades:    lt=63; lts=6.78; Sun Feb 19 22:41:33 2012
[3]0=R491521C1:R507904C6; Name=AllTrades:    lt=31; lts=6.81; Sun Feb 19 22:41:33 2012
[3]0=R507905C1:R524288C6; Name=AllTrades:    lt=31; lts=6.84; Sun Feb 19 22:41:33 2012
[3]0=R524289C1:R540672C6; Name=AllTrades:    lt=32; lts=6.87; Sun Feb 19 22:41:33 2012
[3]0=R540673C1:R557056C6; Name=AllTrades:    lt=31; lts=6.9; Sun Feb 19 22:41:33 2012
[3]0=R557057C1:R573440C6; Name=AllTrades:    lt=31; lts=6.93; Sun Feb 19 22:41:33 2012
[3]0=R573441C1:R589824C6; Name=AllTrades:    lt=31; lts=6.96; Sun Feb 19 22:41:33 2012
[3]0=R589825C1:R606208C6; Name=AllTrades:    lt=32; lts=7; Sun Feb 19 22:41:33 2012
[3]0=R606209C1:R622592C6; Name=AllTrades:    lt=31; lts=7.03; Sun Feb 19 22:41:34 2012
[3]0=R622593C1:R638976C6; Name=AllTrades:    lt=31; lts=7.06; Sun Feb 19 22:41:34 2012
[3]0=R638977C1:R655360C6; Name=AllTrades:    lt=31; lts=7.09; Sun Feb 19 22:41:34 2012
[3]0=R655361C1:R671744C6; Name=AllTrades:    lt=32; lts=7.12; Sun Feb 19 22:41:34 2012
[3]0=R671745C1:R688128C6; Name=AllTrades:    lt=31; lts=7.15; Sun Feb 19 22:41:34 2012
[3]0=R688129C1:R704512C6; Name=AllTrades:    lt=16; lts=7.17; Sun Feb 19 22:41:34 2012
[3]0=R704513C1:R720896C6; Name=AllTrades:    lt=31; lts=7.2; Sun Feb 19 22:41:34 2012
[3]0=R720897C1:R737280C6; Name=AllTrades:    lt=31; lts=7.23; Sun Feb 19 22:41:34 2012
[3]0=R737281C1:R753664C6; Name=AllTrades:    lt=31; lts=7.26; Sun Feb 19 22:41:34 2012
[3]0=R753665C1:R770048C6; Name=AllTrades:    lt=32; lts=7.29; Sun Feb 19 22:41:34 2012
[3]0=R770049C1:R786432C6; Name=AllTrades:    lt=31; lts=7.32; Sun Feb 19 22:41:34 2012
[3]0=R786433C1:R802816C6; Name=AllTrades:    lt=31; lts=7.35; Sun Feb 19 22:41:34 2012
[3]0=R802817C1:R819200C6; Name=AllTrades:    lt=47; lts=7.4; Sun Feb 19 22:41:34 2012
[3]0=R819201C1:R835584C6; Name=AllTrades:    lt=31; lts=7.43; Sun Feb 19 22:41:34 2012
[3]0=R835585C1:R851968C6; Name=AllTrades:    lt=31; lts=7.46; Sun Feb 19 22:41:34 2012
[3]0=R851969C1:R868352C6; Name=AllTrades:    lt=32; lts=7.5; Sun Feb 19 22:41:34 2012
[3]0=R868353C1:R884736C6; Name=AllTrades:    lt=31; lts=7.53; Sun Feb 19 22:41:34 2012
[3]0=R884737C1:R901120C6; Name=AllTrades:    lt=31; lts=7.56; Sun Feb 19 22:41:34 2012
[3]0=R901121C1:R917504C6; Name=AllTrades:    lt=31; lts=7.59; Sun Feb 19 22:41:34 2012
[3]0=R917505C1:R933888C6; Name=AllTrades:    lt=16; lts=7.6; Sun Feb 19 22:41:34 2012
[3]0=R933889C1:R950272C6; Name=AllTrades:    lt=31; lts=7.64; Sun Feb 19 22:41:34 2012
[3]0=R950273C1:R966656C6; Name=AllTrades:    lt=47; lts=7.68; Sun Feb 19 22:41:34 2012
[3]0=R966657C1:R983040C6; Name=AllTrades:    lt=16; lts=7.7; Sun Feb 19 22:41:34 2012
[3]0=R983041C1:R999424C6; Name=AllTrades:    lt=47; lts=7.75; Sun Feb 19 22:41:34 2012
[3]0=R999425C1:R1015808C6; Name=AllTrades:    lt=31; lts=7.78; Sun Feb 19 22:41:34 2012
[3]0=R1015809C1:R1032192C6; Name=AllTrades:    lt=31; lts=7.81; Sun Feb 19 22:41:34 2012
[3]0=R1032193C1:R1048576C6; Name=AllTrades:    lt=31; lts=7.84; Sun Feb 19 22:41:34 2012
[3]0=R1048577C1:R1064960C6; Name=AllTrades:    lt=32; lts=7.87; Sun Feb 19 22:41:34 2012
[3]0=R1064961C1:R1081344C6; Name=AllTrades:    lt=15; lts=7.89; Sun Feb 19 22:41:34 2012
[3]0=R1081345C1:R1097728C6; Name=AllTrades:    lt=32; lts=7.92; Sun Feb 19 22:41:34 2012
[3]0=R1097729C1:R1114112C6; Name=AllTrades:    lt=46; lts=7.96; Sun Feb 19 22:41:34 2012
[3]0=R1114113C1:R1130496C6; Name=AllTrades:    lt=32; lts=8; Sun Feb 19 22:41:34 2012
[3]0=R1130497C1:R1146880C6; Name=AllTrades:    lt=31; lts=8.03; Sun Feb 19 22:41:35 2012
[3]0=R1146881C1:R1150063C6; Name=AllTrades:    lt=31; lts=8.06; Sun Feb 19 22:41:35 2012
[4]0=R1C1:R41C3; Name=SPBFUT_SBRF:    lt=16; lts=8.07; Sun Feb 19 22:41:35 2012
[2]1=R1C1:R41C65; Name=Forts:    lt=0; lts=8.07; Sun Feb 19 22:41:35 2012

В лог файле указана следующая информация ( на примере 1-ой строки):

[1]2 — имя книги и листа

=R1C1:R41C44; -размер получаемой таблицы

Name=Trades:   — имя таблицы

lt=5875; — время в миллисекундах, прошедшее с начала пуска экспорта из QUIK (для первой записи, в остальных строках — время прошедшее с момента предыдущего обмена по DDE)

lts=5.87; — время в секундах , прошедшее с начала пуска экспорта по DDE

Sun Feb 19 22:41:32 2012 — дата и время записи в лог файл

Анализ данного лог файла показывает, что с момента пуска обмена по DDE др получения первой порции данных прошло  5.8 секунды. Очевидно, это время требуется QUIK,чтобы подготовить информацию.

На передачу таблицы всех сделок ( Name=AllTrades) всего 1 миллион 150 тысяч записей ушло 8.06-6.01= 2.05 секунды.

Таким образом, при отсутствии торгов , суммарное время передачи всей информации , в том числе 1.1 млн сделок с их сортировкой по инструментам ( всего 953 инструмента в 16 классах) затрачено 8 секунд.