Господа алготрейдеры, подскажите, плиз, простейший пошаговый пример, как подключиться напрямую из qlua к локально установленному MSSQL (включая какую dll куда класть и что писать). Гугл не помогает.

  • обсудить на форуме:
  • Quik Lua
★8
ВНИМАНИЕ! КОММЕНТАРИИ ПЕРВОГО УРОВНЯ В ВОПРОСАХ УПОРЯДОЧИВАЮТСЯ ПО ЧИСЛУ ПЛЮСИКОВ, А НЕ ПО ВРЕМЕНИ ПУБЛИКАЦИИ.
Я не алготрейдер и сам не пробовал еще подключаться к базе :) Но есть проект http://keplerproject.github.io/luasql/ с драйвером для подключения по ODBC. Вроде доки на сайте адекватные.
avatar
nskez, это я уже видел. Не знаю кому как, но для меня — неадекватные доки. Исходники на «c» самому собирать что ли? Установка через какой-то rock — что это? Зачем так сложно? Скачал — не запускается — ошибка доступа. Какого? К чему?
avatar
Turbo Pascal, Насколько я понял rock это менеджер пакета для Lua, как Nuget для C#. Удобно управлять внешними зависимостями через пакетный менеджер. Прям просто ошибка доступа и все? А ODBC конекшен в винде правильно настроен?
avatar
Turbo Pascal, а-ха-ха, узнал себя прям). Бывает вникаешь в какую-то тему, бывает сложно из-за того что сложная информация, или структура — вникаешь через труд. Бывают единичные пробелы — подумываешь. А когда куча вопросов возникает — сложно составить хотя бы простейший каркас, от которого можно оттолкнуться.
avatar
Replikant_mih, угу, вот этот каркас и составляю.
С самим программированием проблем нет, но в современных технологиях настроить весь стак со всеми связями компонент — та ещё песня.
avatar
Turbo Pascal, dll можете скачать с luaforge (http://files.luaforge.net/releases/luasql/luasql/LuaSQL2.0.1). Но обычно dll компилируют самостоятельно, чтобы исключить вероятность внедрения вредоносного кода.

Помимо luasql вам еще нужно подключить сам odbc.dll через package.loadlib.
avatar
nskez, забавно там автора зовут Педро Миллер Рабинович.
прям как Ленин Вольтер Марина Горсес
avatar
А именно MsSql нужен?
Я сделал через Sql Lite
avatar
Eldar Shaymardanov, SQLite, в смысле?
Ок, хотя бы на SQLite пример покажите, буду очень спасибо.
Просто к MSSQL привык за долгие годы. Там и SSRS есть для красивой отчетности.
avatar

--инициализируем
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
avatar
Eldar Shaymardanov, спасибо. По самому коду вопросов нет, я не могу наладить сам факт связи.
Что, откуда взятое, и где должно лежать, чтобы выполнилась без ошибки эта строка:
sqlite3 = require(«lsqlite3»)
avatar
Turbo Pascal, в папке где файл квика лежит должно лежать lsqlite3.dll (это dll для lua) и сам sqlite3.dll
это взял в sqlite sqlite.org/download.html
а вот модуль lsqlite3.dll я уже не помню где брал. может сам скомпилировал с помощью luarocks
avatar
Eldar Shaymardanov, у SQL Lite есть блокировки на запись. Эту базу можно только как тестовую использовать, и то, не для записи котировок.
avatar
day0markets, смотря что вы хотите делать.
Хотите в базе поток сделок — вывозите через odbс в любом виде.
Хотите его сразу обрабатывать, а потом сохранять в БД?! Пожалуйста.
Под каждую задачу есть свое решение. Для меня sqlite достаточен.
avatar
Ниче се вы заморачиваетесь. Интересно, это может устойчиво работать?
Я бы все данные сливал по ODBC в базу. А там бы разгребал какими нибудь хранимыми процедурами. Минимум влазить в проект чужими длл ками и библиотеками
avatar
Андрей К, мне нужны данные по сделкам.
Сейчас скрипт создает файл с данными о сделке (OnTrade), а потом другая программа на C# парсит файл и заполняет БД. Дальнейший анализ уже внутри БД идёт.

Хотелось бы напрямую из квика писать в БД. Но там не просто выгрузка (иначе я бы из квика таблицу сделок бы выгружал), а несколько хитрый алгоритм.
avatar
Turbo Pascal, ага. Это не отменяет моего решения =)) Только нужно чуть более продвинутым в БД быть.

Выкидывать таблицу сделок по ODBC, и в ней на лету с помощью каких нибудь триггеров применять ваш хитры алгоритм обработки данных.
avatar
Андрей К, ну да, пока в этом направлении и двигаюсь.
avatar
Turbo Pascal,  а создать таблицу с этими данными и по ODBC загнать в нужную базу — эти не подходит? 
avatar
А. Г., ну вот к этому и иду. Изначально хотелось на стороне квика предварительную подготовку данных делать.
avatar
Народная примета:

Если трейдер захотел писать данные в СУБД — это к депрессии.
avatar
пишешь обычную программу на любом удобном языке который позволяет делать .dll
подключаешь её в lua
определяешь в dll функцию luaopen_<dllname>, там переписываешь нужную тебе OnTrade с помощью reg_global
дальше спокойно в native коде получаешь данные и делаешь с ними что хочешь и как хочешь.
odbc — достаточно низкоуровневый язык, для гиков, кмк.
я бы искал что-нибудь повыше и попроще.
avatar

Только зарегистрированные и авторизованные пользователи могут оставлять ответы.

Залогиниться

Зарегистрироваться

теги блога Turbo Pascal

....все тэги



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