🚀 AI 一键生成 ptrade 策略代码
立即体验

ptrade 平台 get_tick_direction 接口 search_direction 参数详解与高频提速技巧

ptrade | 发布时间: 2026/8/9
以下内容由 EasyQuant 生成。

问题描述

ptrade L2 进阶:get_tick_direction 接口 search_direction 搜索方向与提速技巧
get_tick_direction 的搜索方向参数 1 和 2 有什么区别?怎么在高频策略里用它提速?

解决方案

在 ptrade 量化交易平台中,get_tick_direction 是用于获取当日 Level 2 分时成交(逐笔合并分时) 行情数据的核心接口。在高频交易或 Tick 级策略中,合理使用该接口的参数对降低延迟、提高策略执行效率至关重要。

一、search_direction 参数 1 与 2 的区别

get_tick_direction 接口的定义如下:

get_tick_direction(symbols=None, query_date=0, start_pos=0, search_direction=1, data_count=50)

其中,search_direction(搜索方向)参数决定了数据的检索和返回顺序:

  1. search_direction=1(向前搜索 / 默认值)

    • 逻辑:从最新的时间点往历史时间点检索。
    • 返回顺序:返回的数据列表中,最前面的数据是最新的,最后面的数据是较旧的
    • 适用场景:适用于只需要获取最新几笔分时成交,或者需要快速判断当前盘口最新动向的策略。
  2. search_direction=2(向后搜索)

    • 逻辑:从指定的 start_pos 起始位置往未来的时间点检索。
    • 返回顺序:返回的数据列表中,最前面的数据是较旧的,最后面的数据是最新的(按时间正序排列)。
    • 适用场景:适用于需要按时间顺序回放分时成交、计算累计成交量或进行滑动窗口指标计算的策略。

二、高频策略中的提速技巧

在高频 Tick 级或秒级(run_interval)策略中,行情获取的延迟直接影响下单的滑点。以下是针对 get_tick_direction 的提速优化建议:

  1. 精简订阅股票池(symbols

    • 尽量避免传入 None(默认获取当前股票池所有代码)。在高频场景下,应显式传入当前急需处理的单只或少数几只股票代码,如 get_tick_direction('600570.SS'),避免多余的数据传输和解析开销。
  2. 控制获取条数(data_count

    • 默认获取条数为 50 条,最大支持 200 条。如果策略只需要判断最新一笔或几笔的成交方向(买/卖/平),应将 data_count 设为较小的值(例如 data_count=5data_count=10),这能显著减少网络 I/O 和内存开销。
  3. 配合 set_parameters 过滤 L2 逐笔数据

    • 如果策略中同时使用了 tick_data 事件,但不需要逐笔委托和逐笔成交,可以在 initialize 中设置 set_parameters(tick_data_no_l2="1")。这样可以避免推送多余的 L2 逐笔明细,从而为整体策略运行提速。

三、Python 代码示例

以下是一个在 tick_data(3秒周期)中,利用 search_direction=1 快速获取最新 5 笔分时成交并判断大单方向的策略骨架:

def initialize(context):
    g.security = '600570.SS'
    set_universe(g.security)
    # 开启相关参数优化
    set_parameters(tick_data_no_l2="1") 

def handle_data(context, data):
    pass

def tick_data(context, data):
    # 提速技巧 1:指定单只股票
    # 提速技巧 2:限制 data_count 为 5,仅获取最新 5 笔
    # 提速技巧 3:使用 search_direction=1 确保列表头部为最新数据
    direction_data = get_tick_direction(
        symbols=[g.security], 
        search_direction=1, 
        data_count=5
    )
    
    if direction_data and g.security in direction_data:
        ticks = direction_data[g.security]
        if len(ticks) > 0:
            # 获取最新一笔分时成交(由于 search_direction=1,索引 0 即为最新)
            latest_tick = ticks[0]
            latest_price = latest_tick['hq_px']
            latest_amount = latest_tick['business_amount']
            latest_direction = latest_tick['business_direction'] # 0:卖, 1:买, 2:平盘
            
            log.info(f"最新成交 - 价格: {latest_price}, 数量: {latest_amount}, 方向: {latest_direction}")
            
            # 策略逻辑:如果最新一笔是大额买单(方向为1),则执行相应操作
            if latest_direction == 1 and latest_amount >= 50000:
                log.info("检测到大额买单流入,触发逻辑...")