Как настроить несколько тейк-профитов в 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 требует внимания к деталям: подтверждению позиции, корректному расчёту объёмов и выбору типа ордера. Используя приведённые выше рекомендации и исправленный код, вы сможете автоматизировать частичное закрытие позиций и повысить эффективность торговой стратегии.