Господа алготрейдеры, подскажите, плиз, простейший пошаговый пример, как подключиться напрямую из qlua к локально установленному MSSQL (включая какую dll куда класть и что писать). Гугл не помогает.
Господа алготрейдеры, подскажите, плиз, простейший пошаговый пример, как подключиться напрямую из 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 — достаточно низкоуровневый язык, для гиков, кмк.
я бы искал что-нибудь повыше и попроще.
Александр Ядрихинский, Пенсионные отчисления в процентах от зарплаты — самая большая затратная часть. В целом работодатель платит в госорганы 30% от начисленной зарплаты, плюс к ним добавляется еще...
mr.Harry, нет. Костин это не спонтанное зло, это в первую очередь наёмный исполнитель. Его назначило государство, а значит он выполняет возложеную задачу по управлению. Уйдёт один Костин — на его м...
Натуральный газ. Берём Первый Праздничный!🎉🎉🎉 Приближается Новый Год, и тикер фьюча на натуральный газ как ничто другое созвучен предстоящему празднику NG-1️⃣.2️⃣5️⃣✨️
Первые импульсы от уровня 3...
Tesla, Inc. Tesla, Inc.
As of October 18, 2024, there were 3,210,059,659 shares of the registrant’s common stock outstanding.
https://www.sec.gov/ix?doc=/Archives/edgar/data/1318605/0001628280240...
ЭТА компания платит дивиденды в 30%, НО ее акции никому не нужны. Почему? Удивительный факт на российском рынке. Компания платит рекордные дивиденды, но ее акции упали на 32% с начала года (с учетом д...
Энергопотребление в России с начала года выросло на 3,3%, сообщил председатель правления «Системного оператора ЕЭС» (диспетчер единой энергосистемы) Федор Опадчий, передает ТАСС.
💭 «В этом году ...
С самим программированием проблем нет, но в современных технологиях настроить весь стак со всеми связями компонент — та ещё песня.
Помимо 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 — достаточно низкоуровневый язык, для гиков, кмк.
я бы искал что-нибудь повыше и попроще.