Господа алготрейдеры, подскажите, плиз, простейший пошаговый пример, как подключиться напрямую из 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 — достаточно низкоуровневый язык, для гиков, кмк.
я бы искал что-нибудь повыше и попроще.
Рынок одновременно ждет снижения ставки, боится дефолтов и следит за падением нефти. Зачем Минфин готовит корректировку бюджета? S&P 500 и Nasdaq обновляют максимумы: что это — тренд на рост или...
Доброго дня. Обновление рейтинга по акциям.
*****************************************************
*****************************************************...
Май выдался насыщенным на деловые мероприятия, а июнь обещает стать одним из самых активных месяцев года для команды «МГКЛ». 📍 3–6 июня, Санкт-Петербург
Петербургский международный...
💻 Астра: ставка на эффективность добралась до IT сектора 🏦 Высокая ключевая ставка и охлаждение экономики не щадят никого. Даже крупный системообразующий бизнес вынужден менять приоритеты с роста на э...
Тиберий, к алке любовь тоже автомобильная. Ора когда дивы дивные оплатила, как раз жене на машину хватило. Правда, взял француза. Месяц назад пришлось продать. Работают определённые санкции и наши ...
Sergey Gudkov, Это ещё подметил Сергей 29.05.26 в 14:24. Я посмотрел… действительно. Готовятся! Потом хитроопые лили искусственно, видно перезайти по ниже хочется, так фиксации ещё не было. Сейчас ...
PavelBar, волста подаёт на весь объем бумаг, смысла подавать самому нет никакого.Волста будет судиться. Иски от физиков нет смысла подавать только юристов кормить, и пошлины платить.
ВТБ запустит детский банк Специально для детей и подростков от 6 до 14 лет ВТБ запустит онлайн-банк, где ребята смогут самостоятельно следить за своими тратами, учиться копить и повышать финансовую гр...
✅ММВБ С утречка активность покупок, но есть нюанс. Цена попала в зону продаж. Основной сценарий у меня как есть. Альтернативу тоже описывал, а пока жду реакцию продаж.https://t.me/+F6Ka767DDgFhZGQy
...
С самим программированием проблем нет, но в современных технологиях настроить весь стак со всеми связями компонент — та ещё песня.
Помимо 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 — достаточно низкоуровневый язык, для гиков, кмк.
я бы искал что-нибудь повыше и попроще.