is_trade接口使用问题
如何在一套代码中兼容回测和交易?
问题描述
解决方案
在 ptrade 量化交易平台中,由于部分 API 函数仅限在回测或交易场景中使用(例如某些特定的主推事件或特定的下单接口),为了提高代码的复用性,避免维护两套几乎相同的代码,平台提供了 is_trade() 接口。
接口说明
is_trade() 用于提供业务代码执行场景的判断依据,明确标识当前业务代码运行场景为回测还是交易。通过该函数,你可以使用 if-else 逻辑来区分对应场景,从而在一套策略代码中同时兼容回测与交易。
返回值
- 布尔类型 (bool):
- 当前代码在**交易(实盘/模拟盘)**中运行,返回
True。 - 当前代码在回测中运行,返回
False。
- 当前代码在**交易(实盘/模拟盘)**中运行,返回
使用场景
仅在回测、交易模块可用。
代码示例
以下是一个简单的示例,展示了如何在 handle_data 中使用 is_trade() 来区分打印不同的日志,或者执行不同的逻辑:
def initialize(context):
# 初始化股票池
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 执行通用的下单逻辑
_id = order(g.security, 100)
# 使用 is_trade() 判断当前运行环境
if is_trade():
# 这里可以放置仅在交易环境中运行的代码
# 例如:获取实时的 tick 数据、处理特定的交易主推等
log.info("当前运行场景:交易")
else:
# 这里可以放置仅在回测环境中运行的代码
# 例如:获取对账文件、打印特定的回测评估指标等
log.info("当前运行场景:回测")
最佳实践建议
- 规避不支持的接口:在
initialize或before_trading_start中,如果需要调用仅交易支持的接口(如run_interval或tick_data相关的设置),请务必将其包裹在if is_trade():逻辑块中,防止回测报错。 - 参数设置差异化:回测和实盘可能需要不同的滑点、手续费设置。可以在
initialize中通过is_trade()判断,如果是回测(False),则调用set_slippage和set_commission;如果是实盘,则跳过这些回测专属的设置函数。