Блог им. AndreiSk

Про обмен данными из QUIK в робота


Так как у меня есть робот, то на досуге решил подумать,
чего у него можно улучшить с целью повышения быстродействия.
Робот написан на .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?
Интересует мнение опытных товарищей. 

У меня не высокочастотный бот, но и тормозить ему незачем :)

★9
13 комментариев
У айти за апи смарткома платить вроде тоже надо…
avatar
Андрей Ерохин, хмм… насколько я понял, это если роботов продаешь. А если для себя одного, 1 лицензию то бесплатно. Но вообще SmartCom это API доступа к серверам ITInvest, больше ни к чему. Я про SmartCom вроде не говорил.
Счастливый Конец, айти инвест печально знаменит своими серверами и работой. даже не думай. кидало клиента с тех проблемами.
А через сокет/shared memory кидать не проще?
avatar
Анзорик, возможно. Я видел тут на смартлабе человек выкладывал как в Lua работать через порты. Но что то мне подсказывает, что через Windows API оно будет шустрее.
Счастливый Конец, ссылочку плиз
Андрей Вячеславович (Ganesh), кажется эта была smart-lab.ru/blog/225497.php. Я тогда не сильно интересовался, просто запомнилось что пролетало
Блин, я вот читаю и охреневаю, мужики. Вот оно откуда берется конкурентное преимущество: дебажный канал, сокеты, shared memory? Долбануться просто :)

Да вы хотя бы разок прочитайте мануал по Lua, там глава по взаимодействию с внешним кодом. Ее даже если бегло по диагонали между строк пробежать, то понятно будет, как все сделать ПРАВИЛЬНО с максимальной производительностью и надежностью.

Не, реально, я всегда говорил, что этот C# до добра не доводит. Хорош на раслабоне сидеть — давайте работайте, если хотите отбирать деньги у других участников биржи на постоянной основе. Только С++, только хардкор :)
avatar
bstone, ну торговая стратегия это полдела, инфраструктурная поддержка тоже важна. Все же есть различие, ответит робот быстро или через минуту…
Счастливый Конец, ну так я и сказал, что дебажный канал и MAIN_SLEEP_MS = 500 — это просто абзац какая плохая идея в разрезе инфраструктурной поддержки.
avatar
bstone, давайте все же без фанатизма. Кодить на lua под квиком — совершенно недружелюбное занятие. Меня вполне устраивает C# и совершенно не нравится писать на lua, чего и пытаюсь избежать.
Я делал так: подписываюсь на уведомления изменения стакана в 33 инструментах. При изменении пересчитываю показатели, плюс беру информацию из таблицы параметров. Получается очень быстро. Правда луа в квике плохо документирован.
и попробуйте делать обмен через луа. Где-то в комментариях давал ссылку на рабочий пример. Доберусь до компа и напишу.
avatar
нашел предыдущие записи.
выгрузка через 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).
avatar

теги блога Счастливый Конец

....все тэги



UPDONW
Новый дизайн