Как настроить автоматическую торговлю на бирже Bybit?

У меня есть Telegram‑бот с функцией автоторговли на Bybit. В тестах позиции открываются и устанавливаются Take Profit 1 и Stop Loss 1, но не получается автоматически задать больше одного тейка — как это реализовать? Кто знает и может помочь, отпишитесь, пожалуйста.
  • 15 мая 2026 г. 11:10
Ответы на вопрос 2
Кратко — Bybit не даёт «встроенного» одного специального механизма “несколько тейков в одной позиции”. Обычно на практике делают так: делят объём позиции на несколько частей и ставят несколько reduce‑only ордеров (limit или условных limit — conditional orders) на закрытие части позиции по разным ценам. Важно правильно выставить флаги reduce_only / close_on_trigger, side/position_idx (в hedge‑режиме) и trigger_by (LastPrice/MarkPrice). Ниже — пошагово и с примерами.

Что нужно сделать (алгоритм)
1. Узнать точный размер открытой позиции (кол‑во контрактов/лотов).
2. Решить, на сколько частей делите позицию (например 30% / 30% / 40%).
3. Для каждой части создать ордер на закрытие:
   - тип: limit (если хотите точно по цене) или conditional (если хотите триггер + лимит).
   - флаг reduce_only = true (чтобы ордера только уменьшали позицию, а не открывали противоположную).
   - если используете hedge mode — указать correct position_idx (0/1) или side, как требует API.
   - trigger_by: LastPrice / MarkPrice в зависимости от того, по чему хотите триггер.
4. Отслеживать исполнение через WebSocket / REST (order fills). При полном закрытии позиции — отменять оставшиеся ордера, если нужно.
5. Для стопа обычно делаете один conditional stop (market/limit) с reduce_only = true.

Важные нюансы
- reduce_only обязателен, иначе лимит‑ордера могут открыть противоположную позицию.
- В hedge mode каждый ордер должен иметь позиционный индекс/правильную сторону — иначе ордера пойдут в «другую» сторону.
- Сумма qty всех TP ордеров должна равняться (или быть меньше/равной) объёму позиции.
- Если используете conditional orders (триггер), укажите trigger_price и order_price отдельно.
- В Bybit есть ограничения по кол‑ву активных ордеров — проверьте лимиты.
- Следите за частичными исполнениями: если TP1 частично исполнился, остальная часть позиции всё ещё «закрывается» следующими ордерами.

Пример (Python + ccxt) — концепт
(этот код иллюстративный; нужно подставить ключи, symbol, расчёт qty и настроить params для вашей биржи)

import ccxt
exchange = ccxt.bybit({
    'apiKey': 'KEY',
    'secret': 'SECRET',
})
symbol = 'BTC/USDT'
position_qty = 1.0  # пример: 1 контракт/лот — получите реальный через позицию
parts = [0.3, 0.3, 0.4]  # доли позиции для 3 тейков
tp_prices = [50000, 51000, 52000]

for part, price in zip(parts, tp_prices):
    qty = position_qty * part
    params = {
        'reduce_only': True,
        # возможно потребуется: 'close_on_trigger': True,
        # 'position_idx': 0,  # если используете hedge mode
        # 'trigger_by': 'LastPrice'  # для conditional orders
    }
    # создаём limit ордер reduce-only
    order = exchange.create_order(symbol, 'limit', 'sell', qty, price, params)
    print('TP order created', order)

Если нужны conditional (trigger) ордера, у ccxt/Bybit обычно нужно передать triggerPrice + orderPrice (или соответствующие параметры), например params = {'triggerPrice': 49950, 'orderPrice': 50000, 'reduce_only': True} — сверяйтесь с вашей версией ccxt/документацией Bybit.

Пример на уровне REST (псевдопараметры)
POST /private/linear/order/create
{
  "symbol": "BTCUSDT",
  "side": "Sell",
  "order_type": "Limit",
  "qty": 0.3,
  "price": 50000,
  "time_in_force": "PostOnly",
  "reduce_only": true,
  "close_on_trigger": true,
  "position_idx": 0  // при hedge
}

Отслеживание и отмена
- Подпишитесь на WebSocket trade/order updates, чтобы знать, когда ордер исполнился.
- Если позиция полностью закрыта — отправьте запрос на Cancel для оставшихся TP ордеров (иначе они могут открыть новую позицию).
- Обрабатывайте частичные исполнения: корректируйте qty оставшихся ордеров при необходимости.

Если у вас не получается — вероятные причины
- Не выставлен reduce_only (ордера увеличивают позицию).
- Неправильный side / position_idx (в hedge режиме).
- Сумма TP ордеров > позиции.
- Неправильный trigger_by — вы используете mark price, а смотрите last price.
- Ошибка в формировании запросов к API (параметры отличаются в разных версиях Bybit API).

Могу помочь более конкретно
Если хотите — пришлите:
- фрагмент кода, где вы создаёте TP‑ордера,
- режим (USDT perpetual / inverse / USDC; hedge или one‑way),
- используемую библиотеку (ccxt, bybit‑py, raw REST) и версию API,
и я подскажу точные параметры и поправки.
похоже у тебя tpslMode=Full (дефолт) — можно только один TP. Переключи в Partial: в pybit это <pre><code>set_tp_sl_mode(category='linear', symbol='...', tpSlMode='Partial')</code></pre> , потом для каждого тейка <pre><code>set_trading_stop(..., takeProfit=str(tp1), tpSize=str(qty))</code></pre> . Либо просто ставь reduce_only лимитки на tp1/tp2/tp3.
Похожие вопросы