Перейти к содержимому

Торговля

Постановка и снятие заявок, закрытие позиций, стоп-лосс и тейк-профит, смена плеча.

Вызовам на этой странице нужно право trading:write. Цены и объёмы передаются десятичными строками.

Реальные деньги. Эти вызовы отправляют на биржу настоящие заявки через терминал, и подтверждения нет. Чтобы сразу остановить программу, выключите Local API в терминале.

Поставить заявку

accepted = terminal.place_order(
    12,
    "binance:futures:BTCUSDT",
    side="buy",
    order_type="limit",
    price="60000",
    size="0.001",
    client_key="bot-42",
)
print(accepted.key)
АргументЗначение
order_typelimit с ценой price или market без неё. В TypeScript это type.
size или notionalРовно одно из двух: объём в базовой монете или сумма в валюте котировки.
reduce_only, post_onlyНеобязательные, по умолчанию false.
time_in_forceНеобязательный: gtc, ioc, fok или post_only.

Всегда передавайте client_key. Повтор с тем же ключом возвращает первый ответ и ничего не ставит, поэтому повторный запрос никогда не поставит заявку дважды. Терминал помнит последнюю тысячу ключей.

Передавайте цены и объёмы строками. Python отклоняет float.

Проверить исход

# accepted is the answer of place_order
orders = terminal.account_orders(12)
order = next((o for o in orders.data if o.key == accepted.key), None)
if order:
    print(order.status, order.exchange_id, order.filled)

Ответ accepted значит, что терминал принял команду. Он не значит, что биржа приняла заявку или исполнила её. Исход читайте из счёта: заявка появляется там под своим key.

Чтобы не опрашивать счёт, подпишитесь на account.orders до постановки заявки. См. Счёт.

Снять заявку

terminal.cancel_order(12, "binance:futures:BTCUSDT", "t-173029440000000001")
terminal.cancel_all(12, "binance:futures:BTCUSDT")

Первый вызов принимает ключ заявки в терминале или её идентификатор на бирже. Отправляйте его после того, как у заявки в счёте появился exchange_id. Снятие заявки в состоянии pending ничего не находит на бирже, и заявка остаётся.

Второй вызов снимает все заявки инструмента. Триггерные заявки остаются.

Закрыть позицию

terminal.close_position(12, "binance:futures:BTCUSDT")

На фьючерсах терминал отправляет рыночную заявку на размер позиции. На споте он снимает все заявки инструмента и закрывает позицию одной командой.

Поставить стоп-лосс или тейк-профит

stop_loss = terminal.place_trigger(
    12, "binance:futures:BTCUSDT", kind="stop_loss", trigger_price="59000", client_key="sl-42"
)
print(stop_loss.key)

kind — это stop_loss или take_profit. Оба ставятся на открытую позицию: сторону и размер терминал берёт из неё.

Поставить стоп

stop = terminal.place_trigger(
    12,
    "binance:futures:BTCUSDT",
    kind="stop",
    side="sell",
    notional="800",
    trigger_price="59000",
    rule="price_below_or_equal",
)
print(stop.key)

Стоп — это самостоятельная заявка. Ему нужны свои side и notional, сумма в валюте котировки. rule необязателен: по умолчанию стоп стоит выше рынка для покупки и ниже рынка для продажи.

Перенести триггер

for trigger in terminal.account_orders(12).triggers:
    print(trigger.id, trigger.client_id, trigger.trigger_price)

terminal.amend_trigger(12, "binance:futures:BTCUSDT", 42, kind="stop_loss", trigger_price="58500")

Триггер переносится и снимается по числовому id из счёта, а не по ключу. Его client_id там — это key, который вы получили при постановке.

Терминал заменяет триггер новым. Передайте kind ещё раз, а для стопа ещё и side.

Снять триггер

terminal.cancel_trigger(12, "binance:futures:BTCUSDT", 42)
terminal.cancel_all_triggers(12, "binance:futures:BTCUSDT")

Второй вызов снимает все триггеры инструмента. Обычные заявки остаются.

Изменить плечо

terminal.set_leverage(12, "binance:futures:BTCUSDT", leverage=20)
terminal.set_leverage(12, "binance:futures:BTCUSDT", mode="max")

Плечо есть только у фьючерсов. Передайте либо leverage, целое число от 1, либо mode со значением max или smart.

Прочитать плечо

leverage = terminal.leverage(12, "binance:futures:BTCUSDT")
print(leverage.leverage, leverage.max_leverage, leverage.mode, leverage.margin_mode)

Этому вызову нужно право account:read. Он отвечает 409 not_active, пока инструмент не открывали в терминале и не задавали его плечо.

Изменить режим маржи

terminal.set_margin_mode(12, "binance:futures:BTCUSDT", "isolated")

Режим — это cross или isolated. Биржа отклоняет смену, пока открыта позиция, и ответ accepted этого не показывает.

Когда вызов не удался

Что происходитЧто вы получитеЧто делать
Подключение выключено, только для чтения или без ключей409 not_tradableИспользовать торговое подключение
Неверный аргумент или заявка ниже минимума биржи400 invalid_requestИсправить запрос
Нет открытой позиции, которую можно закрыть или защитить400 invalid_requestСначала прочитать позиции
Больше 10 торговых команд в секунду на весь терминал429 rate_limitedСнизить темп, см. Лимиты
Терминал слишком занят, чтобы принять команду503 unavailableКоманда не отправлена. Отправить её снова
В терминале нет триггерных заявок для этой биржи501 unsupportedПовтор не поможет

Что недоступно

Торговля на Московской бирже (MOEX) недоступна: любой вызов по инструменту moex: отвечает 501 unsupported.

На этой странице