官方說明文件:https://sinotrade.github.io/tutor/market_data/streaming/stocks/
對於程式交易,會需要在盤中的時候取得盤中的報價或成交資訊。雖然在盤中,也是可以用snapshots或kbars來取得盤中資訊,但在取得這類資訊時,不管對伺服器端或是客戶端,都是比較佔用資源的。透過subscribe,你可以訂閱多個金融商品的報價或成交資訊,也可以針對回傳的內容,撰寫對應的執行動作(程式)。
另外,跟其它報價資訊相比,目前subscribe是一個連線最多可以訂閱200個內容。
api.quote.subscribe(
contract: shioaji.contracts.Contract, #contract金融商品資訊
quote_type: shioaji.constant.QuoteType = <QuoteType.Tick: 'tick'>, #報價類型,預設為tick資料
intraday_odd: bool = False, #盤中零股,預設為False,即現股資料
version: shioaji.constant.QuoteVersion = <QuoteVersion.v0: 'v0'>, #報價資訊類型,預設為v0版
)
若要取消訂閱,可呼叫api.quote.unsubscribe,使用方式及參數與subscribe相同
subscribe在使用上,stock跟future沒有差別,但在回傳的資訊上有些微的不同,所以此部份會把stock跟future分開說明,此篇先說明stock個股的部份。
而QuoteVersion有分v1和v0版,v0版是簡易的報價內容,v1版是詳細的報價內容,以下也會分別說明v0版及v1版的使用方式及報價內容。
如同之前所介紹的,tick是指成交的報價內容,所以只要有成交,就會回傳一筆資料。
訂閱個股盤中tick v1版報價資訊,範例如下:
from shioaji import TickSTKv1, Exchange #從shioaji模組,匯入TickSTKv1及Exchange物件
from threading import Event #threading模組,匯入Event物件
#訂閱個股盤中tick資訊
api.quote.subscribe(
api.Contracts.Stocks["2330"],
quote_type = sj.constant.QuoteType.Tick, # or 'tick'
version = sj.constant.QuoteVersion.v1 # or 'v1'
)
Event().wait() #盤中執行程式時,若看不到quote_callback的執行結果,請加入此行
# 定義quote_callback,即回傳報價資訊時所要執行的動作
@api.on_tick_stk_v1()
def quote_callback(exchange: Exchange, tick:TickSTKv1):
print(f"Exchange: {exchange}, Tick: {tick}") #將報價資訊內容輸出至console中
Tick QuoteVersion.v1,quote_callback的執行結果
Exchange.TSE Tick(code='2330', datetime=datetime.datetime(2021, 9, 24, 11, 19, 42, 535354), open=Decimal('591'), avg_price=Decimal('593.06'), close=Decimal('596'), high=Decimal('597'), low=Decimal('590'), amount=Decimal('596000'), total_amount=Decimal('5626423000'), volume=1, total_volume=9487, tick_type=1, chg_type=2, price_chg=Decimal('8'), pct_chg=Decimal('1.36'), bid_side_total_vol=7328, ask_side_total_vol=2159, bid_side_total_cnt=1654, ask_side_total_cnt=489, closing_oddlot_shares=0, fixed_trade_vol=0, suspend=0, simtrade=0, intraday_odd=0)
Tick QuoteVersion.v1的報價內容說明
屬性 | 值 | 說明 |
---|---|---|
code | '2330' | 股票代碼 |
datetime | datetime.datetime(2021, 9, 24, 11, 19, 42, 535354) | 時間 |
open | Decimal('591') | 開盤 |
avg_price | Decimal('593.06') | 均價 |
close | Decimal('596') | 成交價 |
high | Decimal('597') | 最高 |
low | Decimal('590') | 最低 |
amount | Decimal('596000') | 成交金額 |
total_amount | Decimal('5626423000') | 總成交金額 |
volume | 1 | 成交量 |
total_volume | 9487 | 總成交量 |
tick_type | 1 | tick類型 |
chg_type | 2 | 變動類型 |
price_chg | Decimal('8') | 變動金額 |
pct_chg | Decimal('1.36') | 變動百分比 |
bid_side_total_vol | 7328 | 買盤成交總量,單位:張 |
ask_side_total_vol | 2159 | 賣盤成交總量,單位:張 |
bid_side_total_cnt | 1654 | 買盤成交筆數 |
ask_side_total_cnt | 489 | 賣盤成交筆數 |
closing_oddlot_shares | 0 | 盤後零股成交股數 |
fixed_trade_vol | 0 | 盤後定價成交量 |
suspend | 0 | 是否為暫停交易 |
simtrade | 0 | 是否為試撮 |
intraday_odd | 0 | 是否為盤中零股 |
訂閱個股盤中tick v0版報價資訊,範例如下: |
api.quote.subscribe(
api.Contracts.Stocks["2330"],
quote_type = sj.constant.QuoteType.Tick, # 報價類型為Tick
version = sj.constant.QuoteVersion.v0 # 回傳資訊版本為v0
)
# 定義quote_callback,即回傳報價資訊時所要執行的動作
@api.quote.on_quote
def quote_callback(topic: str, quote: dict):
print(f"Topic: {topic}, Quote: {quote}")
Tick QuoteVersion.v0,quote_callback的執行結果
MKT/idcdmzpcr01/TSE/2330 {'AmountSum': [5641317000.0], 'Close': [596.0], 'Date': '2021/09/24', 'TickType': [1], 'Time': '11:23:30.154501', 'VolSum': [9512], 'Volume': [2]}
Tick QuoteVersion.v0的報價內容說明
屬性 | 值 | 說明 |
---|---|---|
AmountSum | [5641317000.0] | 總成交金額 |
Close | [596.0] | 成交價 |
Date | '2021/09/24' | 日期 |
TickType | [1] | Tick類型 |
Time | '11:23:30.154501' | 時間 |
VolSum | [9512] | 總成交量 |
Volume | [2] | 成交量 |
bidask是指委買委賣的資訊,也就是看盤軟體中最佳五檔的資料內容
訂閱個股盤中bidask v1版報價資訊,範例如下:
api.quote.subscribe(
api.Contracts.Stocks["2330"],
quote_type = sj.constant.QuoteType.BidAsk, #報價類型為BidAsk
version = sj.constant.QuoteVersion.v1 # 回傳資訊版本為v1
)
Event().wait()
# 定義quote_callback,即回傳報價資訊時所要執行的動作
@api.on_bidask_stk_v1()
def quote_callback(exchange: Exchange, bidask:BidAskSTKv1):
print(f"Exchange: {exchange}, BidAsk: {bidask}")
BidAsk QuoteVersion.v1,quote_callback的執行結果
Exchange.TSE BidAsk(code='2330', datetime=datetime.datetime(2021, 9, 24, 11, 27, 11, 42526), bid_price=[Decimal('595'), Decimal('594'), Decimal('593'), Decimal('592'), Decimal('591')], bid_volume=[405, 245, 746, 454, 260], diff_bid_vol=[0, 0, 0, 0, 0], ask_price=[Decimal('596'), Decimal('597'), Decimal('598'), Decimal('599'), Decimal('600')], ask_volume=[121, 364, 359, 415, 657], diff_ask_vol=[-1, 0, 0, 0, 0], suspend=0, simtrade=0, intraday_odd=0)
Tick QuoteVersion.v1的報價內容說明
屬性 | 值 | 說明 |
---|---|---|
code | '2330' | 股票代碼 |
datetime | datetime.datetime(2021, 9, 24, 11, 27, 11, 42526) | 時間 |
bid_price | [Decimal('595'), Decimal('594'), Decimal('593'), Decimal('592'), Decimal('591')] | 委買價 |
bid_volume | [405, 245, 746, 454, 260] | 委買量 |
diff_bid_vol | [0, 0, 0, 0, 0] | 委買量差異(增減) |
ask_price | [Decimal('596'), Decimal('597'), Decimal('598'), Decimal('599'), Decimal('600')] | 委賣價 |
ask_volume | [121, 364, 359, 415, 657] | 委賣量 |
diff_ask_vol | [-1, 0, 0, 0, 0] | 委賣量差異(增減) |
suspend | 0 | 是否為暫停交易 |
simtrade | 0 | 是否為試撮 |
intraday_odd | 0 | 是否為盤中零股 |
訂閱個股盤中bidask v0版報價資訊,範例如下: |
api.quote.subscribe(
api.Contracts.Stocks["2330"],
quote_type = sj.constant.QuoteType.BidAsk, #報價類型為BidAsk
version = sj.constant.QuoteVersion.v0 # 回傳資訊版本為v0
)
Event().wait()
@api.quote.on_quote
def quote_callback(topic: str, quote: dict):
print(f"Topic: {topic}, Quote: {quote}")
BidAsk QuoteVersion.v0,quote_callback的執行結果
QUT/idcdmzpcr01/TSE/2330 {'AskPrice': [596.0, 597.0, 598.0, 599.0, 600.0], 'AskVolume': [124, 381, 358, 416, 656], 'BidPrice': [595.0, 594.0, 593.0, 592.0, 591.0], 'BidVolume': [407, 246, 745, 454, 260], 'Date': '2021/09/24', 'Time': '11:28:01.797097'}
Tick QuoteVersion.v0的報價內容說明
屬性 | 值 | 說明 |
---|---|---|
AskPrice | [596.0, 597.0, 598.0, 599.0, 600.0] | 委賣價 |
AskVolume | [124, 381, 358, 416, 656] | 委賣量 |
BidPrice | [595.0, 594.0, 593.0, 592.0, 591.0] | 委買價 |
BidVolume | [407, 246, 745, 454, 260] | 委買量 |
Date | '2021/09/24' | 日期 |
Time | '11:28:01.797097' | 時間 |