veighna有停止单功能,然而一直没见到它的代码,今天才在vnpy_stastrategy里见到真身。把它的代码列出来,便于从机理上理解它的机制。
def check_stop_order(self, tick: TickData) -> None:
""""""
for stop_order in list(self.stop_orders.values()):
if stop_order.vt_symbol != tick.vt_symbol:
continue
long_triggered = (
stop_order.direction == Direction.LONG and tick.last_price >= stop_order.price
)
short_triggered = (
stop_order.direction == Direction.SHORT and tick.last_price <= stop_order.price
)
if long_triggered or short_triggered:
strategy: CtaTemplate = self.strategies[stop_order.strategy_name]
# To get excuted immediately after stop order is
# triggered, use limit price if available, otherwise
# use ask_price_5 or bid_price_5
if stop_order.direction == Direction.LONG:
if tick.limit_up:
price = tick.limit_up
else:
price = tick.ask_price_5
else:
if tick.limit_down:
price = tick.limit_down
else:
price = tick.bid_price_5
contract: Optional[ContractData] = self.main_engine.get_contract(stop_order.vt_symbol)
vt_orderids: list = self.send_limit_order(
strategy,
contract,
stop_order.direction,
stop_order.offset,
price,
stop_order.volume,
stop_order.lock,
stop_order.net
)
check_stop_order
接收一个TickData
类型的参数tick
,主要目的是检查是否有停止单触发,并根据触发情况进行相应的操作。
首先,函数遍历self.stop_orders
字典中的所有停止单。如果停止单的vt_symbol
与传入的tick
的vt_symbol
不匹配,则跳过当前循环。
接下来,函数判断止损单的方向是否为多头(Direction.LONG
),并且tick
的最新价格大于等于停止单的价格。如果是,则将long_triggered
设置为True。类似地,如果止损单的方向为空头(Direction.SHORT
),并且tick
的最新价格小于等于停止单的价格,则将short_triggered
设置为True。
如果long_triggered
或short_triggered
为True,表示停止单已触发。函数首先获取与停止单关联的策略对象strategy
。
然后,根据停止单的方向和可用的限价信息,确定下单的价格。如果停止单的方向是多头,且tick
有限价上限(limit_up
),则使用tick.limit_up
作为价格;否则,使用tick.ask_price_5
作为价格。对于空头停止单,同样根据是否有限价下限(limit_down
)来确定价格。函数通过self.main_engine.get_contract(stop_order.vt_symbol)
获取合约数据contract
。函数调用self.send_limit_order()
方法发送限价单。
0 条评论