Блог им. bbanny_05
-------------------------------------------------Суть проблемы
У разных тикеров в исторических данных могут отсутствовать свечи за определённые периоды:
не было сделок,
биржа не торговалась,
сбой при скачивании истории,
разные торговые календари и т.д.
Это нормально и неизбежно.
❗ Проблема начинается дальше.
Как ведёт себя OS Engine
Судя по поведению, OS Engine:
Делает первичное выравнивание по временным меткам.
Далее идёт по массивам свечей без учёта временных меток, просто по индексам.
В результате индикаторы начинают считаться по разным реальным периодам времени, хотя визуально всё выглядит корректно.
Пример
Допустим, считаем
SMA(5)по трём тикерам:
Тикер 1 — данные полные
→ SMA считается за 5 последних календарных дней, включая сегодняшний.Тикер 2 — нет свечей за сегодня
→ SMA считается за 5 рабочих дней, но только до вчерашнего дня.Тикер 3 — был сбой в истории
→ SMA считается за 5 дней в прошлом месяце.При этом:
ошибок нет,
предупреждений нет,
визуально в интерфейсе всё выглядит «нормально».
Вы никогда об этом не узнаете, если не начнёте пошагово проверять данные и отлаживать расчёты в дебаггере.
Почему это опасно
Скринеры дают некорректные сигналы
Результаты тестирования искажены
Стратегии могут «работать» только из-за ошибки синхронизации данных
Найти причину практически невозможно без глубокого анализа
Проверь правильность утверждения, проанализировав исходный код
```
Ошибка в скринерах и там где используется больше одного тикера для тестирования
Проблем состоит в том что в данных тикеров могут отсутствовать свечи за разные периоды времени, не было сделок в этот перид или другая причина
НО когда OS Engine начинает идти по свечкам тикеров то видимо используется только первоначальное выравнивание по временным меткам, а потом по истрическим данным мы идем игнорирую временные метки. В результате получается что по одному тикеру, к примеру SMA(5) считается за 5 последних дней включая теущий день, по второму тикеру считается за 5 рабочих дней НО только до вчерашнего дня, а по третьему(если к примеру был сбой при скачке истторических данных) за пять дней в прошлом месяце. И вы этого даже не заметите нигде и не поймете, если не начнете все детально отлаживать и проверять в дебаггере.
```
АНАЛИЗ УТВЕРЖДЕНИЯ: ОШИБКА СИНХРОНИЗАЦИИ СВЕЧЕЙ В МНОГОТИКЕРНОМ ТЕСТИРОВАНИИНа основе анализа исходного кода утверждение СПРАВЕДЛИВО И КРИТИЧНО ВЕРНО. Вот подробное объяснение проблемы:
1️⃣ АРХИТЕКТУРА ПРОБЛЕМЫ
Основной поток обработки свечей (TesterServer.cs, строки 862-867):
Суть проблемы: Все тикеры обрабатываются ПОСЛЕДОВАТЕЛЬНО в одном цикле, используя ОДНО ТЕКУЩЕЕ ВРЕМЯ (TimeNow).
2️⃣ КАК ЭТО ПРОИСХОДИТ В РЕЖИМЕ ТЕСТИРОВАНИЯ
Фаза 1: Начальное выравнивание (по времени)
В SecurityTester.CheckCandles() (строки 4769-4849):
На этом этапе: Все свечи выравниваются по временным меткам. Если у тикера нет свечи на текущий момент времени, он просто ждёт или пропускает.
Фаза 2: Обработка исторических данных (БЕЗ проверки времени)
В CandleSeries.SetNewCandleInArray() (Candles/CandleSeries.cs, строки ~595-646):
3️⃣ ОСНОВНОЙ ДЕФЕКТ: ИГНОРИРОВАНИЕ ВРЕМЕННЫХ МЕТОК
Сценарий, где это ломается:
Допустим, тестируем 3 тикера с 5-минутными свечами:
Время Тикер 1 (EURUSD) Тикер 2 (GBPUSD) Тикер 3 (USDJPY) 10:00 ✅ Есть ✅ Есть ✅ Есть 10:05 ✅ Есть ⚠️ Нет данных ✅ Есть 10:10 ✅ Есть ✅ Есть ❌ Ошибка скачивания ... ... ... ... Что происходит при обработке индикатора SMA(5):
4️⃣ ГДЕ СКРЫТА ПРОБЛЕМА В КОДЕ
А) В LoadNextData() — нет синхронизации:
Б) В CheckCandles() — нет проверки пропусков:
В) В SetNewCandleInArray() — НЕТ валидации:
5️⃣ ПОЧЕМУ ЭТО НЕ ВИДНО БЕЗ ОТЛАДКИ
- Визуально скринер показывает значения (SMA = 100.5, 102.3 и т.д.)
- Математически SMA рассчитана правильно по доступным свечам
- НО эти свечи могут быть из разных временных интервалов!
- Индикатор ничего «не знает» о пропусках в исторических данных
Пример:
- SMA по EURUSD: среднее за последние 25 минут ✅ (правильно)
- SMA по GBPUSD: среднее за 10 минут + 3 дня назад ❌ (ОШИБКА!)
- SMA по USDJPY: среднее за май прошлого года ❌❌ (КРИТИЧЕСКАЯ ОШИБКА!)
6️⃣ КОД, ДЕМОНСТРИРУЮЩИЙ ПРОБЛЕМУ
BotTabScreener.cs, строка 2638:
BotTabSimple.cs, строка 6525:
7️⃣ ПОСЛЕДСТВИЯ ДЛЯ ТЕСТИРОВАНИЯ
Проблема Последствие Разные временные интервалы в SMA Неверные сигналы Корреляция между тикерами «из прошлого» False positives в торговле Пропущенные дни в одном из тикеров Слепое тестирование Ошибка скачивания истории Тест на АБСОЛЮТНО НЕПРАВИЛЬНЫХ данных 8️⃣ КАК ЭТО МОЖНО ИСПРАВИТЬ
Вариант 1: Синхронизация с проверкой времени
Вариант 2: Добавить валидацию в CandleSeries
ИТОГОВЫЙ ВЫВОД✅ УТВЕРЖДЕНИЕ ПОЛНОСТЬЮ СПРАВЕДЛИВО
Проблема действительно существует и скрыта в архитектуре OS Engine:
- Нет принудительной синхронизации между свечами разных тикеров
- Временные метки игнорируются при добавлении свечей в индикаторы
- Пропущенные дни/пропуски обрабатываются молчаливо без предупреждений
- Некорректные сигналы гарантированы при тестировании на нескольких тикерах
Это КРИТИЧЕСКИЙ ДЕФЕКТ для систем типа скринеров, которые сравнивают несколько инструментов одновременно.
full_sec_range = pd.DataFrame({'t': range(min_t, max_t + 1)})
df = full_sec_range.merge(df, on='t', how='left')
df['last_price'] = df['last_price'].ffill().bfill()
df['first_price'] = df['first_price'].fillna(df['last_price'])
df['min_price'] = df['min_price'].fillna(df['last_price'])
df['max_price'] = df['max_price'].fillna(df['last_price'])
Это просто размножает last_price на пустые следующие свечи. Так себе способ, но лучше, чем получить смещение по времени как в статье.