问题描述
使用get_individual_entrust获取逐笔委托数据时,返回的数据为空,是代码有问题吗?
解决方案
在 ptrade 量化交易平台中,使用 get_individual_entrust 接口获取逐笔委托数据时返回空数据,通常不是代码本身的问题,而是由于行情权限的限制。
核心原因:未开通 Level2 行情
根据 ptrade API 文档的明确说明:
逐笔委托、逐笔成交数据需开通 Level2 行情才能获取到数据,否则无数据返回。
如果您使用的是普通的 Level1 行情,调用该接口将无法获取到任何数据,系统会返回 None 或空的数据结构。
解决方法
- 确认行情权限:请联系您的券商客户经理,确认您的交易账户是否已经开通了 Level2 行情权限。
- 开通权限:如果未开通,请按照券商的指引开通 Level2 行情服务。
- 检查代码逻辑:在确认拥有 Level2 行情权限后,请确保您的代码逻辑正确,特别是在处理返回数据时,要做好空值(
None)的判断,以增强策略的健壮性。
get_individual_entrust 接口使用注意事项
- 适用场景:该函数仅在交易模块可用。
- 市场支持:沪深市场都有逐笔委托数据。
- 性能优化:当策略入参
is_dict=True时,返回的数据类型为dict,返回dict类型数据的速度比返回DataFrame或Panel类型数据有大幅提升。建议在处理大量数据时使用字典格式。
正确的代码示例
以下是一个包含空值保护和使用字典格式获取逐笔委托数据的示例:
def initialize(context):
g.security = "000001.SZ"
set_universe(g.security)
def before_trading_start(context, data):
g.flag = False
def handle_data(context, data):
if not g.flag:
# 推荐:使用 is_dict=True 返回字典类型数据,速度更快
entrust_dict = get_individual_entrust([g.security], is_dict=True)
# 增加空值判断,防止因无 Level2 行情导致策略报错
if entrust_dict is not None and g.security in entrust_dict:
log.info("成功获取逐笔委托数据:%s" % entrust_dict[g.security])
else:
log.warning("未获取到逐笔委托数据,请检查是否开通 Level2 行情。")
g.flag = True
总结:遇到 get_individual_entrust 返回空数据时,首要排查步骤是确认是否具备 Level2 行情权限。在编写策略时,务必加入对返回值为 None 的异常处理逻辑。