3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化交易中,我们经常面临一个痛点:回测代码和实盘代码不统一。有些 API(如获取实时行情快照 get_snapshot、获取 L2 逐笔数据等)只能在实盘/模拟盘环境中使用,如果在回测中直接调用会导致策略报错中断。为了解决这个问题,ptrade 提供了 is_trade() 函数。
is_trade() 用于提供业务代码执行场景的判断依据,明确标识当前策略运行在回测环境还是实盘/模拟盘环境。通过它,我们可以将两套逻辑写在同一个策略文件中,实现“一套代码,双端运行”。
True (bool):当前代码在实盘/模拟盘交易中运行。False (bool):当前代码在回测中运行。get_snapshot、get_gear_price、check_limit 等)在回测中调用会报错。使用 is_trade() 进行分支判断,可以确保回测顺利通过。send_qywx)或邮件提醒(send_email),而在回测中则不需要这些操作。以下代码展示了如何使用 is_trade()。在回测时,策略会打印“当前运行场景:回测”并使用历史数据;在实盘时,策略会打印“当前运行场景:实盘”,并调用实盘专用的 get_snapshot 获取最新行情进行下单。
def initialize(context):
# 初始化策略,设置操作的股票池
g.security = '600570.SS' # 恒生电子
set_universe(g.security)
def handle_data(context, data):
# 1. 使用 is_trade() 判断当前运行环境
if is_trade():
# ------------------ 实盘/模拟盘特有逻辑 ------------------
log.info("当前运行场景:实盘")
# 获取实盘专用的行情快照(回测调用此接口会报错,因此必须放在 is_trade() 分支内)
snapshot = get_snapshot(g.security)
if snapshot and g.security in snapshot:
current_price = snapshot[g.security].get('last_px', 0)
log.info("【实盘最新价】: %s" % current_price)
# 执行实盘下单逻辑
if current_price > 0:
order(g.security, 100)
else:
# ------------------ 回测特有逻辑 ------------------
log.info("当前运行场景:回测")
# 回测中使用 data 对象获取当前周期的收盘价
current_price = data[g.security]['close']
log.info("【回测当前价】: %s" % current_price)
# 执行回测下单逻辑
order(g.security, 100)
is_trade() 可以在 handle_data、before_trading_start、after_trading_end 等盘中、盘前、盘后事件中自由调用。if is_trade(): 分支中进行调用,使主循环 handle_data 结构更加清晰。