问题描述
解决方案
根据 PTrade API 文档的规范,在 tick_data 函数中不能使用 order() 函数进行下单。
详细说明
- API 限制:
PTrade 文档明确指出,在tick_data函数(Tick 级别高频处理函数)中,只能使用order_tick进行对应的下单操作。 - 函数区别:
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_tick 的 priceGear 参数怎么填?
A: priceGear 是字符串类型。
'1'~'5'(或'10'):代表买一到买五(或买十)。'-1'~'-5'(或'-10'):代表卖一到卖五(或卖十)。- 如果不指定
priceGear,也可以通过limit_price参数指定具体价格。
Q: 如果我想在 Tick 策略里按市价下单怎么办?
A: order_tick 本身没有直接的 "Market" 参数,但你可以通过 priceGear 来模拟。例如,买入时使用卖一价(priceGear='-1')通常能立即成交(类似市价买入);卖出时使用买一价(priceGear='1')通常也能立即成交。