EVENT I/F(リアルタイム通知)
EVENT I/F では WebSocket または HTTP を使って、時価情報や注文約定の通知をリアルタイムで受信できます。
接続方法
ログイン時に取得した sUrlEvent(HTTP)または sUrlEventWebSocket(WebSocket)に接続します。
{sUrlEvent}?p_rid=0&p_board_no=1000&p_eno=0&p_evt_cmd=EC
通知種別(p_evt_cmd)
| 値 | 説明 |
|---|---|
ST | エラーステータス通知 |
KP | キープアライブ(5秒間無通知時) |
FD | 時価情報配信 |
EC | 注文約定通知 |
NS | ニュース通知 |
SS | システムステータス |
US | 運用ステータス |
複数指定する場合はカンマ区切りで指定します(例: EC,NS,SS)。
WebSocket での注文約定通知受信(Python)
import asyncio
import websockets
async def receive_notifications(ws_url):
url = f"{ws_url}?p_rid=0&p_board_no=1000&p_eno=0&p_evt_cmd=EC"
async with websockets.connect(url) as ws:
print("EVENT I/F に接続しました")
async for message in ws:
# 通知データは ^A, ^B, ^C を区切り子とした文字列
fields = {}
for item in message.split("\x01"): # ^A
if "\x02" in item: # ^B
key, value = item.split("\x02", 1)
fields[key] = value
cmd = fields.get("p_cmd", "")
if cmd == "EC":
print(f"注文約定通知:")
print(f" 通知種別: {fields.get('p_NT')}")
print(f" 注文番号: {fields.get('p_ON')}")
print(f" 銘柄: {fields.get('p_IC')} {fields.get('p_IN')}")
print(f" 約定ステータス: {fields.get('p_EXST')}")
elif cmd == "KP":
pass # キープアライブ
asyncio.run(receive_notifications(url_event_websocket))
通知データの構造
通知データは以下の区切り子を使った文字列形式です。
| 区切り子 | 制御文字 | 役割 |
|---|---|---|
^A | \x01 | 項目間の区切り |
^B | \x02 | 項目名と値の区切り |
^C | \x03 | 値と値の区切り(配列値) |
通知例
p_no^B70^Ap_date^B2018.12.03-13:22:43.921^Ap_cmd^BEC^Ap_NT^B100^Ap_ON^B3000945^Ap_IC^B2468
詳細は API リファレンス の注文約定通知(EC)を参照してください。
利用上の注意
接続は後勝ち
EVENT I/F は常時接続で利用するため、1 接続のみ受け付けます。新しい接続が確立されると、先行する接続は自動的に切断されます(後要求勝ち)。
通知の受信順序
REQUEST I/F で注文を送信し応答を受け取った後に EVENT I/F で通知を受信する流れが基本ですが、通信環境やプログラムの処理状況によって応答と通知の受信順序が逆転する場合があります。プログラム設計時にはこの点を考慮してください。
時価通知の間引き
時価情報(FD)の通知には間引き処理が行われています。また、通信環境によってデータの受信が遅延する場合があります。