Как настроить несколько тейк-профитов в Telegram-боте для Bybit

    При разработке торгового бота для криптобиржи Bybit часто возникает задача автоматической установки нескольких тейк-профитов (TP). В данной статье мы разберём, почему стандартная реализация может не срабатывать, и как исправить код, чтобы бот корректно выставлял TP1, TP2 и TP3.

    Почему бот не ставит несколько тейк-профитов?

    Основная проблема кроется в асинхронной установке ордеров после открытия позиции. В приведённом коде функция place_tp_orders() запускается в отдельном потоке и пытается дождаться появления позиции на бирже. Однако, если позиция не подтверждается в течение 15 секунд, установка TP пропускается. Дополнительные сложности возникают из-за:

    • Некорректного расчёта размеров для частичного закрытия (reduce-only ордера)
    • Ошибок в нормализации объёмов контрактов
    • Несоответствия типов ордеров (stop-market вместо limit)

    Пошаговая инструкция по исправлению

    1. Проверьте подтверждение позиции на бирже

    Увеличьте время ожидания или используйте WebSocket для мгновенного получения обновлений. Вместо цикла с time.sleep(1) лучше подписаться на события позиций.

    2. Корректно рассчитайте размеры для TP

    Убедитесь, что сумма размеров всех TP равна 100% от размера позиции. В примере: TP1 = 25%, TP2 = 50%, TP3 = 25%. Используйте normalize_amount() для каждого ордера отдельно, чтобы избежать ошибок округления.

    3. Используйте правильный тип ордера

    Для частичного закрытия на Bybit лучше применять лимитные ордера с флагом reduce_only=True, а не stop-market. Это даёт больше контроля над ценой исполнения.

    Пример исправленного кода

    def place_tp_orders_improved(trade, symbol, trend, tp1, tp2, tp3):
        # Подтверждение позиции через WebSocket или увеличенный таймаут
        for attempt in range(30):  # 30 секунд вместо 15
            time.sleep(1)
            try:
                positions = self.api.get_open_positions()
                if symbol in positions and positions[symbol]['size'] > 0:
                    break
            except Exception as e:
                logger.warning(f"Ожидание позиции {symbol}: {e}")
        else:
            logger.error(f"Не удалось подтвердить позицию {symbol}")
            return
    
        # Расчёт размеров с нормализацией
        total_size = trade.size
        tp1_size = self.api.normalize_amount(symbol, total_size * 0.25)
        tp2_size = self.api.normalize_amount(symbol, total_size * 0.50)
        tp3_size = self.api.normalize_amount(symbol, total_size * 0.25)
    
        # Создание лимитных reduce-only ордеров
        for tp_price, tp_size, tp_name in [(tp1, tp1_size, 'TP1'), (tp2, tp2_size, 'TP2'), (tp3, tp3_size, 'TP3')]:
            if tp_size <= 0:
                continue
            order = self.order_manager.create_limit_order(
                symbol=symbol,
                side='sell' if trend == 'LONG' else 'buy',
                amount=tp_size,
                price=tp_price,
                reduce_only=True
            )
            if order and order.get('id'):
                logger.info(f"{tp_name} ордер {symbol} создан, ID={order['id']}")
            else:
                logger.warning(f"Не удалось создать {tp_name} для {symbol}")

    Дополнительные рекомендации

    • Логирование: Добавьте подробные логи для каждого этапа установки TP, чтобы быстро находить ошибки.
    • Обработка ошибок: Оберните создание каждого ордера в try-except, чтобы один неудачный ордер не блокировал остальные.
    • Тестирование на демо-счете: Перед запуском на реальные средства обязательно протестируйте логику на тестовой сети Bybit.

    Заключение

    Настройка нескольких тейк-профитов в Telegram-боте для Bybit требует внимания к деталям: подтверждению позиции, корректному расчёту объёмов и выбору типа ордера. Используя приведённые выше рекомендации и исправленный код, вы сможете автоматизировать частичное закрытие позиций и повысить эффективность торговой стратегии.

    Часто задаваемые вопросы