3Qu
3Qu личный блог
11 мая 2021, 21:33

Связь Lua -> ваша программа. RAM Disk.

Я, вроде, уже писал подобный пост. Давно. Но, новое — хорошо забытое старое.
Очень многие неплохо владеют основами программирования, но написать DLL, связь через TCP или что-то другое для экспорта-импорта в Lua — это достаточно сложная процедура, и требует дополнительных знаний и много времени. Однако, если такую связь как-то по простому реализовать, то решились бы многие проблемы обмена данными с C#, Python и другими средами, и не надо вникать во всяческие C-API и прочие премудрости.
Однако, есть достаточно простой и доступный способ — обмен данными через файлы. Например, так:
1. программа Lua пишет строку (строки) данных в формате CSV в файл data.csv,
2. программа Lua создает пустой файл flag.ddd,
3. ваша программа проверяет наличие файла flag.ddd, что означает, что данные готовы к чтению,
4. при наличии файла flag.ddd программа читает данные файла data.csv и удаляет файл flag.ddd,
5. программа Lua проверяет наличие файла flag.ddd, и если этот файл отсутствует пишет строку (строки) данных в файл data.csv (см. п.1)
При обратном обмене происходит все тоже самое, только имена файлов другие.
Вот и весь обмен данными вашей программы с Lua.
Да, скажите вы, но файловый обмен оч медленный.
Да, это так, но не совсем. Мы можем организовать в памяти компьютера небольшой диск (RAM Disk), скажем, мегабайт 20, или больше, если вам недостаточно. И обмен файлами станет оч быстрым. По тестам на хорошем компьютере скорость обмена с RAM Disk — где-то до 1-2 ГБ/c.
Одно из решений для организации диска в памяти компьютера: официальный сайт AMD - http://www.radeonramdisk.com/software_downloads.php, качаем бесплатную версию, устанавливаем, выделяем нужный объем памяти под сам RAM Disk. Работаем. Все.
Есть и другие варианты RAM дисков от других разработчиков, но это уже сами найдете.

PS Забыл добавить. Флешка с USB 3.х, если у вас есть соответствующий порт,  даст примерно аналогичную скорость, и тогда делать вообще ничего не надо.
29 Комментариев
  • Нахера? Когда есть API у брокеров. 
      • Мальчик buybuy
        11 мая 2021, 22:11
        3Qu, согласен на 100% (если это не 10-100 раз в секунду)

        Но все же кошернее читать/писать логи, чем создавать и удалять файлы. Чуть сложнее, зато проще ашипки отлавливать.

        С уважением
    • Дедал
      12 мая 2021, 08:19
      Dancing Orange Hyena, дайте пример нормального API.
      Я пока слышал только у тинькова, но там это чудовищно медленно и криво.
      Быстрее через Квик.
      Это не считая в целом ограниченности торговли через Тиньков (малое кол-во инструментов)
    • ANTI_Finsov
      12 мая 2021, 10:37
      Dancing Orange Hyena,  api же есть вроде только у алор и тинькова или я ошибаюсь.
  • Serj90
    11 мая 2021, 22:17
    Спасибо, я как раз передачу данных через файлы реализовываю как пилотный проект. Только я смотрю в строну tri-файлов. Нашел в сети коннектор 10-ти летней давности, там excel срастили с квиком. Довольно-таки бодрая штукенция.
  • Rostislav Kudryashov
    11 мая 2021, 22:28
    Устройство RAM диска на своём ПК — это своего рода диверсия.
    Специально для подобных целей в Windows предусмотрены «Файлы данных, проецируемые в память». Джеффри Рихтер, Кристоф Назар «Windows via C/C++. Программирование на языке Visual C++» стр.550. Или Jeffrey Richter and Christophe Nasarre «Windows via C/C++. 5 ed» Chapter 17: Memory-Mapped Files.
    Для конкурентной записи в одну область файла из разных потоков нужна синхронизация критическими секциями. Из разных процессов — мьютексами.
    Если запись в разные области — синхронизация не нужна.
  • iddqd3n
    11 мая 2021, 22:57
    Почему бы не запихнуть программу в длл? Или она не на с++?

    Или сокеты не проще?
  • zam
    11 мая 2021, 23:19
    Отличный вариант для начала)). Кстати скорость обмена приемлимая. В пределах 1 сек происходит запись файла в qlua, получение данных из файла, парсинг, обсчёт, выгрузка данных в файл, загрузка в qlua и выставление заявки. Причем без использования ram диска. Для неторопливого бота вполне приемлимо. Единственное если есть какие-то коитичные данные, например состояние бота и его параметров, то лучше дублировать запись навсякий случай по мимо ram. Ещё как вариант рассматриваю возможность использования SQLite in memory. Вроде тоже должна взлететь, и это также не сильно сложно.
      • zam
        11 мая 2021, 23:32
        Вроде есть библиотека для lua по SQLite. Правда не знаю работает ли она в Квике. Если не работает, то конечно печально и тогда нужно самому dll делать. Тогда конечно для начинающих это не катит)
          • zam
            11 мая 2021, 23:42
            3Qu, Понятно. Печалька ((
              • zam
                11 мая 2021, 23:56
                3Qu, Да за Вас то печальки нет) просто если уже человек сам длл может написать, то уже у него нет печали с квиком))
  • Йонатан Берсон
    11 мая 2021, 23:25
    помнится в студенческую бытность в начале нулевых в вычислительном центре давали 5 Мб на диске под файлы (всякие там паскалики и прочая ересть), а в кваку хотелось поиграть… так вот, играть в первую до максимум урезанную кваку (архив около 10 Мб!!!) приходилось заливать на RAM и играть, играть, играть ))))
  • bwc
    12 мая 2021, 01:13
    lua может работать с named pipe? 
      • bwc
        12 мая 2021, 09:01
        3Qu, идея в том, чтобы снаружи создать named pipe и в lua открыть его как обычный файл с именем "\\?\%my-pipe%", т. е. без дополнительных модулей.
        На счет файлов — есть некоторые опасения из-за возможной буферизации ввода-вывода.
        Flash — не очень из-за ограниченного ресурса записи.
  • Beach Bunny
    12 мая 2021, 07:14
    Нахрена делать очередной велосипед?
    Нужен доступ к Quik из С# есть github.com/finsight/QUIKSharp
    которую уже куча народу использует
    Нужен доступ из Python есть новая => github.com/cia76/QuikPy  которая основана на проекте QUIKSharp
  • Дедал
    12 мая 2021, 08:28
    Sergeyka, есть ещё на Java тоже самое.
    Я пользовался.
    В целом — работает. Но медленно. Издержки где-то по 20мс на вызов. И ещё не масштабируется, ТК необходимо синхронизировать вызовы в 1 поток.

    Кстати рекомендую Java, как то это стандарт на фин рынке. Почти все библиотеки Java. Например QuikFixJ. Плюс в Java намного больше всего для низкоуровневой оптимизации

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

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