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

Счёт

Заявки, позиции, балансы и исполнения подключения: как их прочитать и как следить за изменениями.

Всем вызовам на этой странице нужны право account:read и connection_id. У счёта нет подключения по умолчанию: возьмите идентификатор из connections(). Цены и объёмы передаются десятичными строками, время — в миллисекундах UTC.

Открытые заявки

orders = terminal.account_orders(12)
for order in orders.data:
    print(order.key, order.exchange_id, order.side, order.price, order.remaining, order.status)
for trigger in orders.triggers:
    print(trigger.id, trigger.trigger_type, trigger.trigger_price)

В data лежат открытые заявки, в triggers — стоп-лоссы, тейк-профиты и стопы. key — ключ заявки в терминале, exchange_id — её идентификатор на бирже. Каждое из этих полей пустое, пока значение неизвестно.

Позиции

positions = terminal.account_positions(12)
for position in positions.data:
    print(position.instrument, position.side, position.size, position.entry_price, position.unrealized_pnl)

size считается в базовой монете. На MOEX — в лотах по lot_size базовых единиц.

unrealized_pnl и mark_price терминал считает сам. Цена маркировки — это лучший bid для лонга и лучший ask для шорта.

Балансы

balances = terminal.account_balances(12)
for balance in balances.data:
    print(balance.currency, balance.total, balance.available, balance.locked)

Терминал собирает балансы с момента включения API. Валюты, которая с тех пор не менялась, в списке нет.

Исполнения

fills = terminal.account_fills(12, limit=50)
for fill in fills.data:
    print(fill.ts, fill.instrument, fill.side, fill.price, fill.qty, fill.fee)
if fills.data:
    newer = terminal.account_fills(12, since_ts=fills.data[-1].ts)

Исполнения идут от старых к новым. limit — от 1 до 1000, по умолчанию 100. since_ts оставляет исполнения начиная с этого времени биржи.

Терминал хранит последнюю тысячу исполнений подключения, собранных с момента включения API. Выключение подключения стирает его исполнения и балансы.

Следить за изменениями

import asyncio
from spectre_terminal import Event

async def main():
    async with terminal.stream() as stream:
        await stream.subscribe("account.orders", connection_id=12)
        await stream.subscribe("account.fills", connection_id=12)
        async for frame in stream:
            if not isinstance(frame, Event):
                continue
            if frame.topic == "account.orders":
                print(frame.data.instrument, len(frame.data.orders), len(frame.data.triggers))
            elif frame.topic == "account.fills":
                print(frame.data.instrument, frame.data.side, frame.data.price, frame.data.qty)

asyncio.run(main())
ТопикЧто несёт кадр
account.ordersВсе заявки и триггеры одного инструмента. Замените им свой список.
account.positionsПозиция по одному инструменту. Пустая, когда позиция закрыта.
account.balancesБаланс одной валюты.
account.fillsОдно исполнение.

Подписка не присылает начальное состояние. Сначала прочитайте его вызовами выше.

Клиент, который читает слишком медленно, может пропустить исполнение. Чтобы наверстать, прочитайте исполнения ещё раз с since_ts. Подробнее в разделе Стриминг.

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