问题描述
解决方案
在 PTrade 量化交易平台中,如果在 before_trading_start 函数中获取实时行情数据(如使用 get_snapshot 等接口)发现数据有误,通常是由于执行时间过早,行情尚未更新导致的。
原因分析
根据 PTrade 官方文档说明:
在交易环境中,before_trading_start 函数在开启交易时会立即执行,从隔日开始每天 9:10 分(默认)执行。当在 9:10 前开启交易时,受行情未更新原因,在该函数内调用实时行情接口会导致数据有误。
解决方法
官方推荐了两种避免此问题的方法:
方法一:在函数内使用 sleep 等待
可以在 before_trading_start 函数内部使用 Python 的 time.sleep() 函数,让程序暂停执行,直到 9:10 分之后(行情更新后)再调用实时行情接口。
方法二:改用 run_daily 定时执行(推荐)
将需要依赖实时行情的盘前逻辑从 before_trading_start 中移出,改为在 initialize 函数中使用 run_daily 接口,指定一个明确的盘前时间(例如 9:15 或 9:25)来执行该逻辑。
代码示例:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
# 使用 run_daily 指定在 9:15 分执行获取实时行情的函数
run_daily(context, get_morning_data, time='09:15')
def before_trading_start(context, data):
# 这里只做不需要实时行情的初始化操作
g.flag = False
def get_morning_data(context):
# 在 9:15 执行,此时行情已更新
snapshot = get_snapshot(g.security)
log.info("盘前最新行情快照:%s" % snapshot)
def handle_data(context, data):
pass
通过使用 run_daily,您可以精确控制函数的执行时间,有效避免因过早调用接口而获取到错误行情数据的问题。