72 浏览
0
0条评论

我有一个需求,要在收盘进行一些操作。在回测模式下,无法获取系统时间,也不能用 api.get_trading_status 来判断状态。那么如何来准确判断某合约是否处于交易状态呢?

目前,我用 if is_trading_time(api, iid) and api.is_changing(quote) 来判断。is_trading_time 是判断当前 quote.datetime 是否在 quote.trading_time 内。但是这样做有一些问题,某些合约的 quote.datetime 收盘时会停留在 14:59:59:99999999,永远都在 quote.trading_time 内,is_trading_time 这个函数就没有作用了。 单单靠 api.is_changing(quote) 来判断,实在是不可靠,但在模拟交易中更是状况百出,时灵时不灵的。

很苦恼怎么解决啊

chaos 已回答的问题 12小时 前
0

这是回测的时间推进机制导致的:回测只在已订阅的历史行情到来时推进,并不会在交易时段结束时额外生成一个“已经收盘”的事件。因此最后一笔行情停在 14:59:59.xxx 是正常现象。

api.is_changing(quote) 只表示本轮更新中 quote 是否发生变化,并不能表示当前是否处于交易时段。

如果收盘操作包含平仓或撤单,建议改成收盘前触发:根据 quote.trading_time 取得当前时段的结束时间,使用 quote.datetime 在收盘前预留一段时间执行,并记录当天或该时段是否已经处理,避免重复触发。需要多高的时间精度,就订阅相应粒度的 Tick 或短周期 K 线。

如果操作必须在确认收盘后执行,只能等下一次行情事件到来,再通过前后行情时间已经跨越交易时段,判断上一时段已经结束。这适合统计、保存结果等事后处理,但不能再作为上一时段收盘附近的下单时点。

chaos 发表新评论 12小时 前

有其他问题欢迎加入官方Q群748265037一起交流

您正在查看1个答案中的1个,单击此处查看所有答案。