Блог им. AndreiSk
Так как у меня есть робот, то на досуге решил подумать,
чего у него можно улучшить с целью повышения быстродействия.
Робот написан на .Net (C#).
Получает данные (стакан, таблицы) из QUIK по DDE (на моей стороне стоит компонент NDDE)
и отправляет-снимает заявки через trans2quik.dll
В последнее время стал подозреваать, что DDE для десятка стаканов уже тормознуто
как-то выглядит.
Решил покопать инет, с целью обнаружить более быстрый способ.
И, кажется нашел. Начиная с версии 6.15 в квике как оказывается в Lua есть вывод через
стандартный дебажный канал
http://quik2dde.ru/viewtopic.php?id=108
Сообщения из которого можно отловить например этой утилиткой:
https://technet.microsoft.com/en-us/sysinternals/bb896647
А тут пример на .Net, вполне рабочий
http://www.codeproject.com/Articles/13345/DbMon-NET-A-simple-NET-OutputDebugString-capturer
Проверил x86 и x64 сборки, под x64 есть небольшая бажка,
// Everything after the first DWORD is our debugging text
IntPtr pString;
if (Environment.Is64BitProcess)
pString = new IntPtr(m_SharedMem.ToInt64() + Marshal.SizeOf(typeof(int)));
else
pString = new IntPtr(m_SharedMem.ToInt32() + Marshal.SizeOf(typeof(int)));
Вот код скрипта на Lua
is_run = true
MAIN_SLEEP_MS = 500 — Спим в мсек
function main()
counter = 1
while is_run do
counter = counter + 1
PrintDbgStr(«Time:»… os.date("%H:%M:%S")… " counter:"… tostring(counter))
sleep(MAIN_SLEEP_MS)
end;
end
function OnStop()
is_run = false
end
(если что, вот здесь http://quik2dde.ru/viewtopic.php?id=16 написано куда это совать в квике).
Я проверил, 500 сообщений в секунду передается.
И в цикле он еще спит 500мс в сумме. Т.е. скорость порядка 1000
сообщений из квика вполне можно получить.
Ну понятно, что из main слать глупо, лучше через подписку на события.
Думаю с понедельника начать переделку.
Кто-нибудь пробовал так уже? Есть невидимые грабли?
Вроде как стоящая замена DDE...
Еще вопрос. Давно думаю о Прямом подключении,
если у кого есть такое уже, просветите по бюджету.
Возьмем допустим ITInvest http://www.itinvest.ru/pricing-n-docs/tariffs/direct-access/
Меня интересует ФОРТС (вторая табличка).
Я так понимаю, что сразу отдать 2360р за подключение и 2360р сразу же за первый месяц,
т.е. 4720р за первый месяц и 2360р за последующие. Кроме того 50% от биржевого сбора также надо платить брокеру. Правильно? И что такое 50% для «разово»?
На какую технологию лучше сделать упор если работать напрямую? FIX/FAST/Плаза2?
Интересует мнение опытных товарищей.
У меня не высокочастотный бот, но и тормозить ему незачем :)
Да вы хотя бы разок прочитайте мануал по Lua, там глава по взаимодействию с внешним кодом. Ее даже если бегло по диагонали между строк пробежать, то понятно будет, как все сделать ПРАВИЛЬНО с максимальной производительностью и надежностью.
Не, реально, я всегда говорил, что этот C# до добра не доводит. Хорош на раслабоне сидеть — давайте работайте, если хотите отбирать деньги у других участников биржи на постоянной основе. Только С++, только хардкор :)
и попробуйте делать обмен через луа. Где-то в комментариях давал ссылку на рабочий пример. Доберусь до компа и напишу.
выгрузка через OLE сервер:
www.bot4sale.ru/projects/utils-menu/utils-list/423-quik-ole.html
через odbc: либо через lua_odbc либо через luasql
подписываетесь на событие при обновлении стакана нужного инструмента (Subscribe_Level_II_Quotes)
потом получаете стакан OnQuote.
дальше внутри функции OnQuote экспортируете в нужный вам драйвер (OLE, ODBC).