Господа алготрейдеры, подскажите, плиз, простейший пошаговый пример, как подключиться напрямую из qlua к локально установленному MSSQL (включая какую dll куда класть и что писать). Гугл не помогает.
ВНИМАНИЕ! КОММЕНТАРИИ ПЕРВОГО УРОВНЯ В ВОПРОСАХ УПОРЯДОЧИВАЮТСЯ ПО ЧИСЛУ ПЛЮСИКОВ, А НЕ ПО ВРЕМЕНИ ПУБЛИКАЦИИ.
Я не алготрейдер и сам не пробовал еще подключаться к базе :) Но есть проект http://keplerproject.github.io/luasql/ с драйвером для подключения по ODBC. Вроде доки на сайте адекватные.
nskez, это я уже видел. Не знаю кому как, но для меня — неадекватные доки. Исходники на «c» самому собирать что ли? Установка через какой-то rock — что это? Зачем так сложно? Скачал — не запускается — ошибка доступа. Какого? К чему?
Turbo Pascal, Насколько я понял rock это менеджер пакета для Lua, как Nuget для C#. Удобно управлять внешними зависимостями через пакетный менеджер. Прям просто ошибка доступа и все? А ODBC конекшен в винде правильно настроен?
Turbo Pascal, а-ха-ха, узнал себя прям). Бывает вникаешь в какую-то тему, бывает сложно из-за того что сложная информация, или структура — вникаешь через труд. Бывают единичные пробелы — подумываешь. А когда куча вопросов возникает — сложно составить хотя бы простейший каркас, от которого можно оттолкнуться.
Replikant_mih, угу, вот этот каркас и составляю.
С самим программированием проблем нет, но в современных технологиях настроить весь стак со всеми связями компонент — та ещё песня.
Eldar Shaymardanov, SQLite, в смысле?
Ок, хотя бы на SQLite пример покажите, буду очень спасибо.
Просто к MSSQL привык за долгие годы. Там и SSRS есть для красивой отчетности.
--инициализируем
sqlite3 = require(«lsqlite3»)
db = nil
function Calc()
--если db не открыта — открываем
if db == nil then
db = sqlite3.open(«c:\\develops\\tin_»… string.sub(info.sec_code,1,2)… "_"… info.interval..".db")
end
if not db:isopen() then
PrintDbgStr(«QLua: »… tostring(db:errmsg()))
return nil
end
--проверка на существование таблицы
sql = 'SELECT count(*) as countval FROM sqlite_master WHERE type='… k… 'table'… k… 'AND name='… k… 'balanse'… k..';'
db:exec[[
PRAGMA journal_mode= OFF;
PRAGMA synchronous = 0;
]]
for row in db:nrows(sql) do
if row.countval == 0 then
db:exec[[
--если таблицы нет, то создаем
CREATE TABLE IF NOT EXISTS `t78` ( `datetime` INTEGER, `volume` INTEGER, `diff` INTEGER, `mediana` INTEGER, `count` INTEGER);
CREATE UNIQUE INDEX `dt` ON `t78` ( `datetime`);
]]
end
end
else
--выполняем запрос в таблицу
sql = 'SELECT * FROM `t78` WHERE datetime='… os.time(T(index))..';'
--ответ
for row in db:nrows(sql) do
if row.volume == nil then
--тут я создаю нулевые значения для типизации.
db:exec[[ ALTER TABLE t78 ADD COLUMN volume integer default 0;]]
db:exec[[ ALTER TABLE t78 ADD COLUMN diff integer default 0;]]
db:exec[[ ALTER TABLE t78 ADD COLUMN mediana integer default 0;]]
db:exec[[ ALTER TABLE t78 ADD COLUMN count integer default 0;]]
else
--получаем данные
volume = row.volume
diff = row.diff
mediana = row.mediana
count_date = row.count
end
end
end
--формируем запрос на запись данных
sql = 'INSERT INTO t78 VALUES ('… os.time(T(index))… ',' … tonumber(volume)… ',' … tonumber(diff).. ',' … tonumber(mediana)… ','… tonumber(count_date)..');'
--выполняем запрос
db:exec(sql)
end
--при закрытии скрипта (индикатора) закрываем базу данных
function OnDestroy()
if db:isopen() then
Eldar Shaymardanov, спасибо. По самому коду вопросов нет, я не могу наладить сам факт связи.
Что, откуда взятое, и где должно лежать, чтобы выполнилась без ошибки эта строка:
sqlite3 = require(«lsqlite3»)
Turbo Pascal, в папке где файл квика лежит должно лежать lsqlite3.dll (это dll для lua) и сам sqlite3.dll
это взял в sqlite sqlite.org/download.html
а вот модуль lsqlite3.dll я уже не помню где брал. может сам скомпилировал с помощью luarocks
day0markets, смотря что вы хотите делать.
Хотите в базе поток сделок — вывозите через odbс в любом виде.
Хотите его сразу обрабатывать, а потом сохранять в БД?! Пожалуйста.
Под каждую задачу есть свое решение. Для меня sqlite достаточен.
Ниче се вы заморачиваетесь. Интересно, это может устойчиво работать?
Я бы все данные сливал по ODBC в базу. А там бы разгребал какими нибудь хранимыми процедурами. Минимум влазить в проект чужими длл ками и библиотеками
Андрей К, мне нужны данные по сделкам.
Сейчас скрипт создает файл с данными о сделке (OnTrade), а потом другая программа на C# парсит файл и заполняет БД. Дальнейший анализ уже внутри БД идёт.
Хотелось бы напрямую из квика писать в БД. Но там не просто выгрузка (иначе я бы из квика таблицу сделок бы выгружал), а несколько хитрый алгоритм.
пишешь обычную программу на любом удобном языке который позволяет делать .dll
подключаешь её в lua
определяешь в dll функцию luaopen_<dllname>, там переписываешь нужную тебе OnTrade с помощью reg_global
дальше спокойно в native коде получаешь данные и делаешь с ними что хочешь и как хочешь.
odbc — достаточно низкоуровневый язык, для гиков, кмк.
я бы искал что-нибудь повыше и попроще.
С самим программированием проблем нет, но в современных технологиях настроить весь стак со всеми связями компонент — та ещё песня.
Помимо luasql вам еще нужно подключить сам odbc.dll через package.loadlib.
прям как Ленин Вольтер Марина Горсес
Я сделал через Sql Lite
Ок, хотя бы на SQLite пример покажите, буду очень спасибо.
Просто к MSSQL привык за долгие годы. Там и SSRS есть для красивой отчетности.
--инициализируем
sqlite3 = require(«lsqlite3»)
db = nil
function Calc()
--если db не открыта — открываем
if db == nil then
db = sqlite3.open(«c:\\develops\\tin_»… string.sub(info.sec_code,1,2)… "_"… info.interval..".db")
end
if not db:isopen() then
PrintDbgStr(«QLua: »… tostring(db:errmsg()))
return nil
end
--проверка на существование таблицы
sql = 'SELECT count(*) as countval FROM sqlite_master WHERE type='… k… 'table'… k… 'AND name='… k… 'balanse'… k..';'
db:exec[[
PRAGMA journal_mode= OFF;
PRAGMA synchronous = 0;
]]
for row in db:nrows(sql) do
if row.countval == 0 then
db:exec[[
--если таблицы нет, то создаем
CREATE TABLE IF NOT EXISTS `t78` ( `datetime` INTEGER, `volume` INTEGER, `diff` INTEGER, `mediana` INTEGER, `count` INTEGER);
CREATE UNIQUE INDEX `dt` ON `t78` ( `datetime`);
]]
end
end
else
--выполняем запрос в таблицу
sql = 'SELECT * FROM `t78` WHERE datetime='… os.time(T(index))..';'
--ответ
for row in db:nrows(sql) do
if row.volume == nil then
--тут я создаю нулевые значения для типизации.
db:exec[[ ALTER TABLE t78 ADD COLUMN volume integer default 0;]]
db:exec[[ ALTER TABLE t78 ADD COLUMN diff integer default 0;]]
db:exec[[ ALTER TABLE t78 ADD COLUMN mediana integer default 0;]]
db:exec[[ ALTER TABLE t78 ADD COLUMN count integer default 0;]]
else
--получаем данные
volume = row.volume
diff = row.diff
mediana = row.mediana
count_date = row.count
end
end
end
--формируем запрос на запись данных
sql = 'INSERT INTO t78 VALUES ('… os.time(T(index))… ',' … tonumber(volume)… ',' … tonumber(diff).. ',' … tonumber(mediana)… ','… tonumber(count_date)..');'
--выполняем запрос
db:exec(sql)
end
--при закрытии скрипта (индикатора) закрываем базу данных
function OnDestroy()
if db:isopen() then
db:exec(last_sql)
db:close()
end
end
Что, откуда взятое, и где должно лежать, чтобы выполнилась без ошибки эта строка:
sqlite3 = require(«lsqlite3»)
это взял в sqlite sqlite.org/download.html
а вот модуль lsqlite3.dll я уже не помню где брал. может сам скомпилировал с помощью luarocks
Хотите в базе поток сделок — вывозите через odbс в любом виде.
Хотите его сразу обрабатывать, а потом сохранять в БД?! Пожалуйста.
Под каждую задачу есть свое решение. Для меня sqlite достаточен.
Я бы все данные сливал по ODBC в базу. А там бы разгребал какими нибудь хранимыми процедурами. Минимум влазить в проект чужими длл ками и библиотеками
Сейчас скрипт создает файл с данными о сделке (OnTrade), а потом другая программа на C# парсит файл и заполняет БД. Дальнейший анализ уже внутри БД идёт.
Хотелось бы напрямую из квика писать в БД. Но там не просто выгрузка (иначе я бы из квика таблицу сделок бы выгружал), а несколько хитрый алгоритм.
Выкидывать таблицу сделок по ODBC, и в ней на лету с помощью каких нибудь триггеров применять ваш хитры алгоритм обработки данных.
Если трейдер захотел писать данные в СУБД — это к депрессии.
подключаешь её в lua
определяешь в dll функцию luaopen_<dllname>, там переписываешь нужную тебе OnTrade с помощью reg_global
дальше спокойно в native коде получаешь данные и делаешь с ними что хочешь и как хочешь.
odbc — достаточно низкоуровневый язык, для гиков, кмк.
я бы искал что-нибудь повыше и попроще.
Только зарегистрированные и авторизованные пользователи могут оставлять ответы.
Залогиниться
Зарегистрироваться