開始使用
- 富邦行情 WebSocket API(富邦新一代 API 行情服務)提供台股即時行情訂閱。
- 支援
Speed/Normal兩種行情模式。 - 需登入後建立行情連線並訂閱頻道。
- 下一步可前往各頻道說明頁。
| 項目 | 說明 |
|---|---|
| 介面 | WebSocket API |
| 市場 | 台股 |
| 模式 | Speed / Normal |
| SDK | Python / Node.js / C# |
| 訂閱方式 | 連線後訂閱頻道 |
富邦行情 WebSocket API 提供台股即時行情服務。透過 WebSocket API 可以滿足您想要接收即時行情的需求。
使用 SDK
富邦行情 WebSocket API 提供 Python 、 Node.js 與 C# SDK。您可以透過以下方式存取 WebSocket API、並透過行情 Mode 模式切換要訂閱的行情:
訂閱 WebSocket Callback 方法獲得下方 Callback 訊息。
行情 Mode 提供 Low Latency Speed Mode 以及完整資訊的 Normal Mode
- Python
- Node.js
- C#
from fubon_neo.sdk import FubonSDK,Mode
def handle_message(message):
print(message)
sdk = FubonSDK()
accounts = sdk.login("Your ID", "Your password", "Your cert path", "Your cert password") # 需登入後,才能取得行情權限
sdk.init_realtime() # 建立行情連線
# 可指定行情連線的Mode , Default 為Speed
# sdk.init_realtime(Mode.Speed) or sdk.init_realtime(Mode.Normal)
stock = sdk.marketdata.websocket_client.stock
stock.on('message', handle_message)
stock.connect()
const { FubonSDK, Mode } = require('fubon-neo');
const sdk = new FubonSDK();
const accounts = sdk.login("Your ID", "Your password", "Your cert path", "Your cert password");
sdk.initRealtime(); // 建立行情連線
// 可指定行情連線的Mode , Default 為Speed
// sdk.initRealtime(Mode.Speed) or sdk.initRealtime(Mode.Normal)
const stock = sdk.marketdata.webSocketClient.stock;
stock.on("message", (message) => {
const data = JSON.parse(message);
console.log(data);
});
(async () => {
await stock.connect();
stock.subscribe({
'channel': 'trades',
'symbol': '2881'
});
})()
using FubonNeo.Sdk;
using FugleMarketData.WebsocketModels;
var sdk = new FubonSDK();
var result = sdk.Login("Your ID", "Your password", "Your cert path", "Your cert password");
sdk.InitRealtime(); // 建立行情連線
// 可指定行情連線的Mode , Default 為Speed
// sdk.InitRealtime(Mode.Speed) or sdk.InitRealtime(Mode.Normal)
var stock = sdk.MarketData.WebSocketClient.Stock;
stock.OnMessage += (msg) => Console.WriteLine($"receive: {msg}");
await stock.Connect();
身份驗證
當驗證成功後,會收到以下訊息:
{
"event": "authenticated",
"data": {
"message": "Authenticated successfully"
}
}
若驗證失敗,則收到以下訊息:
{
"event": "error",
"data": {
"message": "Invalid authentication credentials"
}
}
Heartbeat
每隔 30 秒 WebSocket server 會送出一個 heartbeat 訊息:
{
"event": "heartbeat",
"data": {
"time": "<Timestamp>"
}
}
Ping/Pong
SDK 每 30 秒會自動發送一次 ping 到伺服器;您也可以自行發送 ping,並可額外自訂 state(選填):
- Python
- Node.js
- C#
stock.ping({
'state' : '<ANY>'
})
stock.ping({state:'<ANY>'});
stock.ping("<ANY>");
WebSocket Server 會回應以下訊息 (若 ping 未送 state 則不會有該欄位):
{
"event": "pong",
"data": {
"time": "<TIMESTAMP>",
"state": "<ANY>"
}
}
Channels
富邦行情 WebSocket API 目前提供以下可訂閱頻道:
trades- 接收訂閱股票最新成交資訊books- 接收訂閱股票最新最佳五檔委買委賣資訊indices- 接收訂閱股票最新指數行情資料
訂閱頻道
要訂閱一個頻道可用下方範例進行訂閱:
- Python
- Node.js
- C#
stock.subscribe({
"channel" : "<CHANNEL_NAME>",
"symbol" : "<SYMBOL_ID>"
#"intradayOddLot": True 若要訂閱盤中零股,可再額外加入此參數
})
stock.subscribe({
channel: '<CHANNEL_NAME>',
symbol: '<SYMBOL_ID>',
//intradayOddLot: true 若要訂閱盤中零股,可再額外加入此參數
});
stock.Subscribe(StockChannel.<CHANNEL_NAME>,"<SYMBOL_ID>");
//stock.Subscribe(StockChannel.Trades,new StockSubscribeParams{Symbol="<SYMBOL_ID>", IntradayOddLot=true}); 訂閱盤中零股
訂閱成功後,會收到以下事件回應:
{
"event": "subscribed",
"data": {
"id": "<CHANNEL_ID>",
"channel": "<CHANNEL_NAME>",
"symbol": "<SYMBOL_ID>"
}
}
支援訂閱同頻道的多檔股票:
- Python
- Node.js
- C#
stock.subscribe({
"channel" : "<CHANNEL_NAME>",
"symbols" : ["<SYMBOL_ID>","<SYMBOL_ID>"]
#"intradayOddLot": True 若要訂閱盤中零股,可再額外加入此參數
})
stock.subscribe({
channel: '<CHANNEL_NAME>',
symbols: ['<SYMBOL_ID>','<SYMBOL_ID>']
//intradayOddLot: true 若要訂閱盤中零股,可再額外加入此參數
});
stock.Subscribe(StockChannel.<CHANNEL_NAME>,"<SYMBOL_ID>","<SYMBOL_ID>");
//stock.Subscribe(StockChannel.Trades, new StockSubscribeParams{Symbols = new List<string>{"<SYMBOL_ID>", "<SYMBOL_ID>"}, IntradayOddLot=true}); 訂閱多檔盤中零股
訂閱成功後,會收到以下事件回應:
{
"event": "subscribed",
"data": [
{
"id": "<CHANNEL_ID>",
"channel": "<CHANNEL_NAME>",
"symbol": "<SYMBOL_ID_1>"
},
{
"id": "<CHANNEL_ID>",
"channel": "<CHANNEL_NAME>",
"symbol": "<SYMBOL_ID_2>"
}
]
}
取消訂閱
要取消頻道可用下方範例進行取消:
- Python
- Node.js
- C#
stock.unsubscribe({
'id':'<CHANNEL_ID>'
})
stock.unsubscribe({
id : '<CHANNEL_ID>'
});
stock.Unsubscribe("<CHANNEL_ID>");
取消訂閱成功後,會收到以下事件回應:
{
"event": "unsubscribed",
"data": {
"id": "<CHANNEL_ID>",
"channel" : "<CHANNEL_NAME>",
"symbol" : "<SYMBOL_ID>"
}
}
支援取消訂閱多個頻道:
- Python
- Node.js
- C#
stock.unsubscribe({
'ids':['<CHANNEL_ID>','<CHANNEL_ID>']
})
stock.unsubscribe({
ids : ['<CHANNEL_ID>','<CHANNEL_ID>']
});
stock.Unsubscribe("<CHANNEL_ID>","<CHANNEL_ID>");
取消訂閱成功後,會收到以下事件回應:
{
"event": "unsubscribed",
"data": [
{
"id": "<CHANNEL_ID_1>",
"channel" : "<CHANNEL_NAME>",
"symbol" : "<SYMBOL_ID>"
},
{
"id": "<CHANNEL_ID_2>",
"channel" : "<CHANNEL_NAME>",
"symbol" : "<SYMBOL_ID>"
}
]
}
訂閱資訊
要取得目前連線已訂閱的頻道清單,可用下方範例查詢:
- Python
- Node.js
stock.subscriptions()
stock.subscriptions();
會收到以下事件回應:
{
"event": "subscriptions",
"data": [
{
"id": "<CHANNEL_ID>",
"channel": "<CHANNEL_NAME>",
"symbol": "<SYMBOL_ID>"
}
]
}
錯誤處理
當您所訂閱或處理的 WebSocket Callback 有異常時,您可補充處理錯誤訊息如下。
disconnect 事件在兩種情況觸發:伺服器關閉連線,以及連線健康檢查逾時(超過約 60 秒未收到伺服器任何訊息時,SDK 會主動關閉連線並發出此事件)。逾時斷線在各語言的通知形態,見各範例下方說明。
- Python
- Node.js
- C#
def handle_connect():
print('market data connected')
def handle_disconnect(code, message, *reason): # 連線健康檢查逾時斷線時會多帶一個參數
print(f'market data disconnect: {code}, {message}')
def handle_error(error):
print(f'market data error: {error}')
stock.on("connect", handle_connect)
stock.on("disconnect", handle_disconnect)
stock.on("error", handle_error)
健康檢查逾時斷線時,disconnect 會多帶第三個參數 {'reason': 'health-check-timeout'},handler 以 *reason 接住即可。
stock.on("connect", () => {
console.log("market data connected");
});
stock.on("disconnect", (event, reason) => {
console.log("market data disconnect:", event.code, reason);
});
stock.on("error", (error) => {
console.log("market data error:", error);
});
健康檢查逾時斷線時,disconnect 的第二個參數為 { reason: 'health-check-timeout' }。
stock.OnConnected += (connmsg) => Console.WriteLine($"Connect: {connmsg}");
stock.OnDisconnected += (disconmsg) => Console.WriteLine($"Disconnect: {disconmsg}");
stock.OnError += (errmsg) => Console.WriteLine($"handle error: {errmsg}");
健康檢查需在 Connect 時以第二個參數開啟(Connect(5000, true),第一個參數為驗證逾時毫秒數);逾時斷線時 OnDisconnected 的訊息為 health-check-timeout。未開啟時,連線靜默中斷不會觸發 OnDisconnected。