Когда-то давно я занимался распознавание образов и использовал такую вещь как
интегральное представление изображения. И на самом деле этот же метод применим и в алготрейдинге, например для быстрого расчета SMA, или сбора статистики винрейта за указанный период.
Например, был ценовой ряд из 6-ти элементов:
1.104, 1.102, 1.105, 1.106, 1.103, 1.101
Найдем его интегральное представление (начнем с нуля):
0.0, 1.104, 2.206, 3.311, 4.417, 5.52, 6.621
Чему будет равно SMA за последние 3 элемента? Достаточно посчитать разницу:
6.621 - 3.311 и разделить ее на
3.
SMA(3) = (6.621 - 3.311)/3 = 1.103
Убедимся, что SMA(3) найдено верно.
(1.106 + 1.103 + 1.101)/3 = 1.103
Таким образом можно найти SMA с любым периодом, совершив всего навсего одну операцию вычитания и одну операцию деления. Это позволит гораздо быстрее получить набор значений индикаторов типа SMA, RSI, STD_DEV.
Вроде все хорошо,
НО НАДО ПОМНИТЬ, что если использовать тип данных с плавающей точкой, то у нас будет накапливаться ошибка. Поэтому ценовой ряд лучше сначала преобразовать в целочисленный тип. Для этого достаточно для 5-ти значных котировок умножить цену на число 100 000.
В случае с подсчетом винрейта необходимо иметь два ряда, один для удачных сделок, другой для убыточных. Оба ряда преобразуются в интегральное представление, дальше по аналогии находим две суммы за выбранный период, после чего уже можно и винрейт посчитать.