Создание Post-Only и Reduce-Only ордеров на Bybit V5 в Python

Создание Post-Only и Reduce-Only ордеров на Bybit V5 в Python ИНВЕСТИЦИИ, ВКЛАДЫ и СБЕРЕЖЕНИЯ
Пошаговое руководство по созданию лимитных ордеров с параметрами Post-Only и Reduce-Only через Bybit V5 API на Python с использованием библиотеки pybit.
Суть: Для создания лимитного ордера с параметрами Post-Only и Reduce-Only в Bybit V5 API используется эндпоинт /v5/order/create. В Python-библиотеке pybit это реализуется передачей параметров timeInForce='PostOnly' и reduceOnly=True в метод place_order. Это гарантирует, что ордер исполнится строго как Maker (без проскальзывания) и только на сокращение существующей позиции.

Исходный код

Ниже представлен готовый к продакшену скрипт на Python для работы с Bybit V5 API. Для высокочастотного трейдинга с минимальными задержками также рекомендуем изучить материал Интеграция Python с FIX API (QuickFIX) для HFT торговли.

import logging
from pybit.unified_trading import HTTP

# Настройка логирования для отслеживания запросов
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s"
)

# Инициализация клиента Bybit V5 API
# Для реальной торговли установите testnet=False и укажите свои API-ключи
session = HTTP(
    testnet=True,
    api_key="YOUR_API_KEY",
    api_secret="YOUR_API_SECRET",
)

def create_post_only_reduce_only_order(
    symbol: str,
    side: str,
    qty: str,
    price: str,
    category: str = "linear"
) -> dict:
    """
    Создает лимитный ордер с флагами Post-Only и Reduce-Only на Bybit V5.
    """
    try:
        response = session.place_order(
            category=category,
            symbol=symbol,
            side=side,
            orderType="Limit",
            qty=qty,
            price=price,
            timeInForce="PostOnly",  # Гарантирует статус Maker
            reduceOnly=True,         # Исключает увеличение позиции
            orderLinkId=f"custom-id-{symbol}-{price}"  # Уникальный ID для трекинга
        )
        logging.info(f"Ордер успешно отправлен. ID: {response.get('result', {}).get('orderId')}")
        return response
    except Exception as e:
        logging.error(f"Критическая ошибка при отправке ордера: {e}")
        return None

if __name__ == "__main__":
    # Пример: закрытие части лонг-позиции по BTCUSDT лимитным ордером (продажа)
    order_response = create_post_only_reduce_only_order(
        symbol="BTCUSDT",
        side="Sell",
        qty="0.01",
        price="68500"
    )
    print(order_response)

Разбор параметров

При отправке запроса к Bybit V5 API ключевое значение имеют следующие параметры:

  • category: Определяет тип рынка. Для бессрочных контрактов (USDT, USDC) используется значение 'linear', для инверсных — 'inverse', для спотового рынка — 'spot'. Обратите внимание, что параметр reduceOnly применим только к деривативам.
  • timeInForce: Установка значения в 'PostOnly' гарантирует, что ваш ордер попадет в биржевой стакан исключительно как Maker. Если текущая рыночная цена пересекает цену вашего ордера в момент отправки (что привело бы к немедленному исполнению в качестве Taker), биржа автоматически отклонит этот ордер. Это критически важно для минимизации торговых комиссий.
  • reduceOnly: Булевый флаг (True), который гарантирует, что ордер может только уменьшить или полностью закрыть текущую открытую позицию. Если размер ордера превышает размер текущей позиции, Bybit автоматически уменьшит объем ордера до размера позиции, предотвращая случайное открытие противоположной позиции.
  • orderType: Должен быть строго 'Limit'. Использование рыночных ордеров ('Market') несовместимо с логикой Post-Only.

Если вы реализуете сложную сетку ордеров или алгоритмический выход из позиций частями, рекомендуем ознакомиться со статьей про Реализация алгоритма TWAP на Python для плавного исполнения ордеров.

Как запустить

Для успешного запуска скрипта выполните следующие шаги:

1. Установите официальную библиотеку Bybit для Python:

pip install pybit

2. Получите API-ключи в личном кабинете Bybit (в тестовой сети Testnet или на реальном аккаунте) и замените заглушки "YOUR_API_KEY" и "YOUR_API_SECRET" в коде.

3. Запустите скрипт. В случае успешного выполнения вы получите JSON-ответ от биржи с уникальным идентификатором ордера orderId.

Для долгосрочной стабильности вашей торговой системы крайне важно логировать все ответы API и ошибки сети. Оптимальное решение для этого описано в нашей статье Асинхронное логирование торговых операций в MongoDB на Python.

Оцените статью
FinFluct