Счёт
Заявки, позиции, балансы и исполнения подключения: как их прочитать и как следить за изменениями.
Всем вызовам на этой странице нужны право 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. Подробнее в разделе
Стриминг.