需求:
如果策略多,短时间可能有频繁的下单与撤单;
如果通过EVENT去写,大概就是围绕着一笔订单处理直到下成功
还是通过其他线程管理,均先下单,未成交撤单成功逻辑单独管理
需求:
如果策略多,短时间可能有频繁的下单与撤单;
如果通过EVENT去写,大概就是围绕着一笔订单处理直到下成功
还是通过其他线程管理,均先下单,未成交撤单成功逻辑单独管理
在 VeighNa 框架中,针对 高频策略的频繁下单/撤单需求,推荐采用 事件驱动 + 订单状态跟踪 的方案,而非多线程管理。以下是具体实现逻辑和原因:
buy()
/sell()
下单后,订单状态变化会触发 on_order
回调。在回调中判断订单是否未成交,若超时则撤单并重新下单。示例代码:
class HighFreqStrategy:
def __init__(self):
self.active_orders = {} # 存储活跃订单 {vt_orderid: {"price": x, "volume": y}}
def on_tick(self, tick: TickData):
# 根据Tick生成新订单
if self.can_send_order():
price = self.calculate_price(tick)
volume = self.calculate_volume(tick)
vt_orderids = self.buy(price, volume)
for vt_orderid in vt_orderids:
self.active_orders[vt_orderid] = {"price": price, "volume": volume}
def on_order(self, order: OrderData):
# 订单状态更新回调
if order.vt_orderid in self.active_orders:
if order.status == Status.CANCELLED:
# 撤单后重新下单
self.re_submit_order(order)
elif order.status == Status.NOTTRADED:
# 未成交则撤单
self.cancel_order(order.vt_orderid)
MainEngine
)非线程安全,跨线程操作需加锁,复杂度高。asyncio
,多线程可能干扰事件分发。仅在以下极端情况下考虑:
def cancel_all_pending_orders(self):
"""批量撤单"""
for vt_orderid in list(self.active_orders.keys()):
if self.get_order(vt_orderid).status == Status.NOTTRADED:
self.cancel_order(vt_orderid)
实现:
import time
class HighFreqStrategy:
def __init__(self):
self.order_timestamps = {} # {vt_orderid: timestamp}
def on_order(self, order: OrderData):
if order.is_active():
self.order_timestamps[order.vt_orderid] = time.time()
else:
self.order_timestamps.pop(order.vt_orderid, None)
def check_timeout_orders(self):
"""定时检查超时订单"""
current_time = time.time()
for vt_orderid, timestamp in list(self.order_timestamps.items()):
if current_time - timestamp > 0.5: # 超时 500ms
self.cancel_order(vt_orderid)
def can_send_order(self, new_price, new_volume):
"""检查是否已有相同价格的活跃订单"""
for vt_orderid, order_info in self.active_orders.items():
if abs(order_info["price"] - new_price) < self.pricetick:
return False
return True
方案 | 适用场景 | 优势 | 劣势 |
---|---|---|---|
事件驱动 + 状态跟踪 | 高频策略、多合约管理 | 与框架集成、线程安全、实时响应 | 需精细管理订单状态 |
多线程管理 | 极端高频场景(如做市商) | 独立控制订单流 | 线程安全风险、性能瓶颈 |
推荐做法:
在 on_order
中监听订单状态,结合 active_orders
字典跟踪活跃订单,通过定时任务或 Tick 触发撤单逻辑。此方案既能满足高频需求,又符合 VeighNa 的设计哲学。
如果下单品种多,而且笔数多,需要考虑部分成交,部分撤单;不通过单独管理开一个线程管理订单是否成交是不是会延误运行速度