Перейти до вмісту

Рахунок

Читайте заявки, позиції, баланси й виконання підключення та стежте за їхніми змінами.

Кожному виклику на цій сторінці потрібні право account:read і connection_id. Рахунок не має типового підключення: беріть 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 залишає виконання, починаючи з цього часу біржі.

Термінал зберігає останні 1000 виконань підключення, зібрані з моменту ввімкнення 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. Докладніше: Стрімінг.

На цій сторінці