while True:
api.wait_update()
if api.is_changing(quote, “last_price”):
kdj = KDJ(klines, 9, 3, 3) # 获取KDJ klines是15分钟均线
k = list(kdj[“k”])
k1 = int(k[-1]*10)/10
k2 = int(k[-2]*10)/10
print(datetime.now(), ‘当前价:’+str(quote.last_price), ‘k1=’+str(k1), ‘k2=’+str(k2))
以上代码输出结果是:
2020-04-17 11:29:14.327548 当前价:16065.0 k1=47.5 k2=59.5
2020-04-17 11:29:18.333792 当前价:16070.0 k1=47.5 k2=59.5
2020-04-17 11:29:30.374437 当前价:16065.0 k1=47.5 k2=59.5
2020-04-17 11:29:31.340563 当前价:16060.0 k1=46.5 k2=59.5
2020-04-17 11:29:32.415674 当前价:16065.0 k1=46.5 k2=59.5
2020-04-17 11:29:36.823657 当前价:16070.0 k1=47.5 k2=59.5
2020-04-17 11:29:37.832679 当前价:16065.0 k1=48.5 k2=59.5
2020-04-17 11:29:44.818700 当前价:16070.0 k1=48.5 k2=59.5
以上是模拟真实交易的写法,但是在回测的时候,该如何使用KDJ指标呢?之前我试过,输出的KDJ值在K线更新以后都是统一的值,好像无法实时回测当时的KDJ值,不知道是不是写法错了
另外,如果说把K线时间改为1分钟,那么上面代码中 k2的值是不是表示上一分钟K线生成时的K值?
回测的时候和盘中的时候使用KDJ指标的方法没有变化,只是行情可能有差异,详细请查看文档中关于回测部分行情的生成规则:https://doc.shinnytech.com/tqsdk/latest/usage/backtest.html#id5
你的代码里:
if api.is_changing(quote, “last_price”):
kdj = KDJ(klines, 9, 3, 3) # 获取KDJ klines是15分钟均线
这两句是判断quote行情有更新的时候计算KDJ,但是KDJ是使用K线的价格来计算的,比如15分钟线,只有最后一根K线的close、high、low(KDJ计算时需要用到的数据)有一些变化,而前面14根K线的数据都不会再变了。所以你会看到KDJ没变化。
对于“如果说把K线时间改为1分钟,那么上面代码中 k2的值是不是表示上一分钟K线生成时的K值?”这个问题,不是上一分钟K线生成的,KDJ它有计算周期,是你填的参数,你可以看看KDJ的定义和代码实现
详细的你可以去看看KDJ的代码实现,代码是开源的,github上或者你下载的tqsdk包里有的
理解了,非常感谢