Счастливый Конец
Счастливый Конец личный блог
02 августа 2015, 22:39

Про обмен данными из 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?
Интересует мнение опытных товарищей. 

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

13 Комментариев
  • Aero
    02 августа 2015, 22:45
    У айти за апи смарткома платить вроде тоже надо…
      • Счастливый Конец, айти инвест печально знаменит своими серверами и работой. даже не думай. кидало клиента с тех проблемами.
  • Анзорик
    02 августа 2015, 22:52
    А через сокет/shared memory кидать не проще?
  • bstone
    02 августа 2015, 23:23
    Блин, я вот читаю и охреневаю, мужики. Вот оно откуда берется конкурентное преимущество: дебажный канал, сокеты, shared memory? Долбануться просто :)

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

    Не, реально, я всегда говорил, что этот C# до добра не доводит. Хорош на раслабоне сидеть — давайте работайте, если хотите отбирать деньги у других участников биржи на постоянной основе. Только С++, только хардкор :)
      • bstone
        02 августа 2015, 23:56
        Счастливый Конец, ну так я и сказал, что дебажный канал и MAIN_SLEEP_MS = 500 — это просто абзац какая плохая идея в разрезе инфраструктурной поддержки.
  • Eldar Shaymardanov
    03 августа 2015, 08:36
    Я делал так: подписываюсь на уведомления изменения стакана в 33 инструментах. При изменении пересчитываю показатели, плюс беру информацию из таблицы параметров. Получается очень быстро. Правда луа в квике плохо документирован.
    и попробуйте делать обмен через луа. Где-то в комментариях давал ссылку на рабочий пример. Доберусь до компа и напишу.
  • Eldar Shaymardanov
    03 августа 2015, 11:25
    нашел предыдущие записи.
    выгрузка через 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).

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн