Блог им. 3Qu

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

    • 11 мая 2021, 21:33
    • |
    • 3Qu
  • Еще
Я, вроде, уже писал подобный пост. Давно. Но, новое — хорошо забытое старое.
Очень многие неплохо владеют основами программирования, но написать 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.х, если у вас есть соответствующий порт,  даст примерно аналогичную скорость, и тогда делать вообще ничего не надо.
  • обсудить на форуме:
  • Quik Lua
★18
29 комментариев
Нахера? Когда есть API у брокеров. 
Dancing Orange Hyena, уже ответил в тексте топика — многие работают с Quik-Lua, а с API, даже если более-менее знаешь программирование, еще и разбираться надо, и далеко не всем это доступно. А с файловым обменом это делается в три прихлопа. Простой, и, главное, общедоступный способ обмена данными.
avatar
3Qu, согласен на 100% (если это не 10-100 раз в секунду)

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

С уважением
Мальчик Buybuy, я часто использую БД SQLite в памяти. Точнее, почти в памяти — при соответствующих настройках pragma БД становится почти в памяти. Скорость запись/чтение строки 5 мс.
avatar
Dancing Orange Hyena, дайте пример нормального API.
Я пока слышал только у тинькова, но там это чудовищно медленно и криво.
Быстрее через Квик.
Это не считая в целом ограниченности торговли через Тиньков (малое кол-во инструментов)
avatar
Дедал,  https://alor.dev/docs
Dancing Orange Hyena, круто! Надо будет посмотреть, это намного лучше костыльных подключений через квик
avatar
Dancing Orange Hyena,  api же есть вроде только у алор и тинькова или я ошибаюсь.
avatar
ANTI_Finsov, у финама транзак API.
Спасибо, я как раз передачу данных через файлы реализовываю как пилотный проект. Только я смотрю в строну tri-файлов. Нашел в сети коннектор 10-ти летней давности, там excel срастили с квиком. Довольно-таки бодрая штукенция.
avatar
Устройство 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.
Для конкурентной записи в одну область файла из разных потоков нужна синхронизация критическими секциями. Из разных процессов — мьютексами.
Если запись в разные области — синхронизация не нужна.
Rostislav Kudryashov, у нас уже есть мьютекс — файл flag.ddd. Именно эту роль он и выполняет. Вы что-то недочитали.)
avatar
Почему бы не запихнуть программу в длл? Или она не на с++?

Или сокеты не проще?
avatar
:), либо вы шутите, либо что-то не понимаете про SQLite.
avatar
Отличный вариант для начала)). Кстати скорость обмена приемлимая. В пределах 1 сек происходит запись файла в qlua, получение данных из файла, парсинг, обсчёт, выгрузка данных в файл, загрузка в qlua и выставление заявки. Причем без использования ram диска. Для неторопливого бота вполне приемлимо. Единственное если есть какие-то коитичные данные, например состояние бота и его параметров, то лучше дублировать запись навсякий случай по мимо ram. Ещё как вариант рассматриваю возможность использования SQLite in memory. Вроде тоже должна взлететь, и это также не сильно сложно.
avatar
zam, не только в memory. Уже писал в комменте, что при соответствующих настройках pragma SQLite дает скорость сравнимую с БД в memory.
Имеем и файл БД, и скорость. Но здесь для связи уже DLL нужна.
avatar
Вроде есть библиотека для lua по SQLite. Правда не знаю работает ли она в Квике. Если не работает, то конечно печально и тогда нужно самому dll делать. Тогда конечно для начинающих это не катит)
avatar
zam, я пробовал какие-то либы для Луа, еще под 3-ку.  Не ставятся они на комп. В причинах не разбирался. Проще ДЛЛ написать. Да и сами Луа либы никаких проблем в целом не решают.
avatar
3Qu, Понятно. Печалька ((
avatar
zam, Собственно, никакой печальки.) У меня вся система в ДЛЛ. Связь с Луа малая часть, всего несколько функций. Непосредственно, связь Луа -> БД и не оч нужна.
avatar
3Qu, Да за Вас то печальки нет) просто если уже человек сам длл может написать, то уже у него нет печали с квиком))
avatar
zam, это, да. Под С++ шаблон ДЛЛ под VC 2017 для связи с Луа есть в моих топиках. Используйте, если с С++ работаете.
avatar
помнится в студенческую бытность в начале нулевых в вычислительном центре давали 5 Мб на диске под файлы (всякие там паскалики и прочая ересть), а в кваку хотелось поиграть… так вот, играть в первую до максимум урезанную кваку (архив около 10 Мб!!!) приходилось заливать на RAM и играть, играть, играть ))))
lua может работать с named pipe? 
avatar
bwc, из коробки, нет. Слышал, что, вроде, есть библиотека. Но достоверно не знаю.
В принципе, Ram disk, это примерно тоже самое.
Для современных компов проще USB 3.x флешки уже ничего и не надо придумывать.
avatar
3Qu, идея в том, чтобы снаружи создать named pipe и в lua открыть его как обычный файл с именем "\\?\%my-pipe%", т. е. без дополнительных модулей.
На счет файлов — есть некоторые опасения из-за возможной буферизации ввода-вывода.
Flash — не очень из-за ограниченного ресурса записи.
avatar
Нахрена делать очередной велосипед?
Нужен доступ к Quik из С# есть github.com/finsight/QUIKSharp
которую уже куча народу использует
Нужен доступ из Python есть новая => github.com/cia76/QuikPy  которая основана на проекте QUIKSharp
avatar
Sergeyka, есть ещё на Java тоже самое.
Я пользовался.
В целом — работает. Но медленно. Издержки где-то по 20мс на вызов. И ещё не масштабируется, ТК необходимо синхронизировать вызовы в 1 поток.

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

теги блога 3Qu

....все тэги



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