问题描述
在tick_data函数中获取逐笔委托和逐笔成交数据返回None
解决方案
在 PTrade 量化交易平台中,如果您在 tick_data 函数里尝试获取逐笔委托(order)和逐笔成交(transcation)数据时发现返回了 None,其根本原因是您的账户未开通 Level2 (L2) 行情。
核心原因解析
根据 PTrade API 文档的明确规定:
参数 data 中包含的逐笔委托,逐笔成交数据需开通 level2 行情才有数据推送,否则对应数据返回 None。
普通的 Level1 行情只提供基础的快照数据(如买卖五档、最新价、成交量等),而逐笔数据(每一笔具体的委托单和撮合成交单)属于高级行情数据,必须依赖交易所的 Level2 行情源。
数据结构说明
当您开通了 Level2 行情后,tick_data 中的 data 参数结构如下:
{'股票代码':
{
'order': DataFrame / None, # 最近一条逐笔委托 (需L2)
'tick': DataFrame, # 当前tick快照数据 (L1/L2均有)
'transcation': DataFrame / None, # 最近一条逐笔成交 (需L2)
}
}
如何安全地获取逐笔数据(代码示例)
为了避免策略因为未开通 L2 行情或某时刻无逐笔数据而报错,建议在代码中加入 None 值判断:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def tick_data(context, data):
security = g.security
# 1. 获取逐笔成交数据
transcation = data[security].get("transcation")
if transcation is not None:
business_amount = list(transcation["business_amount"])
if len(business_amount) > 0:
log.info("最近一笔逐笔成交的成交量:%s" % business_amount[0])
else:
log.warning("未获取到逐笔成交数据,请检查是否开通Level2行情。")
# 2. 获取逐笔委托数据
order = data[security].get("order")
if order is not None:
trans_kind = list(order["trans_kind"])
if len(trans_kind) > 0:
log.info("最近一笔逐笔委托的委托类别:%s" % trans_kind[0])
else:
log.warning("未获取到逐笔委托数据,请检查是否开通Level2行情。")
def handle_data(context, data):
pass
总结与建议
- 联系券商:如果您确实需要在策略中使用逐笔委托或逐笔成交数据,请联系您的开户券商,申请开通 PTrade 交易环境的 Level2 行情权限。
- 替代方案:如果无法开通 L2 行情,您的 tick 级别策略只能依赖
data[security]['tick']中的快照数据(如bid_grp买档位、offer_grp卖档位、last_px最新价等)来进行逻辑判断。