Зачем это нужно?
При массовой оптимизации торговых стратегий в TSLab одни и те же индикаторы часто пересчитываются сотни раз с идентичными параметрами. Например:
- Индикатор SMA(20) для одного и того же инструмента будет вычисляться заново на каждом проходе оптимизации.
- Это приводит к бесполезной нагрузке на CPU и увеличивает время тестирования.
Кэширование решает проблему: если индикатор уже был рассчитан для конкретных параметров, его результат сохраняется и повторно используется.
→ Экономия до 70% времени при оптимизации (на примере стратегии с 10 индикаторами).
Как реализовать кэширование в методе индикатора
Пример: индикатор SMA (простое скользящее среднее) с локальной функцией.
public static IList<double> SMA( IList<double> source, int period, IContext ctx = null, bool useCache = true) { // Локальная функция, инкапсулирующая расчет IList<double> CalculateSMA() { double[] result = new double[source.Count]; double sum = 0; for (int i = 0; i < source.Count; i++) { sum += source[i]; if (i >= period) sum -= source[i - period]; result[i] = (i >= period - 1) ? sum / period : 0; } return result; } }
Сейчас вы видите только часть кода. Полный код доступен зарегистрированным пользователям. Чтобы получить доступ:
- перейдите по кнопке ниже для авторизации
- в новой вкладке у вас откроется форма входа/регистрации
- войдите в свой личный кабинет
- вернитесь к статье (она останется открытой в старой вкладке) и обновите страницу
Как это работает?
1. Ключ кэша формируется из:
- Названия индикатора ( "SMA" ).
- Параметров ( period , хеш исходных данных).
2. При первом вызове для конкретных параметров:
- Индикатор рассчитывается и сохраняется в кэш.
- Значение берется из кэша, а не пересчитывается.
Преимущества подхода
1. Скорость:
Нагрузка на CPU снижается в разы при тестировании на истории в 100 000+ баров.
2. Простота управления:
Вся логика индикатора (расчет + кэширование) содержится в одном методе.
3. Совместимость:
Старый код продолжает работать — параметры ctx и useCache необязательные.
4. Гибкость:
Можно временно отключать кэш для проверки корректности расчетов.
Ограничения и рекомендации
Кэширование — не панацея. Вот что важно учитывать:
1. Потребление памяти: При большом количестве уникальных параметров (например, 1000+ вариантов period или разных инструментов) кэш может занимать гигабайты оперативной памяти.
→ Решение: Используйте кэширование только для индикаторов с фиксированным набором параметров.
2. Время поиска в кэше: Проверка ключей ( cacheKey + parameters ) требует вычислений. При 10 000+ записей это может замедлить оптимизацию.
→ Рекомендация: Упрощайте ключи. Например, вместо source.GetHashCode() используйте source.Count, если данные статичны.
3. Динамические параметры: Если параметры индикатора зависят от данных (например, period = close.Count /2), кэш будет бесполезен — каждый вызов получит уникальный ключ.
→ Что делать: Отключайте кэширование через useCache: false для таких случаев.
4. Коллизии ключей: Некорректное формирование ключа (например, игнорирование source ) приведет к ложным попаданиям в кэш.
→ Проверка: Добавляйте в ключ все значимые параметры (период, тип данных, настройки сглаживания).
Практические советы
- Логируйте использование кэша для анализа его эффективности:
return ctx.GetData(cacheKey, parameters, () => { ctx.Log($"Расчет SMA({period})... (кэш пуст)"); return CalculateSMA(); });
- Тестируйте с отключенным кэшем перед финальным прогоном — это поможет выявить скрытые ошибки.
- Не кэшируйте «тяжелые» индикаторы с длинными периодами (например, 200+ баров), если они вызываются редко.
Важно: Кэширование — это компромисс между памятью и CPU. Всегда проверяйте, что выигрыш в скорости перекрывает издержки на хранение данных.
Пример вызова с отключенным кэшем (для отладки или динамических параметров):
IListsmaRaw = SMA(close, 20, useCache: false);
Хотите вывести свои навыки трейдера
на новый уровень?
Закрытый клуб алготрейдеров TrendTeamClub будет полезен всем, кто занимается алгоритмической торговлей или исследует торговые стратегии на фондовых и криптовалютных рынках.
TrendTeam
Договор-оферта
Соглашение об обработке персональных данных
ИП Горбунов А.В.
ИНН 773423736908
ОГРНИП 314774630300152
Москва, 2024
авторизуйтесь