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与传入的tickvt_symbol不匹配,则跳过当前循环。

接下来,函数判断止损单的方向是否为多头(Direction.LONG),并且tick的最新价格大于等于停止单的价格。如果是,则将long_triggered设置为True。类似地,如果止损单的方向为空头(Direction.SHORT),并且tick的最新价格小于等于停止单的价格,则将short_triggered设置为True。

如果long_triggeredshort_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 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注


欢迎光临黏豆包的博客。
取消