问题描述
解决方案
在PTrade量化交易引擎中,常规的 handle_data 函数仅满足日线和分钟级别的盘中处理。如果您需要进行 tick级别 的盘中处理,需要通过 tick_data 或者 run_interval 函数来实现。
以下是这两个函数的详细介绍及使用场景:
1. tick_data(context, data) 函数
tick_data 是专门用于处理tick级别策略交易逻辑的事件函数。它在交易时间内(9:30 -- 14:59)每隔 3秒 执行一次。
特点与注意事项:
- 专属数据结构:
tick_data中的data参数与handle_data中的不同。它包含order(逐笔委托)、tick(当前tick数据)、transcation(逐笔成交)三项。 - 专属下单接口:在该函数中,只能使用
order_tick进行对应的下单操作。 - 权限要求:逐笔委托和逐笔成交数据需要开通Level2行情才有数据推送,否则对应数据返回None。
代码示例:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def tick_data(context, data):
security = g.security
# 获取买一价
current_price = eval(data[security]['tick']['bid_grp'][0])[1][0]
log.info('当前买一价: %s' % current_price)
if current_price > 38.19:
# 按买一档价格下单
order_tick(security, 100, '1')
2. run_interval(context, func, seconds=10) 函数
run_interval 是一个定时周期性函数,用于以设定的时间间隔(单位为秒)周期性运行指定的自定义函数。它可以作为tick级别处理的另一种灵活实现方式。
特点与注意事项:
- 初始化调用:该函数只能在初始化阶段
initialize函数中调用。 - 多线程并行:可以多次设定,以多个线程并行运行,但需要注意不同线程之间的逻辑关联处理。
- 最小间隔:
seconds设置最小时间间隔为3秒,小于3秒默认设定为3秒。
代码示例:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
# 定义一个周期处理函数,每3秒执行一次
run_interval(context, interval_handle, seconds=3)
def interval_handle(context):
# 获取实时行情快照
snapshot = get_snapshot(g.security)
if snapshot:
last_px = snapshot[g.security].get('last_px')
log.info('当前最新价: %s' % last_px)
# 在此处编写您的tick级交易逻辑
总结
- 如果您需要深度依赖Level2的逐笔数据和盘口档位,并且希望使用专门的tick下单接口,推荐使用
tick_data。 - 如果您只需要高频地(如每3秒)获取快照数据并执行自定义逻辑,
run_interval提供了更灵活的定时任务机制。 - 另外,对于对速度要求极高的策略,还可以结合
on_order_response(委托主推)和on_trade_response(成交主推)事件函数作为tick级的补充。