Я был уверен что нашёл стратегию с винрейтом 90%. В реальности она давала 10%.
История одной самонадеянности и нескольких пропущенных запятых. Часть из серии «Как я строю торгового бота. По правде»
Помню как сидел за компом и не верил в свой собственный экран. Бэктест по эфиру выдавал винрейт 90%. По биткоину — 85%. По солане — 88%. Я гонял стратегию на разных монетах, на разных таймфреймах, на разных кусках истории — везде красиво. На всякий случай я даже написал автоматическое применение параметров, чтобы стратегия сама подстраивалась под свежие данные. Получалось ещё лучше. Я отлично помню что я тогда чувствовал. Не радость — недоверие. Я торгую крипту с 2022 года, я помню как сливал $133K, я знаю что чудес на рынке не бывает. И вот сижу, смотрю на эти 90%, и думаю одну простую вещь: «Если это работает — почему не все этим занимаются?» Это был правильный вопрос. Я просто не сразу нашёл правильный ответ.
Запустил в живую
Подключил бота к боевому аккаунту, поставил минимальный риск на сделку — на случай если что-то пойдёт не так. Что-то пошло не так через две недели. Винрейт в живой торговле был не 90%. Не 70%. Не 50%. Десять процентов. Максимум двенадцать. И сделок было в разы меньше чем в бэктесте — что-то ещё фильтровалось, что-то не проходило по риск-менеджеру, какие-то ордера затягивались. Сначала я подумал — это рынок. Бывают плохие недели. Подождал ещё неделю. Стало хуже. Тогда я открыл код.
Что я нашёл
Мне неприятно это писать, но без этого пост не имеет смысла. В бэктесте у меня было несколько глупых ошибок которые я допускал параллельно с написанием кода. Не одна большая концептуальная — а несколько мелких, которые в сумме давали красивую цифру. Где-то была пропущена запятая в условии — и часть проверок просто не выполнялась. Где-то стояла точка не в том месте — и параметр читался как другое число. Где-то логика проверяла одно, а в реальной торговле срабатывала на другое — потому что я писал бэктест и боевой движок в разное время и кое-где разошёлся в формулах. В сумме это давало системную ошибку в пользу бэктеста. Стратегия в тестовом режиме видела сделки которые в живой не открылись бы. Видела закрытия которые в живой не сработали бы. Видела стоп-лоссы там где их не было бы. Если ты сейчас читаешь это и работаешь в IT — ты понимаешь масштаб. Если не работаешь — поверь, это самая стыдная категория багов. Не сложные алгоритмические ошибки. Просто невнимательность размазанная по коду.
Почему я полтора месяца этого не видел
Здесь самое важное. Не «я плохо проверял код». Я проверял много раз. Я проверял код стратегии. Я не проверял разницу между бэктестом и боевым движком. Это разные системы. Они должны давать один и тот же результат на одних и тех же данных — но они работают параллельно, и каждая делает свою работу. У них могут быть микро-расхождения в порядке вычислений, в обработке граничных случаев, в работе с десятичными. Эти расхождения не видны если смотреть на код одной из систем. Они видны только если ты специально их ищешь. Я не искал. Я смотрел на цифру 90% и думал что у меня крутая стратегия.
Что я делаю теперь
Главное правило, которое появилось в моём боте после этого: Бэктест и боевой движок — это одна и та же функция, вызванная с разными данными. Не две разные системы. Не «модуль для теста и модуль для реальной торговли». Один и тот же код. Один и тот же расчёт стоп-лосса. Одни и те же фильтры. Бэктест — это просто этот код, которому подсунули исторические свечи вместо живого потока. Это звучит очевидно. Но если кто-то из вас писал торгового бота — вы знаете что соблазн написать «упрощённый бэктестер для быстрых проверок» приходит на каждой второй итерации. Кажется быстрее. Кажется удобнее. Это та самая дверь через которую заходит ошибка которую ты потом полтора месяца не видишь. Второе правило — сравнение бэктеста и реальной торговли запускается автоматически, каждый раз когда я меняю что-то в коде.
Бот гоняет последние 30 дней истории через бэктест-режим, потом сверяет с тем как он реально торговал в эти же 30 дней. Если расхождение больше 5% по любой метрике — деплой не идёт, я разбираюсь почему.Третье правило — никаких автоматических подгонок параметров. Та функция которую я когда-то написал — «бот сам подстраивает стратегию под свежие данные» — удалена. Параметры меняются только мной, вручную, и каждое изменение проходит честную проверку на данных которые стратегия не видела при настройке.
Что я хочу чтобы ты вынес из этого поста
Если ты сам пишешь торгового бота или используешь чужого: — Реальные стратегии дают скромный, но честный edge. Если кто-то показывает тебе бэктест с 100% винрейтом — у него либо одна из тех проблем что были у меня, либо он подбирает параметры под прошлое. — Если у тебя бэктест и живая торговля — это две системы, у тебя баг. Ты его ещё не нашёл. Это вопрос времени. — Самые дорогие баги в коде — не те которые падают с ошибкой. А те которые тихо меняют цифры. Падающий код ты заметишь за минуту. Тихий — за полтора месяца. Иногда за полгода.
В следующем посте — почему 80% алготрейдеров делают именно эту ошибку и не подозревают об этом. Без меня в главной роли — там уже про методологию. Если интересно следить за серией — подписывайся, выходит два-три раза в неделю.
🔧 Если хочешь посмотреть как эта система работает сейчас:
— Бесплатный тариф, 2 сигнала в день, без оплаты: t.me/chmbotsignal — Сравнение 4 стратегий и тарифы: chmup.top
— Предупреждение о рисках: chmup.top/risk
Если ты разработчик или трейдер и хочешь разобрать конкретную часть — пиши в комментарии. Темы вроде честной проверки стратегий, авто-оптимизатора, проверки маржи перед сделкой — могу разобрать отдельно.