问题描述
解决方案
在PTrade中,若希望获取的逐笔成交数据按时间从旧到新(正序)排列,需要在调用 get_individual_transaction 函数时,将参数 search_direction 设置为 2。
设置说明
get_individual_transaction 接口中的 search_direction 参数控制数据的搜索和返回顺序:
search_direction=1(默认):向前搜索,返回的数据按时间从最新到最旧排列。search_direction=2:向后搜索,返回的数据按时间从旧到新排列。
代码示例
以下是一个完整的策略示例,展示如何在盘中获取并打印按时间正序排列的逐笔成交数据:
def initialize(context):
# 设置我们要操作的股票,例如恒生电子
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 获取逐笔成交数据
# stocks: 指定股票代码
# search_direction=2: 关键参数,设置为2表示从旧到新排列
# data_count: 获取的数据条数,默认为50,最大200
# is_dict=True: 建议设置为True,返回字典格式,性能更好且兼容性更强
transactions = get_individual_transaction(
stocks=[g.security],
search_direction=2,
data_count=20,
is_dict=True
)
if transactions:
# 打印获取到的数据
# 返回的数据结构中,列表的第一个元素即为该批次中最旧的一笔成交
log.info("获取到逐笔成交数据(从旧到新):")
log.info(transactions)
# 示例:打印第一条(最旧)和最后一条(最新)的时间对比
# 注意:需确保返回的数据列表不为空
if g.security in transactions and len(transactions[g.security]) > 0:
trade_list = transactions[g.security]
first_trade = trade_list[0] # 列表第一项
last_trade = trade_list[-1] # 列表最后一项
# 字段索引参考API文档:0-时间戳, 1-价格, 2-成交量...
log.info("最旧一笔时间: %s" % first_trade[0])
log.info("最新一笔时间: %s" % last_trade[0])
注意事项
- 适用环境:
get_individual_transaction函数仅在交易模块(实盘或仿真交易)中可用,回测模块不支持逐笔数据。 - 权限要求:逐笔成交数据属于 Level-2 行情数据。如果您的账号未开通Level-2行情权限,调用此接口将返回
None或无数据。 - 数据结构:建议将
is_dict设置为True。当is_dict=True时,返回的数据是字典格式,处理速度更快,且在股票数量较多时更稳定。 - 时间戳:返回数据中的
business_time是毫秒级的时间戳(如20230519093003000),在比较大小时直接对比数值即可。
Q&A
Q: get_individual_transaction 接口如果没有L2权限会报错吗?
A: 通常不会直接报错导致策略停止,而是会返回 None 或者空数据。在编写策略时,务必对返回结果进行 if transactions is not None: 的非空判断,以增强策略的健壮性。
Q: search_direction=2 获取的是哪里的数据?
A: 它通常配合 start_pos(起始位置)使用。如果不指定 start_pos(默认为0),search_direction=2 会尝试获取当日最早的成交数据(具体行为取决于柜台行情推送的缓存机制)。在实时交易中,通常结合上一次获取到的最后一条数据的索引来持续获取最新的增量数据。
Q: 逐笔成交数据能获取多少条?
A: 单次调用通过 data_count 参数控制,最大支持返回 200 条数据。如果需要更多数据,需要通过循环调用或高频轮询来实现。