Зачитался, я тут на днях про
робастную регрессию, и очень мне захотелось «пощупать» этого зверя хоть в каком нибудь виде на графике в Квике.
Выбрал наипростейшую — "
Оценочная функция Тейла – Сена"
Эта оценочная функция может быть эффективно вычислена и она нечувствительна к выбросам. Она может быть существенно более точна, чем неробастный метод наименьших квадратов для несимметричных и гетероскедастичных данных и хорошо конкурирует с неробастным методом наименьших квадратов даже для нормально распределенных данных в терминах статистической мощности.
Метод признан «наиболее популярной непараметрической техникой оценки линейного тренда»
Сказано — сделано.
Сваял регрессию по функция Тейла – Сена на
QLUA.
Заодно медианные и квартильные отклонения...
УВЫ!
Скорость работы оставляла желать лучшего — на периоде больше
200 Квик начинал тормозить, а если подцепить на десяток разных инструментов просто умирал.
Проблема не нова — расчет медианного значения это сортировка, а с большими, множественными и постоянными сортировками LUA-интерпретатор не справляется.
УРА!
"
Пионеры любят преодолевать трудности"
Вспомнил детство золотое, прочитал
LUA API, потыкался пару деньков, и в итоге засунул все расчёты в
dll, а в lua файле из важного осталось лишь:
function Init()
package.path = ""
package.cpath = getScriptPath().. "\\".."Robust.dll"
require "Robust"
Robust.InitGraf()
return 5
end
function OnCalculate(index)
return Robust.CALC(index,Settings.period)
end
В общем спрятал всю математику, обращение к свечкам графика, и прочие мелочи.
ИТОГИ и ВЫВОДЫ.
Скорость и производительность выросла приблизительно в 5-6 раз!!! (
без распараллеливания расчётов)
Милая LUA — не прощай, конечно, но постой в сторонке.
Плюшки для писателей мелких приложений на LUA — алгоритмы и логика скрыты, скорость, удобство включения ограничений на использование.
ИНДИКАТОР
Robust_Regression.zip
Распаковать в папку LuaIndicators и добавить индикатор.
В кратце, через LUA поднимается FIX сервер, и роботы работают с ним. Расчеты все в отдельной программе, тем самым не нагружая Квик (даже если вы это вынесли в отдельную ДЛЛ, то все равно нагрузка на единичный процесс). Сильные нагрузки влияют на соединение, и оно просто разорвется с сервером в нужный. Резюмируя, это рискованно, если постоянно не следить.
в принципе, можно написать службу, которая следит за этим, не обязательно глазами следить ведь?
hildstrom.com/projects/langcomp/index.html
не особо впечатляет разница.
Это все достаточно субъективно, на самом деле, зависит все не только от языка, но и от степени знания языка, в каждом языке свои тонкости, Вы какой то одной строкой могли посадить производительность на 99%.
Например, в JS Вы могли бы значительно посадить перформанс используя forEach вместо find на больших массивах, потому что forEach всегда обрабатывает весь массив, даже если в каких то случаях уже после 3-его элемента смысла в этом нет
Так что обобщать не стоило бы.
А вообще, языки типа луа предназначены не для байтодрочерства, а для проектирования, в основном, они не могут быть оптимально быстрыми by design
не поленился, установил C++, взял тесты с ваших тестов, сократил количество итераций со 100 до 10 (по 20 минут на каждый тест неохота вешать машины) и добавил в каждом тесте счетчик тиков
Результат на лицо)))
Очень результаты не в пользу си
Исходники
А можно ппросить у Вас код на Lua (исходный без dll). Интересует алгоритм реализации.
Если это возможно, конечно.
у меня вообще никак не падает как не пытался.
а винда?