共计 2943 个字符,预计需要花费 8 分钟才能阅读完成。
相比于历史数据,收费的实时数据获取比拟艰难,好在各大券商根本都提供了接口,只有开户入金后基本上都能开明获取实时数据的权限。这里次要以港美股为主的富途进行相干介绍。
实时数据
相比于 A 股对于程序化交易的限度,港美股券商提供了丰盛的接口,残缺文档可参见富途的开放平台:Futu OpenAPI 介绍
实时 K 线
相干文档可参见:获取实时 K 线
资金流向
除了 K 线以外,富途还提供了资金流向这种根本数据。相干文档可参见:获取资金流向
自定义图形和指标
利用下面的接口获取到实时数据后,即可显示自定义的分时图。
分时图中的均线
依据分时图中均线的定义:累计成交额除以累计成交量
def indicators_ma():
data["ma"] = data['turnover'].cumsum()/data["volume"].cumsum()
KDJ 指标
KDJ
指标须要应用 talib.STOCH
进行计算,但即使如此,计算失去的数值依然与常见平台的数值有差别。
def indicators_kdj():
data["K"], data["D"] = talib.STOCH(data["high"].values,
data["low"].values,
data["close"].values,
fastk_period=9,
slowk_period=3,
slowk_matype=0,
slowd_period=3,
slowd_matype=0)
data["J"] = 3 * data["K"] - 2 * data["D"]
事件处理
相比于上一节的图形,此节增加事件处理,使其在鼠标挪动时显示对应工夫点的数据。
显示数据采纳文本和题目的形式,即当鼠标进入子图时,生成以后工夫的收盘、开盘、最高、最低等数据拼成的文本信息,并批改各个指标字图的题目。
事件注册
增加进出 axes
和挪动鼠标的事件处理
fig.canvas.mpl_connect('axes_enter_event', enter_axes)
fig.canvas.mpl_connect('axes_leave_event', leave_axes)
fig.canvas.mpl_connect('motion_notify_event', on_move)
移出子图
当鼠标移出子图时设置文本框为暗藏。
def leave_axes(event):
ax = event.inaxes
if ax is None:
return
for text in text_data.values():
text.set_visible(False)
event.canvas.draw_idle()
移入子图
当鼠标移入子图时判断鼠标地位是在左侧还是右侧,在左侧时文本框在右侧显示,在右侧时文本框在左侧显示,防止遮挡。
def enter_axes(event):
ax = event.inaxes
if ax is None:
return
idx = int(event.xdata)
x = 0.1
if idx < data_size / 2:
x = 0.9
key_show = '%.1f' % x
if text_data.get(key_show) is not None:
text_data[key_show].set_visible(True)
key_hide = '%.1f' % (1-x)
if text_data.get(key_hide) is not None:
text_data[key_hide].set_visible(False)
event.canvas.draw_idle()
鼠标挪动
当鼠标挪动时顺次遍历各个子图,首先获取工夫,而后依据工夫获取该工夫点的各个指标数据,并重置题目;而后获取收盘、开盘、最高、最低、均值数据重置文本框内容;最初判断文本框应该在哪一侧显示。
def on_move(event):
ax = event.inaxes
if ax is None:
return
idx = int(event.xdata)
if idx < 0 or idx >= data_size:
return
# show title
for key, ax in axes_data.items():
if key == "main":
continue
if key == "kdj":
ax.set_title("".join([key.upper(),"K: %.3f"% data["K"][idx],"D: %.3f"% data["D"][idx],"J: %.3f"% data["J"][idx]]),
loc='left', y=1, fontsize="large")
elif key == "macd":
ax.set_title("".join([key.upper(),"DIF: %.3f"% data["macd"][idx],"DEA: %.3f"% data["macd_signal"][idx],"MACD: %.3f"% (data["macd_hist"][idx]*2)]),
loc='left', y=1, fontsize="large")
elif key == "vol":
ax.set_title("".join([" 交易量 ","%.2f W"% (data["volume"][idx]/10000)]),
loc='left', y=1, fontsize="large")
elif key == "flow":
ax.set_title("".join([" 资金流向 ","%.2f W"% (data["flow"][idx]/10000)]),
loc='left', y=1, fontsize="large")
# show text
ax = axes_data["main"]
x, y = 0.1, 0.9
if idx < data_size / 2:
x = 0.9
key_show = "%.1f" % x
key_hide = "%.1f" % (1-x)
textstr = '\n'.join((r'%s' % data["time_key"][idx],
r'收盘: %.1f' % data["open"][idx],
r'开盘: %.1f' % data["close"][idx],
r'最高: %.1f' % data["high"][idx],
r'最低: %.1f' % data["low"][idx],
r'均值: %.1f' % data["ma"][idx]))
text = text_data.get(key_show)
if text is None:
text = ax.text(x, y, textstr, transform=ax.transAxes, fontsize=14,
verticalalignment='top', bbox=props, clip_on=False)
text_data[key_show] = text
else:
if text_data.get(key_hide) is not None:
text_data[key_hide].set_visible(False)
if not text.get_visible():
text.set_visible(True)
text.set_text(textstr)
event.canvas.draw_idle()
最终成果
残缺代码参见:https://github.com/just4alpha/GreedyAlpha
正文完