绘图 - 即时成交资料

以下内容,都是 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
  • 登入 shioaji
api = sj.Shioaji()
api.login(person_id="帐号", passwd="密码")
  • 建立表格的资料集
ask_bid_period_length = 500
ask_bid_static = np.zeros((6, ask_bid_period_length))
ask_deal_count = 0
bid_deal_count = 0


tick_plot_length = 150
new_index = 0
new_vol = 1

data_in = np.random.rand(2)
data_inner = np.random.rand(2)
data_outer = np.random.rand(4)
  • 建立绘图的方法
def pie_chart():
    global data_in, data_inner, data_outer
    global pie_outer, pie_inner, pie_in
    outer_pie_radius = [180, 150]
    inner_pie_radius = [100, 70]
    in_pie_radius = [50, 10]

    pie_outer = bq.Pie(
        size = data_outer,
        display_labels = "outside",
        apply_clip = False,
        radius = outer_pie_radius[0],
        inner_radius = outer_pie_radius[1],
        display_values = True,
        values_format = '.0%',
        colors = ['red', 'limegreen', 'red', 'limegreen'],
        labels = ['大单委卖成交', '大单委买成交', '小单委卖成交', '小单委买成交']
    )
    
    pie_inner = bq.Pie(
        size = data_inner,
        display_labels = 'inside',
        apply_clip = False,
        radius = inner_pie_radius[0],
        inner_radius = inner_pie_radius[1],
        display_value = True,
        values_format = '.0%',
        colors = ['red', 'limegreen'],
        labels = ['卖成笔', '买成笔']
    )
    
    pie_in = bq.Pie(
        size = data_in,
        display_labels = 'inside',
        radius = in_pie_radius[0],
        inner_radius = inner_pie_radius[1],
        display_values = True,
        values_format = '.0%',
        colors = ['limegreen', 'red'],
        labels = ['卖成口', '买成口']
    )
    
    fig = bq.Figure(
        marks = [pie_outer, pie_inner, pie_in],
        animation_duration = 1000,
    )
    
    return fig
  • 建立资料处理方法
def proc_ask_bid_staticdata(topic, quote_msg, vol_threshold):
    global ask_bid_static
    global small_bid_deal_volsum, ask_deal_count, bid_deal_count
    ask_volsum = quote_msg.get('TradeAskVolSum', 0)
    bid_volsum = quote_msg.get('TradeBidVolSum', 0)
    new_vol = quote_msg.get('Volume', [0,])[-1]
    
    ask_bid_static[:, :-1] = ask_bid_static[:, 1:]
    if new_askbid_color_data == 1:
        ask_deal_count += 1
        ask_bid_static[4][-1] = 1
        ask_bid_static[5][-1] = 0
        if new_vol >= vol_threshold:
            ask_bid_static[0][-1] = new_vol
        else:
            ask_bid_static[1][-1] = new_vol
    elif new_askbid_color_data == 2:
        bid_deal_count += 1
        ask_bid_static[5][-1] = 1
        ask_bid_static[4][-1] = 0
        if new_vol >= vol_threshold:
            ask_bid_static[2][-1] = new_vol
        else:
            ask_bid_static[3][-1] = new_vol
    
    ask_bid_static_sum = ask_bid_static.sum(axis=1)
    data_outer = ask_bid_static_sum[:4]
    data_inner = ask_bid_static_sum[4:]
    data_in = np.array([ask_volsum, bid_volsum])
  • 建立图表更新方法
def update_pie_chart(update_freq):
    global pie_outer, pie_inner, pie_in

    if (new_index % update_freq) == 0 and new_index >= tick_plot_length:
        with pie_outer.hold_sync() and pie_inner.hold_sync() and pie_in.hold_sync():
            pie_outer.sizes = data_outer / data_outer.sum()
            pie_inner.sizes = data_inner / data_inner.sum()
            pie_in.sizes = data_in / data_in.sum()
  • 建立取得价格後的回呼方法
@sj.on_qoute
def qoute_callback(topic, quote_msg):
    global tick_plot_length
    global pie_outer, pie_inner, pie_in
    global new_index, new_vol
    global large_ask_deal_volsum, small_ask_deal_volsum, large_bid_deal_volsum
    global large_bid_deal_volsum, ask_deal_count, bid_deal_count
    global ask_bid_static
    vol_threshold = 10

    if topic.startswith('L'):
        proc_ask_bid_staticdata(topic, quote_msg, vol_threshold)
        update_pie_chart(update_freq=1)
  • 建立 solace 事件回呼方法
@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)
  • 绘图
pie_chart()
  • 订阅报价
stock2330 = api.Contracts.Stocks["2330"]
api.quote.subscribe(stock2330, quote_type="bidask")

因为我是在盘後才跑这个程序,所以没有办法取得即资料,所以暂时不确定以上的程序能不能正确运行,之後如果有机会在交易时间跑的话,会再验证,如果有问题的话,会再修改。


<<:  Day13:13 - 购物车服务(1) - 後端 - 购物车总商品显示、加入购物车API

>>:  第 12 集:Sass 编译环境

设定IAM

Mail & Google Group设定 今天来聊聊昨天延续的话题,如何设置什麽 人 这个...

Day-23 Model 可以重复使用吗? 储存和读取 Model

总算,我们已经会建立自己独一无二的神经网路了~但,你有没有发现一个问题,我们的该不会每次要使用模型...

Day 22:如何增加你 Hexo 的选单 Icon?

之前不管是介绍到主选单或是 Social Links,可以发现它本身都有预设的 Icon 图示可以对...

Day 16 - 函数与物件互动3

接下来我们就可以制作一个myflower的object 去制作一个绽放花点的设定 Learp 使用 ...

GCP GAE

什麽事GAE 什麽事GAE (Goolge App Engine) 它是用来快速的建立服务的服务项目...