Turbo Pascal
Turbo Pascal Ответы на вопросы
17 апреля 2019, 09:13

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

Господа алготрейдеры, подскажите, плиз, простейший пошаговый пример, как подключиться напрямую из qlua к локально установленному MSSQL (включая какую dll куда класть и что писать). Гугл не помогает.
22 Комментария
  • nskez
    17 апреля 2019, 09:42
    Я не алготрейдер и сам не пробовал еще подключаться к базе :) Но есть проект http://keplerproject.github.io/luasql/ с драйвером для подключения по ODBC. Вроде доки на сайте адекватные.
      • nskez
        17 апреля 2019, 10:59
        Turbo Pascal, Насколько я понял rock это менеджер пакета для Lua, как Nuget для C#. Удобно управлять внешними зависимостями через пакетный менеджер. Прям просто ошибка доступа и все? А ODBC конекшен в винде правильно настроен?
      • Replikant_mih
        17 апреля 2019, 11:09
        Turbo Pascal, а-ха-ха, узнал себя прям). Бывает вникаешь в какую-то тему, бывает сложно из-за того что сложная информация, или структура — вникаешь через труд. Бывают единичные пробелы — подумываешь. А когда куча вопросов возникает — сложно составить хотя бы простейший каркас, от которого можно оттолкнуться.
      • Aphelion
        17 апреля 2019, 11:33
        Turbo Pascal, dll можете скачать с luaforge (http://files.luaforge.net/releases/luasql/luasql/LuaSQL2.0.1). Но обычно dll компилируют самостоятельно, чтобы исключить вероятность внедрения вредоносного кода.

        Помимо luasql вам еще нужно подключить сам odbc.dll через package.loadlib.
    • П М
      17 апреля 2019, 22:04
      nskez, забавно там автора зовут Педро Миллер Рабинович.
      прям как Ленин Вольтер Марина Горсес
  • Eldar Shaymardanov
    17 апреля 2019, 10:37
    А именно MsSql нужен?
    Я сделал через Sql Lite
      • Eldar Shaymardanov
        17 апреля 2019, 12:39

        --инициализируем
        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
          • Eldar Shaymardanov
            17 апреля 2019, 12:52
            Turbo Pascal, в папке где файл квика лежит должно лежать lsqlite3.dll (это dll для lua) и сам sqlite3.dll
            это взял в sqlite sqlite.org/download.html
            а вот модуль lsqlite3.dll я уже не помню где брал. может сам скомпилировал с помощью luarocks
    • day0markets.ru
      17 апреля 2019, 18:34
      Eldar Shaymardanov, у SQL Lite есть блокировки на запись. Эту базу можно только как тестовую использовать, и то, не для записи котировок.
      • Eldar Shaymardanov
        17 апреля 2019, 20:02
        day0markets, смотря что вы хотите делать.
        Хотите в базе поток сделок — вывозите через odbс в любом виде.
        Хотите его сразу обрабатывать, а потом сохранять в БД?! Пожалуйста.
        Под каждую задачу есть свое решение. Для меня sqlite достаточен.
  • Андрей К
    17 апреля 2019, 11:41
    Ниче се вы заморачиваетесь. Интересно, это может устойчиво работать?
    Я бы все данные сливал по ODBC в базу. А там бы разгребал какими нибудь хранимыми процедурами. Минимум влазить в проект чужими длл ками и библиотеками
      • Андрей К
        17 апреля 2019, 12:10
        Turbo Pascal, ага. Это не отменяет моего решения =)) Только нужно чуть более продвинутым в БД быть.

        Выкидывать таблицу сделок по ODBC, и в ней на лету с помощью каких нибудь триггеров применять ваш хитры алгоритм обработки данных.
      • А. Г.
        17 апреля 2019, 22:39
        Turbo Pascal,  а создать таблицу с этими данными и по ODBC загнать в нужную базу — эти не подходит? 
  • Сергей Симонов
    17 апреля 2019, 21:32
    Народная примета:

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

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн