Вызов функций С из DLL в скрипте Lua QUIK

Страницы: 1
RSS
Вызов функций С из DLL в скрипте Lua QUIK, информация к размышлению
 
Добрый день,
Всем известно, что есть  библиотека ffi
https://luajit.org/ext_ffi.html
Библиотека FFI позволяет вызывать внешние функции C и использовать структуры данных C из чистого кода Lua.
Библиотека FFI в значительной степени устраняет необходимость написания утомительных ручных привязок Lua / C на C.
Нет необходимости изучать отдельный язык привязки — он анализирует простые объявления C!
Они могут быть вырезаны и вставлены из заголовочных файлов C или справочных руководств.
Это задача связывания больших библиотек без необходимости иметь дело с хрупкими генераторами привязки.
---------------------
Все казалось прекрасно, но...
Библиотека FFI тесно интегрирована в LuaJIT (она недоступна как отдельный модуль).
конечно, не так уж страшно, но...
LuaJIT сделан на ядре Lua5.1 и следовательно для квика не подходит.
------------------------
Написал  собственную библиотеку  для любого ядра Lua, которая делает тоже самое, что и FFI, но быстрее.
В итоге можно загрузить на исполнение любую функцию написанную на С/С++ из любой библиотеки DLL.
И следовательно получить максимальную скорость вычисления любых алгоритмов, не программируя на СИ и не изучая API C for Lua.
----------------------------
Накладные расходы на преобразование параметров в пределах кванта высокоточного таймера (см далее).
---------------------------
Вот пример вызова трех функций из WIN32
------------------------------
QueryPerformanceCounter  - высокоточный таймер квант 0.1 мкс.
SleepEx - функция паузы
MessageBoxA - вывод окна сообщения
пример вызова в луа:
В программе два варианта измерение интервала Sleep в 1 секунду
и вывод результата в окно
Код
-------------sleep и высокоточный таймер вариант 1 -------------------
local x1=rfs("i","QueryPerformanceCounter","Kernel32.dll");
rfs(0,"SleepEx","Kernel32.dll",1000,0);
local x2=rfs("i","QueryPerformanceCounter","Kernel32.dll");


-------------sleep и высокоточный таймер вариант 2 -------------------
local pL,pF=nkcf.gf2L("Kernel32.dll","QueryPerformanceCounter")

local x3=rfs("i",pF);
rfs(0,"SleepEx","Kernel32.dll",1000,0);
local x4=rfs("i",pF);
s="t1="..0.1*(x2-x1).." мкс".." t2="..0.1*(x4-x3).." мкс";
print("            "..s);
rfs(0,"MessageBoxA","User32.dll",0, s, "sleep, timer",1);

а вот картинка результата

 
 
сделал библиотеку , которая позволяет из скрипта  на Lua5.3...5.4  вызвать в отдельных потоках  скрипты на LuaJIT.
Теперь можно запустить в скрипте КВИКА  программный пакет  TORCH ( ФАКЕЛ) .
----------------------------------
Вот пример бесконечного цикла скрипта в LuaJIT с синхронизацией потоков по событиям и вызов функций СИ через библиотеку FFI.
--------------------------------.
В этом примере из потока скрипта Lua5.3 передаются данные в  поток скрипта  LuaJIT через переменную nk1, которая выводится в файл.
Код
local ffi = require("ffi")

ffi.cdef[[
void Sleep(int ms);
long OpenEventA(uint64_t dwDesiredAccess, int bInheritHandle, const char* S);
long WaitForSingleObject( uint64_t hHandle, long  dwMilliseconds);
long CreateEventA(int dwDesiredAccess, int M,int bInheritHandle, const char* S);
int SetEvent(uint64_t hEvent);
int ResetEvent(uint64_t hEvent);
]]
path = "D:/QUIK_SCRIPT/nk_bot/"
Log=io.open("D:/QUIK_SCRIPT/nk_bot/test_jit.log","w")
local event=ffi.C.OpenEventA(0x1f0003,0,"event");
while true do
   local x=ffi.C.WaitForSingleObject(event,-1); --ждем события
   local z=nk1;
   Log:write(os.time()..","..tostring(z).."\n"); Log:flush();
   ffi.C.ResetEvent(event)
--   print(x)
end
 
В качестве ликбеза.
----------------------
LUAJIT - это компилятор с оптимизацией в реальном времени.
---------------------------
Так как любой робот это циклическое повторение расчета алгоритма прогноза по полученным данным, то LuaJIT
выполняет компиляцию и оптимизацию скрипта совместно с виртуальной машиной.
----------------------------
В итоге с каждым новым циклом скрипт работает все быстрее и быстрее, приближаясь по скорости к чистому CИ.
 
Очень интересно, поздравляю с успехом коллега!

Не понимаю, где была инициализирована переменная  nk1?PS: К сожалению, не являюсь программистом на C/C++.
 
Цитата
Станислав написал:
Очень интересно, поздравляю с успехом коллега!

Не понимаю, где была инициализирована переменная  nk1?PS: К сожалению, не являюсь программистом на C/C++.
nk1 инициализирована в другом потоке и скрипте на  Lua5.3.
Применительно к скриту QUIK  - в функции main()
------------------
Т е таким образом в этот поток в скрипт LuaJIT передаются любые параметры из потока со скриптом на Lua5.3
 
 
 
Впечатляет! Т.е улучшение производительности в 20 раз?
В таблице не хватает теста с Lua 5.4.1
 
 
 
 
 
Прикольно,.
Интерпретатор питона версия 3.10 на тесте фибо  в 3 раза медленнее, чем Lua 5.3.  
 
А интерпретатор JavaScript в Node.js? По идее должна быть хорошая производительность.
 
Цитата
Станислав написал:
А интерпретатор JavaScript в Node.js? По идее должна быть хорошая производительность.
Не видел торговых систем на их основе
Подключать к КВИКУ не планирую.
Вполне устраивает Lua, MQL5 и C.
 
Цитата
nikolz написал:
Цитата
Станислав написал:
А интерпретатор JavaScript в Node.js? По идее должна быть хорошая производительность.
Не видел торговых систем на их основе
Подключать к КВИКУ не планирую.
Вполне устраивает Lua, MQL5 и C.
PineScript, TradingView, терминал Тинькофф.  

Да я и не прошу его подключать к квик.
Сейчас молодежь со школы учат программировать на python, наверное, это был бы самый востребованный вариант в будущем. (сам не программирую на нем)
 
Цитата
Станислав написал:
Цитата
nikolz написал:
 
Цитата
Станислав  написал:
А интерпретатор JavaScript в Node.js? По идее должна быть хорошая производительность.
 Не видел торговых систем на их основе
Подключать к КВИКУ не планирую.
Вполне устраивает Lua, MQL5 и C.
PineScript, TradingView, терминал Тинькофф.  

Да я и не прошу его подключать к квик.
Сейчас молодежь со школы учат программировать на python, наверное, это был бы самый востребованный вариант в будущем. (сам не программирую на нем)
Давно торгую на MOCEX и давно использую QUIK.
Как я писал ранее на форуме, QUIK позволяет работать с высокой скоростью.
----------------------------
Если возникнет необходимость в использовании TradingView, то напишу для него.
Пока мне этого не надо.
-----------------------------
Относительно питона.
Тоже кое что использую для разработки встроенного софта IOT.
------------------------------
Проведенный тест показал что его интерпретатор почти в 100 раз медленне C и в 50 раз медленнее LuaJIT.
Прикручивать его с КВИКУ смысла не вижу.
-----------------------------------
В школе учился давно, тогда там программировать не учили, но это мне не мешает программировать сейчас на любом языке, если надо.
Полагаю, что в будущем молодежь освоит все что ей понадобится самостоятельно.
 
и еще
все веб приложения (PineScript,) работают очень медленно по сравнению даже с питоном.
 
для питона тоже есть JIT    
 
Про  Pine Script.
это разработка  TradingView
и скрипты исполняются на их сервере.
т е все что вы напишите - это их собственность
На их сайте для Вас дан ответ на вопрос:
----------------------------
Почему я не должен использовать скрипт Pine?

Основная причина, по которой вы не захотите использовать скрипт Pine, заключается в том, что вы ограничены вселенной TradingView.

Вот некоторые конкретные ограничения:

Данные. Если TradingView не предлагает нужные вам данные, вам не повезло. Конечно, TradingView имеет очень обширную базу данных. Но если ваша стратегия предполагает торговлю на малоизвестных рынках, данные о ценах могут быть недоступны.

Сервис выходит за рамки данных о ценах. Некоторые стратегии включают экономические или статистические данные. TradingView предлагает некоторые данные (в основном данные Quandl) в этой категории, но в настоящее время они ограничены.

Если вы используете альтернативные данные в своей стратегии, вероятно, будет проще использовать другой язык программирования, который обеспечивает большую гибкость.

Внешние библиотеки. Pine Script не подходит, если вы хотите использовать внешние библиотеки для выполнения таких задач, как машинное обучение. Есть лучшие альтернативы, если ваша стратегия основана на использовании науки о данных или других сторонних библиотек.

 
PineScript указал просто как пример. Рано или поздно он начнет выполняться на сторонних серверах как уже произошло с графиком.
Страницы: 1
Читают тему
Наверх