Serge123 написал: Это не то: GetSystemTimePreciseAsFileTime выдаёт время в UTC (число 100 нс интервалов с 1 января 1601 г. по текущее время). Теперь надо получить из него часы, минуты, секунды и микросекунды с десятыми с часами для локального времени. Я уже почти написал программку для этого перевода, но вроде бы должна быть готовая в какой-нибудь библиотеке для Си...
Вы можете получать время до секунды обычными функциями луа. --------------------- Для получения числа миллисикунд с шагом 0.1 мкс выкладываю функцию на C for Lua, которую надо добавить в DLL для Lua:
Код
static int ms(lua_State *L){
GetSystemTimePreciseAsFileTime(&UTC);
LARGE_INTEGER z; z.LowPart=UTC.dwLowDateTime;
z.HighPart = UTC.dwHighDateTime;
long ns=z.QuadPart%10000000ULL;
double x=((double)ns)/10000.;
lua_pushnumber(L,x);
return 1; }
В результате получим следующее
Код
Tue Jan 9 10:57:47 2024
944.631400
Tue Jan 9 10:57:47 2024
944.667900
Tue Jan 9 10:57:47 2024
944.704500
Tue Jan 9 10:57:47 2024
944.741300
Tue Jan 9 10:57:48 2024
45.804000
Tue Jan 9 10:57:48 2024
45.864200
Tue Jan 9 10:57:48 2024
45.921100
Tue Jan 9 10:57:48 2024
Маркет-мейкер - это вполне видимый игрок. Его задача - сжатие спреда. За это ему платит биржа (читайте документы биржи) Правило такое, если заявка ударит в заявку маркет-мейкера, то биржа заплатит ему.
Добрый день, Вопрос к разработчикам. Можете объяснить, почему выполнение функции CreateDataSource для тиков выполняется в 700 раз медленнее (у меня за 189000 мкс) чем для других интервалов (у меня за 270 мкс)
По ходу дела возник вопрос об организации хранения данных. Сейчас реализовал mapping files для каждого инструмента 3 тайма и 6 параметров свечи. Т е 21 файл на инструмент. Для 150 инструментов получи более 2000 файлов. ----------------------- Прикольно то, что приходится дублировать файлы квика, так как разработчики QUIK "зажали" формат этих файлов.
Продолжаю про робота. ---------- В функции main реализую три режима работы. 1) на основе Onparam. При изменении параметров по инструменту, проверяется изменение цены и если есть, то выполняется алгоритм управления стопами. -------------- 2) По таймеру. Использую таймер OC, который установлен неа срабатывание через 1 минуту. При возникновении этого сигнала, в цикле для каждого инструмента получаем текущее значение свечей, которые передаются в поток из пула потоков ОС для расчета головного блока. Головной блок возвращает сигнал купить/продать. Вот пример лога сигнала таймера и запуск потоков инструментов. NNsec - число торгуемых инструментов Первое число в строке - запаздывание сигнала колбека. Второе число в строке - время прохода функции main.
Serge123 написал: А что конкретно даёт эта OnParam? Я сейчас глянул https://luaq.ru/OnParam.html и не понял, как узнать, какие параметры изменились? Их же вагон с тележкой...
Дает сигнал изменений на рынке. По этому сигналу управляю стопами
Serge123 написал: По картинке робота я не смог понять, насколько он прибылен...
Поясняю. Смотрим первую картинку. Нижнее 3 окно в ней - это график прибыль/убыток за 2023 год. линия зеленая на оси справа показывает положительные 220% -это профит лонг. линия синяя на оси справа показывает положительные 150% - это профит short линия белая на оси справа показывает положительные 370% - это профит long+short. ---------------- На других картинках график профита приведен по месяцам и по дням.
и так далее Это работа скрипта на реально рынке для каждого инструмента делается подписка на три свечи 1 мин 5 мин и 30 мин Всего в КВИКЕ выбрано 350 инструментов и 51 параметр.
продолжаю свой рассказ. Ранее я привел вариант фильтрации бумаг по листингу в колбеке OnParam. Но после тестирования решил все же не делать в колбеках обработки, а передать ее в main и дополнительные потоки из пула потоков ОС. В итоге все колбеки у меня стали близнецами и основные из них выглядят вот так:
Код
function OnOrder(t) tprm[#tprm+1]={2,t}; nkevent.Set(event); end
function OnStopOrder(t) tprm[#tprm+1]={3,t}; nkevent.Set(event); end
function OnTrade(t) tprm[#tprm+1]={4,t}; nkevent.Set(event); end
function OnParam(c,s) tprm[#tprm+1]={14,{c,s}}; nkevent.Set(event); end
function OnTransReply(t) tprm[#tprm+1]={1,t}; nkevent.Set(event); end
Немного о быстродействии. Задержка передачи данных их колбеков в main составляет примерно 30 мкс или 0.00003 сек. Причем в начале работы скрипта создается большая очередь на регистрацию бумаг. Вот пример лога Ntp=116 -- это число бумаг в очереди на регистрацию Первое число 27.9 - это время передачи из колбека в main Второе число 326904 -это время регистрации в мкс Регистрация каждого инструмента выполняется один раз в момент первого изменения его параметров в ТТП
Serge123 написал: А что конкретно даёт эта OnParam? Я сейчас глянул https://luaq.ru/OnParam.html и не понял, как узнать, какие параметры изменились? Их же вагон с тележкой...
Этот колбек я использую как индикатор движения рынка и что конкретно двигалось. На основе этого колбека, как написал рвнее, у меня будут работать стопы.
Serge123 написал: Какой уровень дохода прогнозируется? Сколько %% годовых чистыми от начального депозита?
вот картинка робота на основе индикатора и нейронной сети. Нижний график - это % изменения депозита белый - итого зеленый -лонг синий - шорт на картинках изменение депозита за год, за месяц и за день. Это робот на одну бумагу -сбербанк. Тайм 30 минут. Торгует без плеч и без реинвестирования прибыли. Хочу сделать на произвольное число бумаг и с самообучением. --------------- Планирую от достигнутого.
nikolz написал: Glukator , Самые первые фундаментальные книги для удовлетворения академического интереса: 1. Л.Рабинер, Б.Гоулд. Теория и применение Цифровой обработки сигналов. стр.847 2. Дж.Бендат, А.Пирсол "Прикладной анализ случайных данных" стр. 540
Возможно, дело в годе издания, но в первая книга закончилась на стр. 835, а во второй с. 540 указывает на оглавление. В любом случае ни там, ни там не нашел даже упоминания об однородности/неоднородности случайных процессов ни в оглавлении, ни в предметном указателе.
Цитата
VPM написал: Glukator , Я Вас понял, Вы торгуете методы описанные Владимир , .
Интересный вывод, но нет :) Механика торговли - да, построена по идеям Владимира. Потому что эти идеи - о решении объемных задач малыми ресурсами с минимальными глюками. В остальном же мы, видимо, просто приходим постепенно к сходным решениям - почему бы и нет?
прикольно. стр - это объем книги. Думал что понятно. Для академического интереса надо читать всю книгу, а не только оглавление. Вы же просили книгу, а не ответ на конкретный вопрос по статистическому анализу.
Glukator, Самые первые фундаментальные книги для удовлетворения академического интереса: 1. Л.Рабинер, Б.Гоулд. Теория и применение Цифровой обработки сигналов. стр.847 2. Дж.Бендат, А.Пирсол "Прикладной анализ случайных данных" стр. 540
Serge123 написал: Уточнение: на си я получаю текущее время моего ПК через GetLocalTime, три часа разницы...
я же написал : " в версиях от 5.3 " т е и в 5.3 и 5.4 и дальше - разные. ------------------- Для измерения времени работы напишите две ф-ции на си в DLL типа
квант времени 0.1 мкс. ===================== Я синхронизирую компьютер с сервером точного времени. Погрешность синхронизации не более 10 ms. Можно в скрипт принимать с сервера точного времени. ---------------------- Еще учитывайте, что квант времени задачи в винде это 10 ms. =================== Обработку колбеков выполняю выношу в main и в других потоках из пула потоков. Поэтому все колбеки у меня близнецы:
Код
function OnTransReply(t) tprm[#tprm+1]={1,t}; nkevent.Set(event); end
function OnOrder(t) tprm[#tprm+1]={2,t}; nkevent.Set(event); end
function OnStopOrder(t) tprm[#tprm+1]={3,t}; nkevent.Set(event); end
function OnTrade(t) tprm[#tprm+1]={4,t}; nkevent.Set(event);end
function OnParam(c,s) tprm[#tprm+1]={14,{c,s}}; nkevent.Set(event); end
...
Добрый день, Решил замутить тему о том, как я строю робота. ------------------- В данной теме, если не лень, буду описывать основные блоки нового робота, которого сейчас пишу. -------------- Данный робот обрабатывает информацию по всем инструментам, на которые мы подписываемся в терминале QUIK. --------------------- В этом роботе, назовем его для определенности Петя (Вася у меня был 10 лет назад), выделяю два основных блока(мозга)- спинной и головной. ----------------- Спинной блок отвечает за обработку , которую необходимо выполнять для получения и отправки информации на биржу или брокеру. К этому блоку относится обработка информации о сделках и заявках. Спинной блок занимается рутинной работой, без которой невозможно торговать. --------------- Головной блок занимается управлением торговлей. Он осуществляет прогноз движения рынка и формирование сигналов покупки/продажи. Головной блок - это творческая часть робота, которая собственно либо сливает депозит, либо его увеличивает. ========== Спинной блок. Здесь реализуется следующие блоки обработки: 1. OnTransReply - транзакций 2. OnStopOrder - информации о выставленных стоп-заявках 3. OnOrder - информации о выставленных заявок 4. OnTrade - информации о совершенных своих сделках 5. OnParam -информации об изменении состояния подписанных в терминале QUIK инструментов -------------- OnParam Пример реализации функции:
Код
function OnParam(c,s)
if TLL and c~="SPBFUT" and c~="CETS" then
local Lev=tonumber(getParamEx(c,s,"LISTLEVEL").param_value);
if Lev>0 then
local i=1; while #TLL>=i do if Lev==TLL[i] then break; end i=i+1 end
if i>#TLL then return; end
end
end
local t={14,c,s}; tprm[#tprm+1]=t;--if 2>#tprm then nkevent.Set(event);
end
Это основная функция, которая создает события event при изменении параметров любого из инструментов. Эти события обрабатываются в функции main, которая выполняется в отдельном потоке. -------------------------- В данной реализации OnParam добавлено условие (оператор if) фильтрации инструментов по листингу. -------------------- Можно добавить и другие фильтры. Например, можно задать список торгуемых инструментов из числа всех подписанных. В этом случае робот будет торговать и отслеживать лишь списочные инструменты. ----------------- В роботе реализованы три механизма событий, которые вызывают функцию main. событие №1 OnParam. По этому событию выполняется регистрация параметров инструмента и подписка на свечи или тики для данного инструмента. Кроме того, по этому сигналу обрабатываются стоп-заявки и заявки. ----------------------------------- событие №2 таймер интервала свечей. Например, если головной блок использует свечи с интервалом 1 минута, то таймер выдает сигнал каждую минуту и по этому сигналу запускается для каждого торгуемого инструмента отдельный поток из пула потоков, в котором работает головной блок. ---------------------------------- событие №3 . Так называемый Watchdog -"сторожевой пес". Таймер, который выдает сигнал, если нет события №1 например в течении 30 секунд. Это событие означает, что что-то не так и надо предпринимать соответствующие меры. ================== Продолжение следует...
AlxE написал: Здравствуйте. Есть ли возможность получить последние котировки в терминале вне рабочие часы биржи? Иногда нужно посмотреть рано утром, а выпрыгивает окно "Соединение установить не удалось" и терминал открывается с неактуальными котировкам.
Если сервер брокера не работает, то можно у финама посмотреть.
Serge123 написал: > Робот торгует на моём реальном счёте без вмешательств на удалённом сервере VPS. Результатом работы доволен.
Вот, смотрите :
Михаил Понамаренко, Результаты интересные, но просьба пояснить график на видео. ------------------------- 1) Самая последняя точка на графике. Падение с 85 млн до 64 млн. Верно? А то плохо видно. Т е допустимая просадка до 30% или больше? ---------------------- 2) Вы говорите о торговле за последний год, а на графике с 2017. Верно? ----------------------- 3) А что там написано что период с 2017 по 2018? ----------------------------- 4) Указана доходность 158% к среднему капиталу. Средний капитал указан 25 млн. А на графике 65 млн. Как посчитана доходность ? ------------- Можете пояснить на чем торгуете и какие в среднем результаты на сделку. ---------------- Если можно покажите графики по годам. ------------------ Спасибо.
nikolz, Не знаю в чем я здесь ошибся, это русский перевод текста с английского языка, все что нужно здесь для понимания, это читать начиная с конца. Например если на писали на ангельском "Все хорошо", то понимать нужно "Хорошо все".
Поясняю в чем Вы ошиблись. ----------------------- Первое. В луа корауны - это обычная функция у которой сделан отдельный стек. Для этого используется функция API C lua_newthread, Но все коорауны в одном потоке ОС. Слово "поток" в Lua - это просто не удачное название . Например, есть мороженое 48 коп. Но 48 коп - это не цена, а название. Так и со словом поток в луа. ------------------- Второе. Понятие "задача" относится к скрипту - т е к коду и данным - т е к тому "что вычислить", а понятие "поток" - относится к вычислителю, т е процессору(ядру, эмулятору АЛУ и регистрам процессора) - т.е. к тому "чем вычислять". ------------------------ Т е задача и поток = это две совершенно разные сущности. ---------------------- Поэтому "многозадачность" и многопоточность" это как "красное" и "кислое" - две большие разности.
VPM написал: Nikolay, Ну давайте сначала, вот от "метров":
"В многозадачном алгоритме исполнителей несколько и у каждого из них - свое состояние и свой путь в графе состояний. Многопоточные алгоритмы - просто другое название для многозадачных."
"В Lua реализована "совместная многопоточность", когда потоки явно уступают выполнение друг другу и сохраняют состояние до следующего момента, когда выполнение столь же явно будет передано им снова".
"Только явная передача управление и сохранение состояния. Это логическая многозадачность - на самом деле в любой момент времени выполняется только один поток. Просто их несколько и они переключаются между собой".
Наверняка можно сделать, только зачем если уже есть, и сделано классно.
Вы очереди перебираете в цикле, цикл идет с какой то определенной задержкой на исполнение.
Мой пример это выделение какой то задачи в коде, которую нужно выполнять с максимальной скоростью. Ну к примеру пронестись по тикам, и снова вернуться к аналитике на медленных скоростях и здесь скорости имеют значения.
Я не утверждаю что это единственное использование каротин, но согласитесь видь классно! А главное можно работать со скоростью исполнения скрипта! ::
Вы опять ошибаетесь. Многопоточная и многозадачная - это две большие разницы. ---------------- Потоки нужны для параллельного исполнения задач, что возможно лишь при наличии нескольких процессоров или ядер. Многозадачность реализуется и на одном ядре и зависит от операционной системы.
Добрый день, Вопрос к разработчикам версия 11.0.1.3 После экспериментов с открытием множества потоков На демо сервере при очередном запуске QUIK получаем это: и после этого QUIK выгружается. Есть ли способ исправить и запустить QUIK без установки заново?
nikolz написал: Поэтому коруунды ничего не ускоряют.
А никто не утверждает что они что ускоряют, речь идет о разделении скорости исполнения кода на две части. Там где нужна максимальная - исполнения ордера, и где можно раз в секунду.
Не понял. Что значит "разделении скорости исполнения кода на две части"? И зачем Вы разделяете СКОРОСТЬ? Как Вы разделяете скорость и в чем это выражается?
nikolz написал: Но корунды имеют накладные расходы. Поэтому вместо выигрыша может быть проигрыш.
Это совсем не понятно? Я привожу конкретный пример реализации,
Цитата
VPM написал: В функции Robot получаем информацию от терминала обрабатываем ее формируем правило торговой системы,именно здесь работает задержка основного цикла sleep()!При вызове функции Trade() прерывается код функции Pobot(), идет исполнение сопрограммы со всей той скорость на что способна lua и позволяет система!
Где тут проигрыш?
Попробую объяснить еще раз. функция main работает в единственном потоке и в единственном стайке, который в этом потоке создан. Поэтому, чтобы Вы не запустили на луа внутри main, это будет исполняться в потоке main. Т е все коруунды исполняются в одном потоке ОС т. е последовательно на одном ядре процессора. ------------------- Потери будут на затратах времени на сохранение состояния коруунды и на возобновления ее работы. Коруунды позволяют исключить простои потока если у Вас выполняется например ввод данных, которые ждет исполняемая функция. Вот во время этого ожидания можно запустить другую функцию. Но в скриптах КВИК нет таких ааодов выводов. Поэтому коруунды ничего не ускоряют. А затраты времени на сохранение состояний коруунды и вновь его восстановление - это и есть пустая трата времени потока. -------------------- О псевдо поточности коруундов можно почитать в учебниках по программированию и документации по Луа.
и еще... Фактически весть механизм коррутин с большим быстродействием реализуется через один EVENT и оператор if. При этом скорость переключения составляет микросекунды.
Вы либо умолчали, либо заблуждаетесь. --------------------- Корутина - это псевдо многопоточность. т е исполняются они на одной VMLua и в одном потоке OC. -------------------- Они дают выигрыш если у вас в скрипте есть синхронный ввод/вывод с медленных устройств. В скриптах КВИКА таких медленных синхронных вводов выводов нет. Но корунды имеют накладные расходы. Поэтому вместо выигрыша может быть проигрыш.
МихаилСМ написал: nikolz, изучать для этого незнакомый мне язык, с непонятной мне логикой, не совсем комфортно. Потрачу кучу времени и сил для получения результата, которого я могу добиться заплатив денежку. Не вижу смысла. Так же не вижу смысла в вашем ответе. Не нравится - проходим мимо.
Это не вопрос, а мнение. Возможно задача простая, но возможно и сложная. Все зависит от технического задания. ---------------------------- Вы получите реальное предложение, если без поверхностных суждений о сложности не решенной задачи, выложите тех задание с указанием сроков и стоимости, и тестов для оценки правильности решения. ---------------- Убежден, что у дилетантов все задачи простые. ------------------ Реально сложность задачи можно узнать лишь после ее решения.
Не перестаю удивляться подобной формулировки вопроса. Казалось бы, если задача простая, то в чем проблема написать самому? Если не могешь , то как определил, что задача простая?
function SMA(i,P,x,y)
if i==1 then y=x;
else
local i1=i-1;
local y=V[i1] or 0;
if i<=P then y=y+i1*x/i;else y=y+(y-x)/P; end
end
return y;
end
local t=os.clock();
local N=256;
local y=0;
local A=100.
local P=128
local W=2*3.14/N
for i=1,1000000 do
local i1=i-1;
local x=A*math.sin(W*i);
y=SMA(i,P,x,y);
-- print(i,x,y);
end
print(os.clock()-t);
Kolossi написал: Поправил main() что бы отсечь возможные варианты:
Код
function main ()
message ( "Script's start local time: " .. os.date ( "%d-%b-%Y %X" ))
SessionDate = getTradeDate ().date
message ( "Session date " .. SessionDate)
ParamRequest(p_classcode,ticker,"TRADINGSTATUS")
--
while is_run = = true do
t_status = tonumber( getParamEx 2( "TQBR" ,ticker, "TRADINGSTATUS" ).param_value) -- текущий статус
if status~ = t_status then -- изменение статуса сессии
status = t_status
if status = = 3 or status = = 1 then
if not ds or type(ds)~ = "table" then
ds,error_desc = CreateDataSource ( "TQBR" , ticker, INTERVAL_TICK)
if error_desc~ = nil and error_desc~ = "" then message ( " Source error==>" .. error_desc) end
local nn = 0
while ds: Size () < 5 and nn < 100 do
sleep ( 100 ) nn = nn + 1
end
ds: SetEmptyCallback ()
message ( os.date ( " %X" ) .. " Ready. Session status:" .. tostring(status) .. " Data size:" .. tostring(ds: Size ()))
end
while n < 10 and status = = 1 do
local size = ds: Size ()
if size~ = old_size then
message (tostring(n) .. os.date ( " %X" ) .. " Get data. Session status:" .. tostring(status) .. " Data size:" .. tostring(ds: Size ()))
old_size = size
n = n + 1
end
sleep ( 50 )
end
end
end
sleep ( 100 )
end
end
Ничего не изменилось, данные поступают только после перезапуска скрипта.
подтверждаю, проверялось много раз и не только мною.
nikolz написал: То что тики подписываются со второго пинка было указано давно, но воз и ныне там.
Наткнулся на интересную фишку: если тики не едут после подписки при открытой сессии, то подписка на другой тикер даже в другом скрипте толкает все подписки и они приходят в чувство.
именно в другом скрипте, либо перезапуск этого же, что как бы запуск другого скрипта.
Serge123 написал: Насколько я понял, lua_tonumber и lua_tointeger это одно и то же и ничего она не преобразовывает, просто переписывает с вершины стека в заданную переменную 8 байтов?
И ещё хотел спросить: неужели с рублями и копейками работают в формате double? В этом случае при расчётах может накапливаться ошибка. Как я помню, в фин. расчётах рубли и копейки хранили в виде строк, напр. "123.456000".
lua_tonumber и lua_tointeger в версиях от 5.3 - это разные форматы. double и long.
Кстати, хотел найти работающий пример для разбора таблиц в длл, взял с этого сайта код quikluacsharp.ru/qlua-c-cpp-csharp/primer-realizatsii-funktsii-obratnogo-vyzova-onalltrade-vnutri-dll/ а там полная ерунда: вместо lua_pushcfunction написано lua_pushcclosure. Да и luaL_openlib уже устарела и здесь не нужен также и новый её вариант для луа 5.4. Потерял много времени...
Serge123 написал: Я освоил qlua + dll на C, теперь хочется попробовать написать торг. программку, чтобы посмотреть, на её работу. Имеются какие-то дармовые "торговые роботы" и их заготовки, которые транслятор не хочет транслировать (и есть раздутые до безобразия горы кода в районе гитхаба), не хочется тратить время, чтобы их понять, они, по-моему, делаются по принципу "на, тебе, боже, что мне негоже", а платные "роботы" - по принципу "на, тебе, платного, боже, что мне негоже". К примеру, в этой ветке кто-то опубликовал "нейросеть на луа", при этом из диалога непонятно, что это такое и стоит ли на это тратить время.
У меня пока возле головы вертятся такие возможные "стратегии" для программы: - слежение за массой всякой макулатуры и определение начала роста цены, покупка на деньги, которые не жалко, и определение, когда это лучше продать; - определение в начале торгов, что с какой-то радости начнут покупать/продавать, и воспользоваться этим, пока цена не ушла далеко; - ловля кратковременной просадки цены, когда происходит крупная продажа (напр., кто-то хочет выйти из какой-то бумаги, перевести деньги в доллары и слинять из этой страны, пока не поздно).
Кто-то может подсказать (хотя бы в приват) что-то стоящее "отцу русской демократии", чьи пенсии летят по * , коптят, и потом где-то взрываются склады террористов?..
Возможно ответ на эти вопросы поможет Вам: 1) Почему стратегии, описанные в популярных книжках Гуру рынков никем не повторены. 2) Почему победители "Голодных игр" так и остаются там, а не играют в реальности. 3) Почему удачными игроками являются лишь те, кто играет на чужие деньги или учит играть буратин.
Надо обрабатывать как Reset, т е аналогично начальному соединению с сервером. Можно при этом учитывать учитывать принятые данные, чтобы не грузить все. Ситуация штатная. Ошибка, если не реализована обработка такого события.
Немного о новом языке Terra на основе Lua --------------------- Мы используем популярный скриптовый язык Lua для поэтапного выполнения нового низкоуровневого языка Terra. Пользователи могут реализовать оптимизацию на языке высокого уровня и использовать встроенные конструкции для генерации и выполнения высокопроизводительного кода Terra. Для упрощения метапрограммирования Lua и Terra используют одну и ту же лексическую среду, но для обеспечения производительности код Terra может выполняться независимо от среды выполнения Lua. Мы оцениваем наш дизайн, полностью переосмысливая существующие многоязычные системы в Terra. Наш автонастройщик на базе Terra для подпрограмм BLAS выполняет в пределах 20% от ATLAS, а наш DSL для трафаретных вычислений выполняется в 2,3 раза быстрее, чем рукописный C. ------------------------- Мы представляем экзотипы, определяемые пользователем типы, которые сочетают гибкость метаобъектных протоколов в динамически типизированных языках с контролем производительности языков низкого уровня. Подобно объектам в динамических языках, экзотипы определяются программно во время выполнения, позволяя вести себя на основе внешних данных, таких как схема базы данных. Для достижения высокой производительности мы используем поэтапное программирование для определения поведения экзотипа на этапе компиляции во время выполнения и реализуем экзотипы на Terra, низкоуровневом поэтапном языке программирования.
Мы покажем, как конструкторы exotype создают и используют exotypes для реализации высокопроизводительных библиотек для сериализации, динамической сборки, автоматического дифференцирования и вероятностного программирования. Каждый экзотип обеспечивает выразительность, аналогичную библиотекам, написанным на языках с динамической типизацией, но реализует оптимизации, которые превосходят производительность существующих библиотек, написанных на низкоуровневых языках со статической типизацией. Хотя каждая реализация значительно короче, наша библиотека сериализации в 11 раз быстрее, чем Kryo, а наш динамический ассемблер в 3-20 раз быстрее, чем ассемблер Chrome от Google.
Cyber написал: LuaJIT это ваша разработка? И какой от него смысл, если тормозит сам квик?
JIT компиляция это современные методы оптимизации скриптов во время их выполнения. Именно это и позволяет ускорить выполнения скрипта на порядок. Про luaJit можете посмотреть здесь: https://luajit.org/ext_ffi_semantics.html#callback ------------------------- Смысл в том, что в текущей реализации QUIK Lua обработка сделок по инструментам происходит последовательно. ------------------------ Тормозит отображение графиков и таблиц, вычисление индикаторов на луа и последовательная обработка колбеков. --------------- Вот эти тормоза и убираются путем создания многопоточной обработки на основе jit компиляторов. Если у Вас n ядер, то потенциально можно ускорить вычисления примерно в 10*n раз. =============== Разные точки на графиках - это различные тесты, на которых тестировались языки. Вот их список: