返回列表 发布新帖

不用造轮子,Python直接调用KDJ、MACD等指标

1391 3
发表于 2024-1-20 22:42:23 | 显示全部楼层 阅读模式

常规计算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}")

image.png

券商版的不足

上面的代码可以正常工作,但有几个问题,会导致使用时效果可能不尽如人意

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}")

结果展示

image.png

该接口只需订阅一次,且可以控制计算指标的时间范围,且支持了更多的周期,更重要的是,它避免了重复计算和支持了并行计算,重复利用cpu多核,提高了效率

评论3

miniQMT.com申请
发表于 2024-1-23 10:27:27 | 显示全部楼层
沙发
*******5612
发表于 2024-2-14 21:07:32 | 显示全部楼层
我有也一点儿疑问:这个回调函数在什么时机得到调用?
*******7572
发表于 2024-3-7 18:55:11 | 显示全部楼层
好东西 可以券商版本用不了

回复

您需要登录后才可以回帖 登录 | 立即注册

主题

17

回帖

75

积分

0

客服专线

400-080-8112

用思考的速度交易,用真诚的态度合作,我们是认真的!
  • 关注公众号
  • 添加微信客服
Copyright © 2001-2024 迅投QMT社区 版权所有 All Rights Reserved. 蜀ICP备19002686号-2
关灯 快速发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表