常规计算KDJ、MACD等指标时,需要先调用行情接口,然后再编写函数,实现指标的计算,那么在投研里,有现成的方法,一行代码就能订阅指标,无需额外的代码开发
代码演示
#coding:gbk
def init(C):
C.set_universe(['000001.SZ'])
def handlebar(C):
k = call_vba('KDJ.k','000001.SZ',C)
d = call_vba('KDJ.d','000001.SZ',C)
j = call_vba('KDJ.j','000001.SZ',C)
print(f" K:{k:.2f} D:{k:.2f} J:{j:.2f}")

券商版的不足
上面的代码可以正常工作,但有几个问题,会导致使用时效果可能不尽如人意
1、依赖过时接口 该接口使用了ContextInfo.set_universe 而这个接口已不再推荐使用,详见;
http://dict.thinktrader.net/innerApi/question_answer.html?id=I3DJ97#qmt-%E8%A1%8C%E6%83%85%E8%B0%83%E7%94%A8%E5%87%BD%E6%95%B0%E5%AF%B9%E6%AF%94%E8%AF%B4%E6%98%8E
2、重复计算,如代码所示,当同时需要 K、D、J三个值时需要全量计算三次,而且当需要使用不同时间的指标值时也是如此,需要重复调用
3、实测,该接口只支持部分周期的动态指标
投研版的优化
由于这部分代码完全重构,券商版近百家,版本也不可能完全统一,投研版只有一个版本,所以做了优化。
在投研版里,我们有更好的方法来获取这些指标值,代码如下:
#coding:gbk
def init(ContextInfo):
# 订阅000001.SZ KDJ指标
stock_code = '000001.SZ'
ContextInfo.subscribe_formula(
'KDJ', # 选择需要的指标名称
stock_code, # 股票代码
'1d', # 周期
'20230110', # 指标计算的时间范围
'', # 指标计算的时间范围
callback=on_kdj # 结果对应的回调函数
)
def on_kdj(result):
for t in result:
print(f"{t} K:{result[t]['k']:.2f} D:{result[t]['d']:.2f} J:{result[t]['j']:.2f}")
结果展示

该接口只需订阅一次,且可以控制计算指标的时间范围,且支持了更多的周期,更重要的是,它避免了重复计算和支持了并行计算,重复利用cpu多核,提高了效率。
不清楚的内容可添加下方助理微信咨询,有其他 QMT 小技巧想学习的吗?欢迎在下方留言,笔者将根据大家的留言持续更新哦!
欢迎和我一起加入迅投组建的 QMT 实战交流社群,交流群内有许多做量化交易的高手和大佬,具有良好的分享和互助氛围。且迅投官方会不定期为多次分享、乐于助人的群友申请送投研专业版的机会。
只需扫描下方的二维码,名额有限,限时加入。一起分享见解、交换信息、并共同进步,就像群友说的:“就算周末,晚上也有地方沟通交流!”
