Решил «спалить грааль». Опишу тестирование торговой системы, которую можно использовать для демо-трейдинга, например, транслируя сигналы в мессенджерах и повышая свой авторитет как опытного трейдера среди аудитории. Риски использования лежат только на вас самих!
Система эксплуатирует нестационарность рынка, используя для входов и выходов моменты с повышенной волатильностью. Моменты входа и выхода зависят от одного явного параметра lookback и одного неявного greed. Торговля ведётся в лонг и шорт, может применяться на любых таймфреймах, но лучше на мелких. Подходит любой достаточно волатильный и ликвидный инструмент. Я буду демонстрировать результаты на фьючерсе на акции «Сбера» SR.
Период для тестирования выбран с начала 2015 года по конец февраля 2023 года. Торговля идёт фиксированной суммой на весь капитал по номиналу. Комиссия и проскальзывание установлены на уровне 0,03%. Склейка фьючерсов не используется, в конце дня, предшествующего дню экспирации, позиции закрываются и на следующий день открываются уже в новом фьючерсе. Таймфрейм 5 минут, чтобы было удобно оперативно транслировать сигналы через интернет.
-- -- Выполнение действий с массивами. -- local pairs = pairs local type = type module(...) --- Создать копию массива (таблицы) -- @return копию массива (таблицы) function copy(array) local copy_array = {} if type(array) ~= "table" then return array end for k, v in pairs(array) do if type(v) == "table" then copy_array[k] = copy(v) else copy_array[k] = v end end return copy_array end --- Узнать, начинается ли индексация в массиве с нуля или с единицы. -- @return 0 или 1 function base(array) if array[0] ~= nil then return 0 else return 1 end end --- Вычислить число элементов в массиве. -- @return число элементов в массиве function size(array) local n = 0 for _, _ in pairs(array) do n = n + 1 end return n end --- Проверить пустой или нет массив. -- @return true/false function isEmpty(array) for _, _ in pairs(array) do return false end return true end --- Получить первый индекс массива, где ничего не записано. Поиск начинается с 1. -- @return первый индекс массива, где ничего не записано function firstEmptyIndex(array) local i = 1 while array[i] ~= nil do i = i + 1 end return i end