代码1:
from datetime import date import sys import time from tqsdk import TqApi, TqAccount, TargetPosTask, BacktestFinished, TqBacktest, TqSim, tafunc def test3(): api = None ticks = None SYMBOL = "DCE.m2005" try: api = TqApi(backtest=TqBacktest(start_dt=date(2020, 3, 5), end_dt=date(2020, 3, 5))) # ticks = api.get_tick_serial(symbol=SYMBOL, data_length=8964) quote = api.get_quote(SYMBOL) klines_1min = api.get_kline_serial(symbol=SYMBOL, duration_seconds=60) pass except Exception as e: print("进入Exception") pass try: while True: sys.stdout.flush() api.wait_update() klines_1min_last_datetime = str(tafunc.time_to_datetime(klines_1min.iloc[-1]["datetime"])) print("quote.last_price:%f ask_price1:%f bid_price1:%f datetime:%s" % (quote.last_price, quote.ask_price1, quote.bid_price1, str(tafunc.time_to_datetime(quote.datetime)))) print("close:%f kline_last_datetime:%s" % (klines_1min.iloc[-1]["close"], klines_1min_last_datetime)) # print("ticks", ticks.iloc[-1].last_price, ticks.iloc[-1].ask_price1, ticks.iloc[-1].bid_price1, str(tafunc.time_to_datetime(ticks.iloc[-1]["datetime"]))) if klines_1min_last_datetime.find("14:02:00") != -1: sys.exit() continue except BacktestFinished as e: api.close() print("进入BacktestFinished") pass return 123 test3()
执行代码得到如下图结果中quote 在 14:00:00 这一根1min k线 开始的时候 都出现了异常。例如在14:00:00开始的quote的last_price 2725没有和ask_price1、bid_price1其中一个重合,其中卖一是2726,买一是2724。照理说在行情波动不剧烈波动的时候 不会出现这样两跳的缝隙,last_price应该与买一或卖一价重合的。检查发现全部quote都有这个问题。
代码2:
from datetime import date import sys import time from tqsdk import TqApi, TqAccount, TargetPosTask, BacktestFinished, TqBacktest, TqSim, tafunc def test3(): api = None ticks = None SYMBOL = "DCE.m2005" try: api = TqApi(backtest=TqBacktest(start_dt=date(2020, 3, 5), end_dt=date(2020, 3, 5))) ticks = api.get_tick_serial(symbol=SYMBOL, data_length=8964) quote = api.get_quote(SYMBOL) klines_1min = api.get_kline_serial(symbol=SYMBOL, duration_seconds=60) pass except Exception as e: print("进入Exception") pass try: while True: sys.stdout.flush() api.wait_update() klines_1min_last_datetime = str(tafunc.time_to_datetime(klines_1min.iloc[-1]["datetime"])) print("quote.last_price:%f ask_price1:%f bid_price1:%f datetime:%s" % (quote.last_price, quote.ask_price1, quote.bid_price1, str(tafunc.time_to_datetime(quote.datetime)))) print("close:%f kline_last_datetime:%s" % (klines_1min.iloc[-1]["close"], klines_1min_last_datetime)) print("ticks", ticks.iloc[-1].last_price, ticks.iloc[-1].ask_price1, ticks.iloc[-1].bid_price1, str(tafunc.time_to_datetime(ticks.iloc[-1]["datetime"]))) if klines_1min_last_datetime.find("14:02:00") != -1: sys.exit() continue except BacktestFinished as e: api.close() print("进入BacktestFinished") pass return 123 test3()
执行代码得到如下图结果中quote 在 14:00:00 这一根1min k线 开始的时候,tick和quote各个价格信息上都有出现 代码1结果中的 2724价格。
问题:
1,quote价格在是否使用tick数据后出现了不一致,是什么原因导致的?
2,ctp普通行情数据 交易所只会传递tick数据出来,quote应该就等于某一根tick数据吧?
west 已回答的问题 2020年3月25日
只要订阅了 tick, 则对应合约的 quote 就会使用 tick 生成, 更新频率也和 tick 一致
查看文档回测规则:
https://doc.shinnytech.com/tqsdk/latest/reference/tqsdk.backtest.html#tqsdk.backtest.TqBacktest
west 已回答的问题 2020年3月25日