Блог им. dkostiunin

Как экспортировать данные из квика через сокеты - ответ и тут же вопрос

Последние несколько месяцев время от времени начинал времени ломать голову над одной задачкой.
Суть в следующем.
Я сделал скрипт на питоне, на основе торговых данных пишет заявки в tri файл квиковский.
Чтоб заявку создать нужно принять решение на основе каких то данных из таблиц квика (например исполнилась какая то ранняя заявка, или банально цена дошла до нужного уровня, и т.п.)
Данные из таблиц квика, как известно, встроенными методами можно экспортировать через ДДЕ сервер, или в базы данных через ODBC.
То есть — для этого не надо обладать знаниями по программированию, это простые, очевидные способы, доступные всем, у кого установлен квик.
Я выбрал способ по ODBC, и пользуюсь им.
Связка работает стабильно, ничего не рушится, правда пару раз за несколько месяцев зависал сам квик из за того, что кончалась оперативная память (сервер слабенький у меня).

Но у такой связки есть слабое место, приходится в питоне запускать таймер, по кjторому питон опрашивает базу данных.
Это не логично, робот должен совершать какие то действия в ответ на событие, а не просто молотить запросы в БД.

В итоге, путем гугления выяснилось что существуют в  теории еще два пособа экспорта данных из квика.
Первый способ — это экспорт в библиотеку dll trans2quik — библиотека позволяет  как импортировать заявки в квик, так и экспортировать заявки и сделки из квика.
С импортом заявок я разобрался (кому интересно, по простому могу объяснить), а вот по поводу экспорта так и не понял, суть в том, что сделки  приходят в бибдиотеку dll а оттуда уже в скрипт питона. Подписаться на отправку удается, а вот как получать сами сделки в переменные, я так и не понял.

второй способ, использование сокет соединений. Общий смысл в том, что в локальной сети (в данном случае в рамках одного компьютера), создается сокет сервер и сокет клиент, и клиент может отправлять что либо серверу.
В итоге идея в том, чтобы создать на питоне сокет сервер, а на языке LUA встроенном в квик, создать клиент, который будет отправлять все нужные события в робота на питоне.
На питоне очень много понятной для нубов инфы в интернете, все просто найти. Сокет библиотеку для питона даже устанавливать не надо, она уже встроена.
А вот с LUA это просто капец насчет инфы, для тех кто начинает с нуля, разобраться не возможно. Там какой то междусобойчик, люди чего то там знают уже, какие то вопросы задают, сами себе отвечают.

В итоге методом простого тыканья пальцем в небо удалось найти старую библиотеку Сокет для луа, также пример кода на LUA, и создать наконец рабочий клиент.

Как это все я запустил?
Из библиотеки с архивом сокета кинул все файлы в корневой каталог квика, не заменял только основной файл lua5.1.exe (оставил родной)
туда же положил и файл со скриптом клиента, перед тем как запускать клиент, само собой надо запустить сервер на питоне, 
и после этого все сразу заработало на 32 разрядной версии квика.

Кому надо, могу прислать  ту библиотеку сокет, которая у меня заработала, а также примеры скриптов сервера и клиента

проблема в том, что на 64 разрядной версии не запускается, пишет ошибку

error loading module 'socket.core' from file 'C:\QUIK_VTB24\socket\core.dll':
%1 не является приложением Win32.

пока времени нет нагуглить решение, может кто знает как наладить?

Update:
библиотеку 64 нашел, все заработало с сокетами


  • обсудить на форуме:
  • Quik Lua
★18
63 комментария
По всей видимости у вас старая библиотека Сокет для луа 32 разрядная, нужно либо найти вариант 64 разрядной, либо исходники и потом их собрать для 64 разряда.
avatar
Karim, само собой, старая 2007 года.
Она сразу нагуливается.
А вот по поводу собрать из исходников, пока для меня это звучит, как абракадабра
avatar
Читал мануил и единственное, что там написано про 64 версию — ищите dll под неё :(
avatar
RPC-сервис для вызова API Lua-библиотеки торгового терминала QUIK
https://github.com/Enfernuz/quik-lua-rpc

Пример клиента на python для quik-lua-rpc JSON? 

import zmq

context = zmq.Context()
socket = self.context.socket(zmq.REQ)
socket.connect('tcp://127.0.0.1:5560')
socket.send_string('{"method":"datasource.CreateDataSource","args":{"class_code":"SPBFUT", "sec_code":"SiH0", "interval":"INTERVAL_M1", "param":""}}')
datasource_uuid = json.loads(socket.recv_string())['result']['datasource_uuid']
socket.send_string('{"method":"datasource.Size","args":{"datasource_uuid":"%s"}}' % (datasource_uuid))
num_candles = json.loads(socket.recv_string())['result']['value']
for i in range(0,num_candles):
    socket.send_string('{"method":"datasource.C","args":{"datasource_uuid":"%s","candle_index":%d}}' % (datasource_uuid, i))
    candle_close = json.loads(socket.recv_string())['result']['value']
    socket.send_string('{"method":"datasource.O","args":{"datasource_uuid":"%s","candle_index":%d}}' % (datasource_uuid, i))
    candle_open = json.loads(socket.recv_string())['result']['value']
    socket.send_string('{"method":"datasource.T","args":{"datasource_uuid":"%s","candle_index":%d}}' % (datasource_uuid, i))
    candle_time = json.loads(socket.recv_string())['result']['value']
avatar

иллюстрация, куда можно это дальше применить

quotes = {}
quotes['open']=numpy.asarray([item['open'] for item in data])
quotes['close']=numpy.asarray([item['close'] for item in data])
quotes['high']=numpy.asarray([item['high'] for item in data])
quotes['low']=numpy.asarray([item['low'] for item in data])
quotes['datetime']=numpy.asarray([item['datetime'] for item in data])
fig, ax = plt.subplots(3, sharex=True)
candlestick2_ohlc(ax[0],quotes['open'],quotes['high'],quotes['low'],quotes['close'],width=0.6)
ax[0].xaxis.set_major_locator(ticker.MaxNLocator(6))
def chart_date(x,pos):
    try:
        return quotes['datetime'][int(x)]
    except IndexError:
        return ''
ax[0].xaxis.set_major_formatter(ticker.FuncFormatter(chart_date))
fig.autofmt_xdate()
fig.tight_layout()
quotes['close'] = numpy.array([float(x) for x in quotes['close']])
sma = talib.SMA(quotes['close'], timeperiod=50)
ax[0].plot(sma)
ema = talib.EMA(quotes['close'], timeperiod=20)
ax[0].plot(ema)
macd, macdsignal, macdhist = talib.MACD(quotes['close'], fastperiod=12, slowperiod=26, signalperiod=9)
ax[1].plot(macd, color="y")
ax[1].plot(macdsignal)
hist_data = []
for elem in macdhist:
    if not numpy.isnan(elem):
        v = 0 if numpy.isnan(elem) else elem
        hist_data.append(v*100)
ax[2].fill_between([x for x in range(len(macdhist))], 0,macdhist)
plt.show()
avatar
Возможно уже писал.
Не стоит искать сокеты для Луа.
Уходим из Луа в С++ DLL, а в ДЛЛ уже делаем сокет(ы) клиент(ы) на С++. Экземплы сокетов на С++ есть в инете. Куча.
avatar
3Qu, дак вот я как раз об этом и говорю, Вам то понятно, что Вы написали, а я с Луны вчера только свалился.
 Что значит уходить в ДЛЛ?
Как вообще в С++ что то запилить? Там какая то среда разработки визуал студио просто сумашедшая, гигабайты установочных файлов.

Вот если просто по ДЛЛ, можете ответить совсем, совсем для тупых чайников на такой вопрос
мне дали библиотеку для работы с trans2quik.dll
я оттуда могу вызывать разные функции,
в частности
функции для соединения и отправки транзакций работают четко, например

def send_async_transaction(transaction):
    lpstTransactionString = LPCSTR(transaction.encode())
    return SEND_ASYNC_TRANSACTION(lpstTransactionString)

подставляю вместо transaction строку в кавычках с параметрами заявки, и вуаля — заявка в квике.
Все четко.

А вот такая функция оттуда

def start_orders(callback):
    c = ORDER_STATUS_CALLBACK(callback)
    start_orders.callback = c
    return START_ORDERS©

у меня толком не работает, так как я во первых не понимаю, что точно передавать в качестве callback, и как передавать,
а во вторых, как и куда  в итоге потом получать сами заявки, куда они записываются?

в самой библиотеке есть внизу всякие переменные типа

order_qty = ORDER_QTY = _declare_method(TRANS2QUIK.TRANS2QUIK_ORDER_QTY, c_long, c_long)


# long TRANS2QUIK_ORDER_DATE(long nOrderDescriptor)
order_date = ORDER_DATE = _declare_method(TRANS2QUIK.TRANS2QUIK_ORDER_DATE, c_long, c_long)

предполагаю что эти order_date  и прочее и есть каллбаки,
пробовал их подставлять в функцию
trans2=trans2quik.start_orders(trans2quik.order_qty)

если заявкок по нужном инструменту нет то пишет  none

а если есть заявки то 

File "_ctypes/callbacks.c", line 232, in 'calling callback function'
TypeError: this function takes 1 argument (11 given)

и ожидает ввода чего то. Типа я передал один аргумент, а надо 11 передать??? Каких 11 и как передать?
И правильно ли я понимаю что потом в переменную trans2 наконец запишутся эти так ожидаемые заявки?

По идее нафиг мне эти сокеты, если можно через ДЛЛ все получить, но вот тыкаюсь как слепой котенок, задаю вопросы, а мне дают ответы типа Вашего, да, все можно сделать, а как сделать нигде не написано ((((

Я же не программист, я торгаш, мне это просто как инструмент надо, но освоить это для меня явно сложнее, чем торговать




avatar
Дмитрий К, мне жаль, но я не смогу вам объяснить ни в двух, ни в десяти словах.(
Это надо хотя бы пару часов с вами посидеть — поразбираться.
ЗЫ Посмотрел профиль, далековато вы.
avatar
3Qu, а не можете просто написать, как передать 11 аргументов в качестве каллбэка в эту функцию?
может в виде какого то списка, просто через запятую пробовал, не получается, пробовал в спискок заранее записать, а потом его передать, тоже ругается
avatar
Дмитрий К, на вскидку не скажу. Позднее, вечером посмотрю доки 
avatar
Дмитрий К, теперь могу написать
как передать 11 аргументов в качестве каллбэка в эту функцию?
Никак!
Коллбэки — это события терминала. Вы должны определить эти функции в своей программе строго в соответствии с их шаблонами.
При вызове их из терминала вы можете использовать переданные вам аргументы в определенной вами функции, и также вызывать из своей коллбэк функции некоторый ограниченный набор функций-запросов к терминалу. Сами эти функции-запросы определены в документации.
avatar
3Qu, три раза перечитал, ничего не понял. 
У меня есть библиотека,  там есть две функции.
Первая это подписка на отправку в dll из квика данных например по какой то бумаге.
Эта функция работает.
Я передаю в качестве аргументов класс и код бумаги.

Далее я вызываю из этой библиотеки другую функцию, о кторой я писал ранее. Эта функция непосредственно из квика  принимает эти заявки и должна передать в мой скрипт питона.
И она тоже работает.
У нее единственный аргумент. 
Когда передашь туда произвольную строку, скрипт ругается, что такая строка не определена. 
Если передает туда,  то что что привел в пример ранее,  функция выполняется, причем столько раз, сколько к меня по факту заявок было по этой бумаге в квик.
Но каждый раз выводит сообщение об ошибке. 

Вот скрин из документации. Там пример.
Проблема в том,  что в примере в аргументах этой функции пусто .



Или Вы имеете в виду другую документацию?

avatar
3Qu, кстати, то что я написал ранее, по моему я туплю
File "_ctypes/callbacks.c", line 232, in 'calling callback function'
TypeError: this function takes 1 argument (11 given)

и ожидает ввода чего то. Типа я передал один аргумент, а надо 11 передать??? Каких 11 и как передать?

Эта ошибка должна означать, что я передаю 11 аргументов , а принимается только один.
Сейчас только дошло.
avatar
Дмитрий К, если мы имеем в виду trans2quik.dll, то формат этих коллбэк функций четко определен.
1. void __stdcall TRADE_STATUS_CALLBACK (long nMode, double dNumber, double dOrderNumber, LPCTSTR ClassCode, LPCTSTR SecCode, double dPrice, long nQty, double dValue, long nIsSell, long nTradeDescriptor)
2. void __stdcall ORDER_STATUS_CALLBACK(long nMode, DWORD dwTransID, double dNumber, LPCTSTR ClassCode, LPCTSTR SecCode, double dPrice, long nBalance, double dValue, long nIsSell, long nStatus, long nOrderDescriptor)
и никак иначе (это в С++). Внутреннее наполнение функции вы делаете сами. Функции вызываются непосредственно из терминала, не вами. Вы туда ничего не передаете, и не можете передать.
Или уже я что-то не понимаю. Мы же про коллбэки говорим?
avatar
3Qu, спасибо, что это написали, это заставило меня внимательнее смортеть в документацию, мне ужно из питон скрипта передать функцию
TRANS2QUIK_START_ORDERS
еще раз посмотрел, вот что написано в доках
Функция запускает процесс получения заявок по классам и инструментам, определенных функцией TRANS2QUIK_SUBSCRIBE_ORDERS.

void __stdcall TRANS2QUIK_START_ORDERS (TRANS2QUIK_ORDER_STATUS_CALLBACK pfnOrderStatusCallback)

то есть у нее в аргументах сидит как раз то что Вы написали, то есть другая функция

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

# void TRANS2QUIK_ORDER_STATUS_CALLBACK(
# long nMode,
# DWORD dwTransID,
# double dNumber,
# LPSTR lpstrClassCode,
# LPSTR lpstrSecCode,
# double dPrice,
# long nBalance,
# double dValue,
# long nIsSell,
# long nStatus,
# long nOrderDescriptor
# )
ORDER_STATUS_CALLBACK = \
WINFUNCTYPE(c_void, c_long, DWORD, c_double, LPSTR, LPSTR,
c_double, c_long, c_double, c_long, c_long, c_long)

# void TRANS2QUIK_START_ORDERS(
# TRANS2QUIK_ORDER_STATUS_CALLBACK pfnOrderStatusCallback
# )

START_ORDERS = _declare_method(
TRANS2QUIK.TRANS2QUIK_START_ORDERS, c_void,
ORDER_STATUS_CALLBACK
)

#----------------------------------------------------------------------
def start_orders(callback):
c = ORDER_STATUS_CALLBACK(callback)
start_orders.callback = c
return START_ORDERS©

 

avatar
Дмитрий К, это определения функций ORDER_STATUS_CALLBACK и TRANS2QUIK_START_ORDERS для работы с DLL. И некой start_orders.
Как их конкретно использовать в Питон? — Понятия не имею. Мало информации. В этом супе чего-то не хватает.)
Пока не разберетесь, этот код лучше вообще руками не трогать, и скорее всего, вообще менять не придется, если в нем нет ошибок.
ЗЫ В общем, ясно, это PyQuik. Проект не обновлялся с 12 года, если не ошибаюсь. Не факт, что он будет работать без редактирования на современном Питон. Хотя, и не факт, что не будет.
avatar
import zmq

context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://127.0.0.1:5561")
socket.setsockopt(zmq.SUBSCRIBE, b"OnAllTrade")
while True:
    print(json.loads(socket.recv_unicode()))
avatar
 

Схемы сообщений JSON
В общих чертах, формат сообщений такой:

Запрос:

{
  "method":"НАЗВАНИЕ_QLUA-ФУНКЦИИ",
  "args": {
    // АРГУМЕНТЫ QLUA-ФУНКЦИИ
  }
}

Ответ:

{
  "method": "НАЗВАНИЕ_QLUA-ФУНКЦИИ",
  "result": // РЕЗУЛЬТАТ QLUA-ФУНКЦИИ (число, объект, строка -- в зависимости от вызываемой функции)
}<br>Схемы:<br><a href="https://github.com/Enfernuz/quik-lua-rpc/tree/master/json/schema">https://github.com/Enfernuz/quik-lua-rpc/tree/master/json/schema</a>
avatar
аналогичные проблемы в аналогичных ситуациях (Матлаб-COM-Lua). Проблема в том, что подключаемая dll 32х битная и LUA 64x напрочь отказывается её подгружать. 

Решение :
1. добавить в связку коммуникатор 32бит/64бит (не занимался).
2. перекомпилировать библиотеку под 64 бита через… VS14+ (пробовал через MinGW и встроенные скрипты компиляции — у меня не вышло)
avatar
Автор спросил: Как экспортировать данные из квика через сокеты
Ответ: Готовое решение: с помощью https://github.com/Enfernuz/quik-lua-rpc
avatar
А такая тема может сработать? — В СУБД могут быть триггеры, не все СУБД это поддерживают, но некоторые да, например MySQL.

Можно сделать триггер, что при вставке-изменении значений в конкретной таблице что-то делать, кажется там можно дергать стороннее приложение даже в рамках этой функциональности.
avatar
Replikant_mih, да, тоже про это гуглил, пишут что не особо это рекомендуется и поэтому не особо и практикуется.
Как бы есть механизмы вообще без ODBC экспорта, вообще я так понимаю, самый популярный, чем все пользуются, это trans2quik.dll наверное надо копать дальше сюда, его можно одновременно и для отправки заявок, и для получения данных использовать

avatar
Дмитрий К, А не пробовали копать в более специлазированные алго-API?) — там точно будет подписка на события. Такие платформы конечно более брокер-специфичны, ну в смысле у каждого брокера своя — у финами, ITI Capital такие есть, например. Но там в обоих примерах Python не прокатит без прослоек дополнительных.
avatar
Replikant_mih, ну тут же все начинается с брокера, я сейчас активно только в втб торгую, у них по сути кроме квика ничего и нет.
Поэтому и не думал изучать другие терминалы с их апи
avatar
Дмитрий К, чем хорош ВТБ относительно других??
(Возможно через другого брокера/др. софт решить вашу проблему будет гораздо проще)
avatar
asfa, ну у меня есть счета в альфе открытии и Сбере, и я поторговав везде, методом тыка определил для себя наиболее удобного брокера .
Например — тарифы на фонде, плечи на фонде, техподдержка, стабильность работы терминала,  отчеты, мелкий шрифт регламентов, визуальная экономическая надежность брокера и можно еще перечислять ньюансы. 
 
Экспериментировать с другими брокерами может появиться желание, только если чем то начнет не устраивать втб


avatar
Дмитрий К, Ну хз, я как-то посвободней в выборе брокера, т.е. это не что-то что выбрал одного и на века, можно и разных попробовать.

avatar
Replikant_mih, вот и я про то, помыкался с несколькими и остановился на этом пока что
avatar
trans2quik python https://github.com/alexanderarcha95/py2quik

trans2quik – это официальное документированное API для взаимодействия внешних приложений с торговым терминалом QUIK. Оно позволяет из внешних программ выполнять различные операции, в основном это отсылка транзакций, получение информации о заявках и сделках. Рыночная информация через это API не доступна

Технически данное API устроено следующим образом: разработчиками QUIK поставляется DLL-библиотека, которую внешнее приложение загружает и вызывает из нее доступные интерфейсные функции.

avatar
luks sluk,  эта штука с небольшой доработкой (под 64 бит) у меня заработала на отправку заявок.
На примем данных Автор срипта не дописал срипт.
Там он функцию написал, только на подписку на данные, но она не работает, я в другом срипте посмотрел, чуток переделал, она тоже заработала.
Но к сожалению для функции TRANS2QUIK_START_ORDERS (и TRADES ) он код вообще не написал, а я не понимаю, как написать, чтоб эта функция исполнялась.
Короче говоря, у меня такой же функционал как и здесь тоже есть, и тоже на прием не работает, только на отправку
avatar
Вот есть Java-wrapper for Trans2Quik.dll https://github.com/Enfernuz/JavaTrans2Quik

М
ожет служить примером для написания такого же на python
Функции для работы с транзакциями через API
https://euvgub.github.io/quik_user_manual/ch6_11.html
Получение информации о заявках и сделках https://euvgub.github.io/quik_user_manual/ch6_9_19.html
avatar
Replikant_mih, триггер то можно, но это не для того, чтобы внешний софт дергать, а внутренние процессы запускать. Подходы для дергания внешнего софта существуют, но их традиционно избегают. Лучше все-таки дергать в цикле, но стоит учитывать, чтобы запрос был легким для БД.
avatar
alewmt, Ну да, понятно, что это для внутренних целей. Ну, кстати, как вариант можно сделать так:
сделать триггер, чтобы изменения в тяжелых таблицах делали изменения в легкой сигнальной, а опрашивать эту легкую — её вообще можно сделать чисто в оперативке.
avatar
 Даже если там можно тупо запускать стороннее приложение, то можно сделать простейший скрипт на питоне, основная задача которого, будучи запущенным СУБД, будет установить сокет соединение с основным приложением и сказать ему, что было изменение (даже если нет возможности сразу сказать, какое именно), а дальше уже делаешь селект к базе основным приложением.
avatar
Данные из QUIK должны сначала дойти до СУБД. QUIK выступает socket сервером с помощью quik-lua-rpc. СУБД может являться socket клиентом без дополнительных прослоек?
avatar
luks sluk, вот тоже интересный вопрос, перове что я пытался сделать, это перехватить как то данные по порту 3306 который у меня указан в настройках mysql коннектора ODBC, но питон сразу ругается, когда сокет сервер запускаешь, что операционная система не разрешает этот порт, вроде как он операционкой зарезервирован, наверное можно это как то отключить в настройках операционной системы, но я дальше не полез разбираться

avatar
https://github.com/finsight/QUIKSharp/tree/master/src/QuikSharp/lua
Вот здесь гляньте 64-битная, там все как в 32-битной, сама dll называется lua51.dll (без точки 5.1). Работает «странненько» на восьмерке Квика. Может полгига данных передать, поработать минут 30 — потом внезапно отваливается. А бывает почти сразу отваливается. Время не было разобраться. У кого получится стабильная работа — напишите, если не трудно.

avatar
Евгений Шибаев, нашел вот сокет библиотеку 64
download.zerobrane.com/misc/luasec-0.6-openssl-1.0.2o-luasocket-3.0-win64.zip
заработало, теперь только потестить
avatar
Дмитрий К, спасибо, завтра потестирую, отпишусь
avatar
quik = socket server <--> python script = socket client <--> mysql 
avatar
Но у такой связки есть слабое место, приходится в питоне запускать таймер, по кjторому питон опрашивает базу данных.
Это не логично, робот должен совершать какие то действия в ответ на событие, а не просто молотить запросы в БД.
Почему это слабое место? Только по тому что не логично? Или есть проблемы с производительностью?
avatar
alewmt, я думаю что и то и другое.
У коллеги по такой схеме запрос к базе до 100 раз в секунду, и ничего вроде не тормозит,   но у него ссд диск.
У меня один раз в тридцать секунд, я пробовал раз в секунду  и у меня уже увеличивается потребление оперативной памяти и загружается процессор.
По поводу нелогичности, если изменение базы раз в час у кого то, и чтоб уловить изменение, делают 10000 запросов к базе, я думаю это не логично.
avatar
Дмитрий К, в таких задачах еще надо уметь правильно создавать БД. Ключи правильные делать, индексы.. 
avatar
Дмитрий К, не сочтите за оскорбление, это дилетантский аргумент, есть простая, надежная и рабочая схема без бутылочных горлышек. И не надо пытаться нагородить глючных велосипедов без достаточных на то оснований. Вы не очень представляете как работает сервер бд. единственное, что нужно обеспечить это чтобы запрос был легким и не вытаскивал каждый раз из бд 100500 мегабайт.
avatar
alewmt, так я ж не программист, мне всего то надо получить данные с квика, тем не менее , просто молотить запросы по таймеру  — это по Вашему логично?
Так получается? Если так, 
Хорошо, давайте еще утрируем, а если у меня будет запущен не один скрипт , а 1000, или 10000, и по каждый отправляет по 100 раз в секунду.
Ну и дальше  можно еще утрировать, согласно Вашей логике, все равно ЕДИНСТВЕННОЕ, это обеспечить легкий запрос?
Вроде какие школе по экономической географии проходили , есть экстенсивный путь развития   а есть интенсивный. 
Увеличение запросов к базе  это экстенсивный путь, вообще с таким подходом денег заработаешь меньше при том, что затраты больше. 
Это уж экономические законы, их не перепрыгнешь по этому я настаиваю на том, что много бессмысленных запросов- не логично
avatar
Дмитрий К, зато я программист, и как программист я вам и говорю, не занимайтесь ерундой
avatar
Дмитрий К, мой предыдущий ответ звучит резковато и не очень аргументировано, поэтому я решил немного развернуть мысль чтобы и сгладить и лучше донести мысль. за свою карьеру я имел много возможностьей убедиться насколько разумнее делать good enough и не гнаться за идеальным решением. Я прекрасно понимаю о чем вы говорите, но профессиональный опыт говорит другое, исходить надо из практической целесообразности, а не соображений совершенства. То о чем вы говорите методом логических рассуждений приведет к колокации на бирже с проводом воткнутым прямо в fpga как самому эффективному способу. Вы наверняка, возразите, что это уже перебор, т.к. дорого и не окупится, но то что вы хотите сделать тоже дорого и не окупиться с тз потраченных усилий. Я вас уверяю, если вы не будуте тратить время на переделку работы на дде сервер, то денег будет либо столько же либо больше, т.к. эти много десятков часов вы потратите на исследования рынка на не создание велосипеда.
avatar
alewmt, соглашусь с этим.
Тут ведь реальная диалектика ))). По сути я продолжаю с этим мудохаться по двум причинам, привычка все доводить до конца, и просто интересно решить логическую задачу. А вовосе не из за денег. Действительно ведь сам робот и так  работает как мне надо Просто в обоих перечисленных мной случаях с длл библиотекой и сокетами решение где то на поверхности, в первом случае надо понять как передать аргумент в функцию, во втором случае найти 64 разр библиотеку, не хочется бросать уже потратив некторое время на решение.
avatar
Дмитрий К, да в индексы загоняешь и всё ок ) на край можно MOMORY TABLE юзать… там всё супер быстро и без нагрузки…
avatar
Дмитрий К, выложите плз, что у Вас есть что можно в mysql загонять плз со структурой базы, а то я буквально в воскресение открыл lua... 
Спасибо.
avatar
Свой Мужик, не понял,  что именно выложить?
Как в mysql таблицы выгружать квиковские ?

avatar
Дмитрий К, да )
avatar
Свой Мужик, ну в двух словах, надо создать в видоус источник данных для mysql причем драйвер надо качать старый 3,51 по моему, квик чего то не хочет экспортировать в более новые,
затем подготовить таблицу для экспорта, это можно посмотреть в документации — нажимешь в квике ф1,
совместная работа с другими приложениями и раздел приложения.
Там для каждой таблицы квик для каждого параметра указан формат
типа данных mysql
Инструмент VARCHAR(150
создаешь таблицу в mysql с нужными столбцами, которые хочешь экспортировать и надо правильный формат для каждого столбца

затем правой кнопкой мыши на любую нужную таблицу квика нажимаешь, выбираешь экспорт odbс, вводишь логин и пароль к базе если создавал его, справа появляются названия таблиц, которые заранее создал, выбираешь, куда хочешь экспортировать, ниже соотносишь поля таблиц квика и mysql, и погнали
там есть ньюансы конечно, если сложности будут по ходу дела спрашивайте.

Этот экспорт к LUA отношения не имеет вообще.
avatar
Дмитрий К, спасибо завтра попробую разобраться начиная с того как  odbc к mysql прикрутить )
avatar
Если нужно ohlc или ticks загонять в mysql, то socket client получает от socket server нужные данные с помощью CreateDataSource(создать источник и получить свечи или тики) и размещает их в mysql с помощью любого python mysql connector
avatar
Тики или свечи можно попутно собирать в mysql или любую другую СУБД, при этом с помощью quik-lua-rpc из «коробки» можно получать данные из quik, анализировать их средствами python и выполнять ордера без использования TRANS2QUIK и без tri файлов
avatar
https://smart-lab.ru/blog/550216.php

+ с
м там последний коммент от swerg'a, 
avatar
ПBМ, спасибо, ветку прочитал, перешл по последней ссылке, тоже прочитал,
вообщем в итоге сам погуглил, нашел 64 бит core.dll

download.zerobrane.com/misc/luasec-0.6-openssl-1.0.2o-luasocket-3.0-win64.zip

и с ним у меня заработало все.
Только ньюанс, пришлось библитеку открыть прогой depense
оказывается она ссылается на файл lua51.dll а в оригинале lua5.1.dll
переименовал и заработало
avatar
А зачем в СУБД заливать данные? Через сокет доступны все исторические данные, которые есть на открытых графиках
avatar
WebQuik прекрасно принимает и передает всю необходимую информацию через Websocket. Рабочий пример https://github.com/DmitryPukhov/pytrade
WebQuik <--> Websocket <--> Python
avatar
Скажите пожалуйста, я сделал вывод по odbc в  mysql, но меняется только одна строчка в таблице. Как сделать, чтобы таблица наполнялась?
Виктор Понедельник, а что именно экспортируете? Если например стакан, то у меня выгружаются все значения из стакана. Как только что то меняется в стакане, то соответственно эти значения заменяются и в таблице.
Или если экспортирую таблицу сделок, в ьаблицу выводятся сделки, как только строка со сделкой появляется в таблице эта строка и выволится
avatar
Дмитрий К, экспортирую имя символа, время и объем сделки. Создал соответствующие колонки, но пишется только одна строчка, которая все время меняется. Видать, квик свою работу делает, а в базе что-то не то, не могу понять что
ЗЫ. Понял в чем дело. С автонумерацией первого столбца. 

теги блога Дмитрий К

....все тэги



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