以下內容,都是 shioaji 的官網文件的內容,只是加了一些我自己的理解,感謝永豐提供這麼完整的 sample code
繪圖會用到 numpy, pandas, bqplot...等套件,如果之前沒有安裝,可以先行安裝
pip install numpy pandas bqplot
import json
import datetime as dt
import numpy as np
import pandas as pd
import bqplot as bq
import shioaji as sj
api = sj.Shioaji()
api.login(person_id="帳號", passwd="密碼")
last_code = 10200
tick_plot_length = 150
x_tick_index = np.arange(tick_plot_length)
y_price = np.zeros((tick_plot_length,)) + last_code
y_vol = np.zeros((tick_plot_length,))
updown_color = np.zeros((tick_plot_length,)) + 1
askbid_color_data = np.zeros((tick_plot_length,))
new_index = 0
new_deal_price = 1
new_vol = 1
new_updown_color = 1
new_askbid_color_data = 1
ask_price = 0
bid_price = 0
def init_tickchar():
global line_chart, scatter_chart
global x_tick_index, y_price, y_vol, updown_color, askbid_color_data
x_sc = bq.LinearScale()
y_sc = bq.LinearScale()
sc_size = bq.LinearScale()
color_line = bq.ColorScale(colors=['red', 'gray', 'green'])
c_ord = bq.ColorScale(colors=['gray', 'HotPink', 'SeaGreen'])
line_chart = bq.FlexLine(
x = x_tick_index,
y = y_price,
color = updown_color,
scales = {'x': x_sc, 'y': y_sc, 'color': color_line},
display_legend = True,
labels = ["台積電"]
)
def_tt = bq.Tooltip(
fields = ['x', 'y', 'size'],
formats = ['', '.0f', '.0f'],
labels = ['tick', 'price', 'vol']
)
scatter_chart = bq.Scatter(
x = x_tick_index,
y = y_price,
size = y_vol,
color = askbid_color_data,
scales = {'x': x_sc, 'y': y_sc, 'size': sc_size, 'color': c_ord},
tooltip = def_tt,
labels = ['tick', 'price', 'vol'],
selected_style = {'opacity': 1.0},
unselected_style = {'opacity': 0.7}
)
ax_x = bq.Axis(scale=x_sc)
ax_y = bq.Axis(scale=y_sc, orientation='vertical', tick_format='0.0f')
ax_color = bq.ColorAxis(label='updown', scale=color_line, tick_format='.0f')
fig = bq.Figure(marks=[line_chart, scatter_chart], axes=[ax_x, ax_y, ax_color],)
return fig
def proc_tick_chartdata(topic, quote_msg):
global new_index, new_deal_price, new_vol, new_updown_color, new_askbid_color_data
global x_tick_index, y_price, y_vol, updown_color, askbid_color_data
new_index += 1
new_deal_price = quote_msg.get('close', [0,])[-1]
new_vol = quote_msg.get('Volume', [0,])[-1]
ask_volsum = quote_msg.get('TradeAskVolSum', 0)
bid_volsum = quote_msg.get('TradeBidVolSum', 0)
new_askbid_color_data = quote_msg.get('TickType', [0,])[-1] # 0: -, 1: ask, 2: bid
if new_deal_price > y_price[-1]:
new_updown_color = 0
elif new_deal_price < y_price[-1]:
new_updown_color = 2
else:
new_updown_color = 1
x_tick_index[:-1] = x_tick_index[1:]
x_tick_index[-1] = new_index
y_price[:-1] = y_price[1:]
y_price[:-1] = new_deal_price
y_vol[:-1] = y_vol[1:]
y_vol[:-1] = new_vol
updown_color[:-1] = updown_color[1:]
updown_color[-2] = new_updown_color
askbid_color_data[:-1] = askbid_color_data[1:]
askbid_color_data[-1] = new_askbid_color_data
def update_tick_chart(update_freq):
global line_chart, scatter_chart
if (new_index % update_freq == 0) and new_index >= tick_plot_length:
with line_chart.hold_sync() and scatter_chart.hold_sync():
line_chart.x = x_tick_index.copy()
line_chart.y = y_price.copy()
line_chart.color = updown_color.copy()
scatter_chart.x = x_tick_index.copy()
scatter_chart.y = y_price.copy()
scatter_chart.size = y_vol.copy() * 10
scatter_chart.color = askbid_color_data.copy()
@sj.on_quote
def update_tick_chart(update_freq):
global line_chart, scatter_chart
if (new_index % update_freq == 0) and new_index >= tick_plot_length:
with line_chart.hold_sync() and scatter_chart.hold_sync():
line_chart.x = x_tick_index.copy()
line_chart.y = y_price.copy()
line_chart.color = updown_color.copy()
scatter_chart.x = x_tick_index.copy()
scatter_chart.y = y_price.copy()
scatter_chart.size = y_vol.copy() * 10
scatter_chart.color = askbid_color_data.copy()
@sj.on_event
def event_callback(resp_code, event_code, event):
print("Response Code: {} | Event Code: {} | Event: {}".format(resp_code, event_code, event))
api.quote.set_callback(quote_callback)
api.quote.set_event_callback(event_callback)
init_tickchar()
stock2330 = api.Contracts.Stocks["2330"]
api.quote.subscribe(stock2330, quote_type="bidask")
因為我是在盤後才跑這個程式,所以沒有辦法取得即資料,所以暫時不確定以上的程式能不能正確運行,之後如果有機會在交易時間跑的話,會再驗證,如果有問題的話,會再修改。