VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 25
声望: 0

` def cross_stop_order(self):
"""
Cross stop order with last bar/tick data.
"""
if self.mode == BacktestingMode.BAR:
long_cross_price = self.bar.high_price
short_cross_price = self.bar.low_price
long_best_price = self.bar.open_price
short_best_price = self.bar.open_price
else:
long_cross_price = self.tick.last_price
short_cross_price = self.tick.last_price
long_best_price = long_cross_price
short_best_price = short_cross_price

    for stop_order in list(self.active_stop_orders.values()):
        # Check whether stop order can be triggered.
        long_cross = (
            stop_order.direction == Direction.LONG
            and stop_order.price <= long_cross_price
        )

        short_cross = (
            stop_order.direction == Direction.SHORT
            and stop_order.price >= short_cross_price
        )

`
这里是cta engine里面检查cross_stop_order的函数,这里可以看到每一根bar都会在这里把所有的stop order 都遍历一篇,每一个 stop order 都会推送orderData 和 tradeData出去,但是如果我在处理第一个trade data的时候发现满足条件,想停止遍历后一个stop order就做不到了,因为已经缓存下来并且会继续遍历下去,请问怎么样设计才能实现这个逻辑呢?

Member
avatar
加入于:
帖子: 25
声望: 0

`def cross_stop_order(self):

    if self.mode == BacktestingMode.BAR:
        long_cross_price = self.bar.high_price
        short_cross_price = self.bar.low_price
        long_best_price = self.bar.open_price
        short_best_price = self.bar.open_price
    else:
        long_cross_price = self.tick.last_price
        short_cross_price = self.tick.last_price
        long_best_price = long_cross_price
        short_best_price = short_cross_price

    for stop_order in list(self.active_stop_orders.values()):
        # Check whether stop order can be triggered.
        long_cross = (
            stop_order.direction == Direction.LONG
            and stop_order.price <= long_cross_price
        )

        short_cross = (
            stop_order.direction == Direction.SHORT
            and stop_order.price >= short_cross_price
        )

        if not long_cross and not short_cross:
            continue

        # Create order data.
        self.limit_order_count += 1

        order = OrderData(
            symbol=self.symbol,
            exchange=self.exchange,
            orderid=str(self.limit_order_count),
            direction=stop_order.direction,
            offset=stop_order.offset,
            price=stop_order.price,
            volume=stop_order.volume,
            traded=stop_order.volume,
            status=Status.ALLTRADED,
            gateway_name=self.gateway_name,
            datetime=self.datetime
        )

        self.limit_orders[order.vt_orderid] = order

        # Create trade data.
        if long_cross:
            trade_price = max(stop_order.price, long_best_price)
            pos_change = order.volume
        else:
            trade_price = min(stop_order.price, short_best_price)
            pos_change = -order.volume

        self.trade_count += 1

        trade = TradeData(
            symbol=order.symbol,
            exchange=order.exchange,
            orderid=order.orderid,
            tradeid=str(self.trade_count),
            direction=order.direction,
            offset=order.offset,
            price=trade_price,
            volume=order.volume,
            datetime=self.datetime,
            gateway_name=self.gateway_name,
        )

        self.trades[trade.vt_tradeid] = trade

        # Update stop order.
        stop_order.vt_orderids.append(order.vt_orderid)
        stop_order.status = StopOrderStatus.TRIGGERED

        if stop_order.stop_orderid in self.active_stop_orders:
            self.active_stop_orders.pop(stop_order.stop_orderid)

        # Push update to strategy.
        self.strategy.on_stop_order(stop_order)
        self.strategy.on_order(order)

        self.strategy.pos += pos_change
        self.strategy.on_trade(trade)

`

Member
avatar
加入于:
帖子: 25
声望: 0

在一个价位同时挂两个停止单,就没办法在执行第一个后,cancel 掉第二个了

Member
avatar
加入于:
帖子: 4680
声望: 285

所以为什么要在同一个价位挂两个停止单又要取消一个呢?

Member
avatar
加入于:
帖子: 21
声望: 2

1、在策略实例中委托发送OCO一对订单时,保存相关订单号信息;2、在策略实例中,编写取消订单函数cancel_order,这个订单取消函数内部会调用回测引擎中的cancel_order订单取消函数;3、在策略实例的on_stop_order函数中对StopOrder推送对象进行判断,若触发了OCO订单对中其中一个订单,那么调用策略实例中的订单取消函数;4、回测引擎中的订单取消函数,会将self.active_stop_orders中OCO订单号取消掉,这样可以在同一根bar中实时取消OCO订单组中另一个订单。

Member
avatar
加入于:
帖子: 25
声望: 0

xiaohe wrote:

所以为什么要在同一个价位挂两个停止单又要取消一个呢?
在持单状态下,发生了发转信号,不就需要同时在这个价位挂两个停止单吗?或者有更好的设计吗
假如这个持单满足一定的条件,这个条件要在平仓的时候判定, 判定后 决定不反转了,就想取消后面的订单,这个时候按照这里的设计是取消不了的

Member
avatar
加入于:
帖子: 25
声望: 0

AlexYang wrote:

1、在策略实例中委托发送OCO一对订单时,保存相关订单号信息;2、在策略实例中,编写取消订单函数cancel_order,这个订单取消函数内部会调用回测引擎中的cancel_order订单取消函数;3、在策略实例的on_stop_order函数中对StopOrder推送对象进行判断,若触发了OCO订单对中其中一个订单,那么调用策略实例中的订单取消函数;4、回测引擎中的订单取消函数,会将self.active_stop_orders中OCO订单号取消掉,这样可以在同一根bar中实时取消OCO订单组中另一个订单。

oco和这个情况不一样, oco不会在同一个价格

Member
avatar
加入于:
帖子: 25
声望: 0

小虾米 wrote:

xiaohe wrote:

所以为什么要在同一个价位挂两个停止单又要取消一个呢?
在持单状态下,发生了发转信号,不就需要同时在这个价位挂两个停止单吗?或者有更好的设计吗
假如这个持单满足一定的条件,这个条件要在平仓的时候判定, 判定后 决定不反转了,就想取消后面的订单,这个时候按照这里的设计是取消不了的

预计在特定价格发生反转信号, 这里的设计如果是tick数据就没有问题,但是如果是回测bar data 就无法取消了,实盘上这么挂也很危险,很大机会就都成交了

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】