Рыночные данные (securities)
#!pip install moexalgo
#!pip install matplotlib
import pandas as pd
from moexalgo.beta import issplus
# Данные для входа
ws_login = 'ваш_логин'
ws_passcode = 'ваш_пароль'
ticker = 'SBER'
async def websocket_securities():
url = 'wss://iss.moex.com/infocx/v3/websocket'
credentials = issplus.Credentials('passport', ws_login, ws_passcode)
df_snapshot = None
count = 0
async with issplus.connect(url, credentials) as client:
# Подписка на рыночные данные
destination = 'MXSE.securities'
selector = f'TICKER="MXSE.TQBR.{ticker}"'
subscription = await client.subscribe(destination, selector)
print(f"Подписка ID: {subscription.id}\n")
async for data in subscription:
msg_type = data['properties']['type']
# Первое сообщение (snapshot) - полный снимок данных
if msg_type == 'snapshot':
df_snapshot = pd.DataFrame(data['data'], columns=data['columns'])
cols = list(df_snapshot.columns)
print(f"Доступные поля ({len(cols)}):")
for i in range(0, len(cols), 5):
print(" " + ", ".join(cols[i:i+5]))
print(f"\nСнэпшот (snapshot):")
print(df_snapshot[['TICKER', 'LAST', 'BID', 'OFFER', 'VOLTODAY', 'VALTODAY', 'NUMTRADES']].T)
print()
# Последующие сообщения (updates) - только изменившиеся поля
elif msg_type == 'updates':
count += 1
print(f"Обновление (updates) #{count}")
df_update = pd.DataFrame(data['data'], columns=data['columns'])
print(df_update)
# Обновляем значения снэпшота (snapshot)
if df_snapshot is not None:
for col in df_update.columns:
if col in df_snapshot.columns:
df_snapshot.at[0, col] = df_update.at[0, col]
print()
# Остановка после пяти итераций (для примера)
if count >= 5:
break
return df_snapshot
securities_snapshot = await websocket_securities()
Subscription ID: afefd79d-bb0b-43c0-8889-206d6d75019c
Доступные поля (41):
TICKER, CAPTION, LAST, CHANGE, BID
OFFER, HIGH, LOW, HIGHBID, LOWOFFER
BIDDEPTHT, OFFERDEPTHT, VOLTODAY, VALTODAY, NUMTRADES
LCLOSEPRICE, LCURRENTPRICE, PREVPRICE, WAPRICE, PREVWAPRICE
PRICEMINUSPREVWAPRICE, QTY, VALUE, BASEPRICE, MARKETPRICE
CURRENCYID, SETTLECODE, SETTLEDATE1, SETTLEDATE2, LOTSIZE
FACEUNIT, FACEVALUE, ISSUESIZE, ADMITTEDQUOTE, TRADINGSTATUS
STATUS, DPVALINDICATORBUY, DPVALINDICATORSELL, TIME, MINSTEP
PRICEMINSTEP
Снэпшот (snapshot):
0
TICKER MXSE.TQBR.SBER
LAST [306.13, 2]
BID [306.12, 2]
OFFER [306.13, 2]
VOLTODAY [1322700, 0]
VALTODAY 405375659
NUMTRADES 10774
Обновление (updates) #1
TICKER LAST CHANGE BIDDEPTHT OFFERDEPTHT \
0 MXSE.TQBR.SBER [306.12, 2] [-0.37, 2] 1685771 3001280
VOLTODAY VALTODAY NUMTRADES PRICEMINUSPREVWAPRICE QTY \
0 [1322706, 0] 405377496 10775 [0.7, 2] 6
VALUE TIME
0 [1836.72, 2] 09:51:20
Обновление (updates) #2
TICKER BIDDEPTHT
0 MXSE.TQBR.SBER 1685771
Обновление (updates) #3
TICKER BIDDEPTHT
0 MXSE.TQBR.SBER 1685741
Обновление (updates) #4
TICKER BIDDEPTHT
0 MXSE.TQBR.SBER 1685739
Обновление (updates) #5
TICKER BIDDEPTHT
0 MXSE.TQBR.SBER 1685738
# Финальный снэпшот (snapshot)
securities_snapshot.T
| 0 | |
|---|---|
| TICKER | MXSE.TQBR.SBER |
| CAPTION | Sberbank |
| LAST | [306.12, 2] |
| CHANGE | [-0.37, 2] |
| BID | [306.12, 2] |
| OFFER | [306.13, 2] |
| HIGH | [307.0, 2] |
| LOW | [305.89, 2] |
| HIGHBID | [310.0, 2] |
| LOWOFFER | [295.0, 2] |
| BIDDEPTHT | 1685738 |
| OFFERDEPTHT | 3001280 |
| VOLTODAY | [1322706, 0] |
| VALTODAY | 405377496 |
| NUMTRADES | 10775 |
| LCLOSEPRICE | None |
| LCURRENTPRICE | [306.24, 2] |
| PREVPRICE | [306.49, 2] |
| WAPRICE | [306.48, 2] |
| PREVWAPRICE | [305.42, 2] |
| PRICEMINUSPREVWAPRICE | [0.7, 2] |
| QTY | 6 |
| VALUE | [1836.72, 2] |
| BASEPRICE | None |
| MARKETPRICE | [305.44, 2] |
| CURRENCYID | SUR |
| SETTLECODE | Y1 |
| SETTLEDATE1 | 2026-01-23 |
| SETTLEDATE2 | None |
| LOTSIZE | 1 |
| FACEUNIT | SUR |
| FACEVALUE | [3, 0] |
| ISSUESIZE | 21586948000 |
| ADMITTEDQUOTE | None |
| TRADINGSTATUS | T |
| STATUS | A |
| DPVALINDICATORBUY | None |
| DPVALINDICATORSELL | None |
| TIME | 09:51:20 |
| MINSTEP | [0.01, 2] |
| PRICEMINSTEP | [0.01, 2] |