Каждый, кто пробовал торговать на крипторынке, сталкивался с дилеммой: где ставить стоп-лосс и тейк-профит?
Особенно остро этот вопрос стоит перед теми, кто торгует «статику» — фиксированные проценты риска и прибыли на сделку. Обычно эти параметры выбираются «на глаз» (например, классические 1% SL и 2% TP фиксировано, либо даже 1:1) или на основе общих тестов стратегии в симуляторе. Но рынок меняется, волатильность растёт/падает, и то, что работало в прошлом месяце, сегодня начинает медленно выедать депозит комиссиями, винрейт стратегии сильно падает.
В этой статье мы разберем, как написать инструмент на Python, который берет вашу реальную историю сделок с биржи, выкачивает под каждую сделку 500 свечей после её открытия и проводит глубокий пост-фактум анализ (Grid Search) тысяч комбинаций SL/TP с учетом плеча и комиссий. А на выходе строит наглядный интерактивный Excel-дашборд.
Все файлы прикрепил для вас на github. Скрипт работает с bingX, но логику всегда можно переделать под любую биржу.
Проблема «статического» трейдинга и классического бэктеста Большинство классических бэктестеров (вроде Backtrader или встроенного симулятора TradingView) тестируют стратегию в вакууме. Они генерируют сигналы на исторических графиках и симулируют их исполнение.
Но реальный трейдинг полон нюансов:
Проскальзывания, пинг, комиссии: Ваши реальные входы почти никогда не совпадают с идеальными точками на графике TradingView. Именно здесь имеет смысл применить пост-фактум реалтайм тест (Post-Trade Optimization). Мы не тестируем логику входов — мы тестируем качество наших реальных входов и оптимизируем правила выхода.
🛠️ Глубокая техническая реализация Система состоит из двух скриптов: коллектора истории сделок и симулятора-оптимизатора.
Главная ошибка при бэктесте сделок с реального аккаунта — несовпадение таймстампов. Ваша сделка на бирже может открыться в 12:03:15. Если начать симуляцию с этого момента по свечам 12:00:00, возникнет lookahead bias (ошибка заглядывания вперед), так как свеча 12:00 закроется только в 12:05.
Для решения этой проблемы мы принудительно округляем время входа вниз к ближайшей пятиминутной границе:
Округление времени входа до 5-минутной свечи открытия (в миллисекундах)
Для каждого исторического трейда мы симулируем прохождение цены по OHLC-параметрам пятиминутных свечей.
Вот ключевая функция симуляции:
def simulate_trade(side, entry_price, candles, sl_pct, tp_pct, leverage, comm_rate): """ Симулирует прохождение сделки по свечам. Возвращает: exit_price, duration (свечей), reason, net_pnl_pct """ sl_price = entry_price * (1.0 - sl_pct) if side == "LONG" else entry_price * (1.0 + sl_pct) tp_price = entry_price * (1.0 + tp_pct) if side == "LONG" else entry_price * (1.0 - tp_pct) for idx, c in enumerate(candles): high = c["high"] low = c["low"] if side == "LONG": # Консервативный сценарий: если свеча коснулась и SL, и TP, засчитываем SL if low <= sl_price and high >= tp_price: exit_price = sl_price reason = "SL" break elif low <= sl_price: exit_price = sl_price reason = "SL" break elif high >= tp_price: exit_price = tp_price reason = "TP" break elif side == "SHORT": if high >= sl_price and low <= tp_price: exit_price = sl_price reason = "SL" break elif high >= sl_price: exit_price = sl_price reason = "SL" break elif low <= tp_price: exit_price = tp_price reason = "TP" break else: # Если за 500 свечей уровни не достигнуты, закрываем сделку в конце по рынку exit_price = candles[-1]["close"] reason = "END" idx = len(candles) - 1 # Расчет чистой доходности с вычетом круглых комиссий (вход + выход) и плечом price_return = (exit_price - entry_price) / entry_price if side == "LONG" else (entry_price - exit_price) / entry_price net_return = price_return - (2.0 * comm_rate) net_pnl_pct = net_return * leverage return exit_price, idx + 1, reason, net_pnl_pct
📊 Реальные результаты оптимизации на базе пользователя (44 сделки) В качестве живого примера возьмем реальные результаты оптимизации, которые мы получили при тестировании базы сделок пользователя. Анализировалась последовательность из 44 закрытых позиций (монеты TAIKO, VELVET, BIRB, GUA, RPL и др.), выгруженных напрямую с аккаунта.
Параметры симуляции:
-
Стартовый капитал: $1000.00
-
Выделяемая маржа: 0.1% от текущего депозита (динамический сложный процент)
-
Кредитное плечо: 20x
-
Объем позиции: $20.00 на первую сделку

Если даже при минимальном TP стратегия закрывается по стопам, это означает «токсичные входы» (цена сразу после входа идет против вас). Вам нужно чинить логику триггеров входа. Если же при коротких TP стратегия показывает винрейт 80-90%, значит, ваши входы идеальны, но вы передерживаете позиции. Нужно снижать тейки.
Также система полезна как еженедельный адаптивный ребаланс параметров. Рыночные фазы сменяются каждые 2-3 недели. Чтобы робот оставался прибыльным, настраивается следующий конвейер:
Каждую пятницу вечером скрипт автоматизировано скачивает историю закрытых сделок робота за последние 14 дней. Производится прогон оптимизации SL/TP. Полученная «зеленая зона» параметров из Excel тепловой карты передается в конфигурационный файл робота на следующую неделю. Это позволяет динамически подстраивать ширину стопа под текущую волатильность рынка (ATR).
Скрипт генерирует файл sltp_optimization_results.xlsx, в котором строятся интерактивные тепловые карты.
Применяем трехцветное условное форматирование для тепловой карты доходности
# Применяем трехцветное условное форматирование для тепловой карты доходностиcolor_scale_pnl = ColorScaleRule( start_type='num', start_value=float(df_results["total_return"].min()), start_color='FCE4D6', # Нежно-красный (убыток) mid_type='num', mid_value=0.0, mid_color='FFFFFF', # Белый (безубыток) end_type='num', end_value=float(df_results["total_return"].max()), end_color='E2EFDA' # Нежно-зеленый (профит))ws.conditional_formatting.add("B2:AZ50", color_scale_pnl)
Открыв этот файл в Excel или Google Таблицах, трейдер моментально видит «зеленые зоны» — кластеры параметров стопа и тейка, где стратегия показывает максимальную устойчивость, и «красные зоны», которых стоит избегать.
Заключение
Инструменты глубокого анализа сделок переводят торговлю из разряда «угадайки» в плоскость точных математических расчетов. Пост-анализ реальных входов позволяет трейдеру-статику перестать терять деньги на случайных рыночных шумах, а алготрейдеру — держать руку на пульсе постоянно меняющегося рынка.
Код скриптов оптимизации и парсеров открыт для кастомизации под любые типы расчетов — от тестирования сложного процента до интеграции учета проскальзываний.
ссылка на оригинал статьи https://habr.com/ru/articles/1055708/