已解决7.05K 浏览
0

用默认的双均线系统  我把

klines = api.get_kline_serial(SYMBOL, duration_seconds=60*60*24, data_length=LONG + 2)   这儿改成日线

SHORT = 3  # 短周期
LONG = 30  # 长周期

测试jd2005  经过10多次对比数据   测试长20190801到20200118
其它代码保持 不变
像2019.9.17按说应该出买入信号 没有出  然后最2019.12.3系统 出了买入  但是2019.12.9应该卖出信号也没有了
其它几个品牌也有这个问题

已经卡在这个上面来回测试两天了  请指出是数据不准还是代码的问题

west 已回答的问题 2020年1月20日
0

回测时遵循这样一套回测规则,日K会在开始和结束时各刷新一次,中途是没更新的

https://doc.shinnytech.com/pysdk/latest/usage/backtest.html

小龙 方 发表新评论 2020年1月20日

委托交易的条件判断指令好像是存在BUG,以上问题我也遇到过了。对于序列判断,应该存在BUG,最新数据一个单一判断可以正确判断,对于最新数据和上一个数据两个一起的组合比较判断,程序不能给出正确结果。例如最新数据A>最新数据B and 上一个A<=上一个B,这样一个组合比较,程序经常不能给出正确的判断结果。这个问题在正常委托时经常出现。

这个问题不解决,crossup指令是无法使用的。指令信号给出的结果和实际数据结果信号完全不一样,会遗漏很多实际交易信号。

我是一笔一笔对出来的 上面也给出了回测时间和日期 K线的取值范围没有问题 是取昨日均线和上下对比指令值不执行指令。 刚刚又回测了两次 还是同样的问题

0

请问直接使用你这段代码能重现吗

west 发表新评论 2020年2月3日

你提供一个能直接运行的完整代码吧, 怕还有其他操作并没有把代码贴上来就不好分析了

#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = ‘leptonlee’

from tqsdk import TqApi, TqAccount
from tqsdk.tafunc import ma
# 变量初始化
C_TIMES = 0
last_short_avg = 0
last_long_avg = 0
short_avg = 0
long_avg = 0
# 正常运行策略代码
SYMBOL = “SHFE.fu2005”
api = TqApi(TqAccount(“H海通期货”, “320102”, “123456”))
print(“策略开始运行”)

data_length = 600 # k线数据长度
klines = api.get_kline_serial(SYMBOL, duration_seconds=60, data_length=data_length)

while True:
api.wait_update()
if api.is_changing(klines.iloc[-1], “datetime”): # 产生新k线:重新计算ma
C_TIMES = C_TIMES + 1
xx = ma(klines.close, 5)
if C_TIMES > 1:
last_short_avg = short_avg
last_long_avg = long_avg
short_avg = klines.close.iloc[-1] # 短周期
long_avg = xx.b.iloc[-1] # 长周期
# 均线下穿,做空
if short_avg last_long_avg:
target_pos.set_target_volume(-1)
print(“均线下穿,做空”)
# 均线上穿,做多
if short_avg > long_avg and last_short_avg < last_long_avg:
target_pos.set_target_volume(1)
print("均线上穿,做多")
else:
short_avg = klines.close.iloc[-1] # 短周期
long_avg = xx.b.iloc[-1] # 长周期

上边的例程是可以运行的,把账户改一下,把下边的做空条件改一下,就可以,这是舍弃了第一次循环数据的,结果都是没问题的。做空条件 在两个变量中间 short_avg last_long_avg 也就是这两变量中间 增加被屏蔽的小于号 long_avg and last_short_avg 大于号,然后在开盘时间就可以实际正常运行。注意if C_TIMES 比前一个条件if缩进一级 后边的两个条件比if C_TIMES 缩进一级,后边两个条件是同一级。这个格式在帖子上显示不出来。最后的else 和if C_TIMES 是一起的。

比较一下上边的例程和原来提供例程的交易信号数量,就会发现原来提供例程遗漏了很多交易信号。

先在外面赋值一次 所有信号就都正常了 可以不去判断第一次

0

如果认为数据不一样请指出,具体哪个时间段的哪个数据和交易所不一样,如果我们数据有问题有奖

关于你叙述的问题,就是因为回测会有自己一套的行情生成规则,Kline只会在开始和结束各生成一次,请参考文档,如果觉得kline日线和预期不一样,则可以使用复盘机制,或订阅tick数据去判断

https://doc.shinnytech.com/pysdk/latest/usage/backtest.html

小龙 方 发表新评论 2020年1月20日

这个问题的存在是很明显的,就是CROSSUP指令无法正常给出信号,而CROSSUP指令实际就是两个连续数据进行组合比较的函数。不知道是不是实时数据与回测数据的差异,回测数据可能没问题,但是实时数据一定是有问题的,随便使用一个10秒钟的实时数据在模拟账户交易,信号以收盘价与5单位的收盘移动平均作对比,会发现很多交易信号会遗漏掉。

这个问题通过在时间变动条件后加入循环赋值,可以解决。问题好像是KLINES序列数据 固定周期数据与实际接收序列数据混用造成的。
if api.is_changing(klines.iloc[-1], “datetime”): # 产生新k线:重新计算ma
xx = ma(klines.close, 5)
last_short_avg = short_avg
last_long_avg = long_avg
short_avg = klines.close.iloc[-1] # 短周期
long_avg =xx.iloc[-1] # 长周期
# 均线下穿,做空
if short_avg = last_long_avg:
target_pos.set_target_volume(-1)
print(“均线下穿,做空”)
# 均线上穿,做多
if short_avg > long_avg and last_short_avg <= last_long_avg:
target_pos.set_target_volume(1)
print("均线上穿,做多")

上面这样可以实现正常信号跟踪,原来例程是有问题的。

帖子发出显示的内容和发出的内容为什么不一样??,#均线下穿,做空 下面的一句if语句显示时漏掉了中间的几个字符。这句完整的是和下一个做多的条件一样,只是比较符方向相反,实际显示的却是if short_avg = last_long_avg: 改了几遍显示还是错的,好像就是无法输入显示 ,不知帖子有什么问题。所以加这一条评论说明。

好像是论坛上帖子中小于号和大于号中间括起来内容,这样的一串字符在帖子上是不显示的,不知道是什么原因,上边做空条件显示错误,刚好就是屏蔽掉了”小于号 long_avg and last_short 大于号“这一串字符

你这个例子上面顺序是不是要调一下 last_short_avg 和last_long_avg 不然第一次没有赋值啊