def cross_algo(self): """ Cross limit order with last bar/tick data. """ if self.mode == BacktestingMode.BAR: long_cross_price = self.bar.close_price short_cross_price = self.bar.close_price else: long_cross_price = self.tick.ask_price_1 short_cross_price = self.tick.bid_price_1 for algo in list(self.active_algos.values()): # Check whether limit orders can be filled. long_cross = (algo.direction == Direction.LONG and algo.price >= long_cross_price) short_cross = (algo.direction == Direction.SHORT and algo.price <= short_cross_price) if not long_cross and not short_cross: continue # Push order udpate with status "all traded" (filled). algo.traded = algo.volume algo.status = Status.ALLTRADED self.strategy.update_spread_algo(algo) self.active_algos.pop(algo.algoid) # Push trade update self.trade_count += 1 if long_cross: trade_price = long_cross_price pos_change = algo.volume else: trade_price = short_cross_price pos_change = -algo.volume trade = TradeData( symbol=self.spread.name, exchange=Exchange.LOCAL, orderid=algo.algoid, tradeid=str(self.trade_count), direction=algo.direction, offset=algo.offset, price=trade_price, volume=algo.volume, datetime=self.datetime, gateway_name=self.gateway_name, ) if self.mode == BacktestingMode.BAR: trade.value = self.bar.value else: trade.value = trade_price self.spread.net_pos += pos_change self.strategy.on_spread_pos() self.trades[trade.vt_tradeid] = trade