🚀 AI 一键生成 ptrade 策略代码

PTrade Tick 交易限制:为什么 tick_data 中必须用 order_tick?

ptrade | 发布时间: 2025/12/20
以下内容由 EasyQuant 生成。

问题描述

在 tick_data 函数里面,我能用 order() 函数下单吗?

解决方案

根据 PTrade API 文档的规范,tick_data 函数中不能使用 order() 函数进行下单

详细说明

  1. API 限制
    PTrade 文档明确指出,在 tick_data 函数(Tick 级别高频处理函数)中,只能使用 order_tick 进行对应的下单操作
  2. 函数区别
    • order():主要用于 handle_data(日线/分钟线级别)或 on_order_response 等事件中,通常基于最新的快照或 K 线数据下单。
    • order_tick():专门为 Tick 级策略设计,支持利用盘口档位(如买一、卖一)进行快速报单,更符合高频交易的撮合逻辑。

正确的写法

tick_data 中,请使用 order_tick(sid, amount, priceGear, limit_price)

以下是一个标准的 Tick 级别策略示例代码:

def initialize(context):
    # 设置关注的股票
    g.security = '600570.SS'
    set_universe(g.security)

def tick_data(context, data):
    """
    Tick 数据处理函数,每 3 秒或有 L2 推送时触发
    """
    security = g.security
    
    # 获取当前 Tick 的买一价
    # data[security]['tick']['bid_grp'] 返回的是买档位字典
    # 格式示例: {1: [价格, 量, 笔数], ...}
    try:
        # 注意:需确保有行情数据再操作
        if security in data and 'tick' in data[security]:
            tick_info = data[security]['tick']
            
            # 获取买一档的价格 (bid_grp key为1, value list的第0个元素是价格)
            # 注意:bid_grp 的值可能是字符串形式的 list,需根据实际返回处理,
            # 这里假设 API 返回标准结构,若返回字符串需用 eval 解析
            bid_1_info = tick_info['bid_grp'].get(1)
            
            if bid_1_info:
                current_bid_price = bid_1_info[0]
                
                # 示例逻辑:如果买一价大于 40 元,则以卖一档价格卖出 100 股
                if current_bid_price > 40:
                    # order_tick 参数说明:
                    # sid: 代码
                    # amount: 数量(负数卖出)
                    # priceGear: 盘口档位,'-1' 代表卖一档,'1' 代表买一档
                    order_tick(security, -100, priceGear='-1')
                    
                    # 记录日志
                    log.info("Tick 触发卖出: %s, 价格: %s" % (security, current_bid_price))
                    
    except Exception as e:
        log.error("Tick 处理异常: %s" % e)

def handle_data(context, data):
    # Tick 策略中,handle_data 通常留空或处理非交易逻辑
    pass

Q&A

Q: 为什么 tick_data 里不能用 order
A: tick_data 是高频触发的(3秒一次或更块),order 函数的设计逻辑通常适配于低频(分钟/日线)的撮合机制。为了保证高频交易的执行效率和盘口匹配的准确性,系统强制要求使用 order_tick,它允许指定具体的盘口档位(如“对手方最优”、“本方最优”对应的档位)。

Q: order_tickpriceGear 参数怎么填?
A: priceGear 是字符串类型。

  • '1' ~ '5'(或 '10'):代表买一到买五(或买十)。
  • '-1' ~ '-5'(或 '-10'):代表卖一到卖五(或卖十)。
  • 如果不指定 priceGear,也可以通过 limit_price 参数指定具体价格。

Q: 如果我想在 Tick 策略里按市价下单怎么办?
A: order_tick 本身没有直接的 "Market" 参数,但你可以通过 priceGear 来模拟。例如,买入时使用卖一价(priceGear='-1')通常能立即成交(类似市价买入);卖出时使用买一价(priceGear='1')通常也能立即成交。