I'm trying to enter both a long and a short bracket order with target price, take profit, and stop loss... simultaneously
For long: Limit order +1 pip from current price. Stop loss -1 pip from current price. And take profit of +5 pip of from current price.
For short, exact reverse.
Here's the picture

When one of the two bracket orders get filled (at target price), i'd like to cancel the other one.
Here's the logic for entering the 2 simultaneous orders:
def next(self):
current_tick = {}
current_tick["close"] = self.datas[0].close[0]
current_tick["volume"] = self.datas[0].volume[0]
current_tick["date"] = self.datas[0].datetime.date()
current_tick["time"] = self.datas[0].datetime.time()
if(self.entrysig):
order_size =get_size(
currency_to_trade=self.p.currency,
leverage=self.p.leverage,
max_loss_per_trade=0.01,
total_cash=self.broker.get_cash(),
at_datetime =self.datas[0].datetime.datetime(0),
default_value = self.datas[0].close[0]
)
long_order = {
"direction" : "long",
"order_placed_at" : len(self),
"order_placed_at_datetime" : current_tick["date"],
"target_price" : self.datas[0].close + self.distance_entry,
"take_profit" : self.datas[0].close + self.distance_tp,
"stop_loss" : self.datas[0].close - self.distance_sl
#"valid" : terminate_order
}
long_bracket = {
"limitprice": float('%.4f' % long_order["take_profit"]),
"price" : float('%.4f' % long_order["target_price"]),
"stopprice" : float('%.4f' % long_order["stop_loss"]),
"addinfo" : "long",
"size" : order_size,
#"exectype" : bt.Order.Market
#"valid" : terminate_order
}
self.order_pairs["long"] = self.buy_bracket(**long_bracket)
short_order = {
"direction" : "short",
"order_placed_at" : len(self),
"order_placed_at_datetime" : current_tick["date"],
"target_price" : self.datas[0].close - self.distance_entry,
"take_profit" : self.datas[0].close - self.distance_tp,
"stop_loss" : self.datas[0].close + self.distance_sl
#"valid" : terminate_order
}
short_bracket = {
"limitprice": float('%.4f' % short_order["take_profit"]),
"price" : float('%.4f' % short_order["target_price"]),
"stopprice" : float('%.4f' % short_order["stop_loss"]),
"addinfo" : "short",
"size" : order_size,
#"exectype" : bt.Order.Market
#"valid" : terminate_order
}
self.order_pairs["short"] = self.sell_bracket(**short_bracket)
Here's the logic for cancelling the other
def notify_order(self, order):
logging.info('[NOTIFY_ORDER {}] ORDER {} - {}'.format(len(self), order.Status[order.status], order.tradeid))
if order.status in [order.Submitted]:
# Buy/Sell order submitted/accepted to/by broker - Nothing to do
return
if order.status in [order.Accepted]:
# Buy/Sell order submitted/accepted to/by broker - Nothing to do
self.total_played+=1
if(order.isbuy()):
self.went_long+=1
if(order.issell()):
self.went_short+=1
order_addinfo = dict(order.info)
if(order_addinfo["addinfo"] == "long"):
if(self.order_pairs["short"] is not None):
for order in self.order_pairs["short"]:
self.cancel(order)
self.order_pairs["short"] = None
if(order_addinfo["addinfo"] == "short"):
if(self.order_pairs["long"] is not None):
for order in self.order_pairs["long"]:
self.cancel(order)
self.order_pairs["long"] = None
return
if order.status in [order.Expired, order.Cancelled, order.Rejected]:
pass
if order.status in [order.Completed]:
order_type = "buy" if( order.isbuy() ) else "sell"
logging.info('[NOTIFY_ORDER {}] {} ORDER EXECUTED [{}], Size: {}, Price: {}, Cost: {}, Comm {}'.format(
len(self),
order_type.upper(),
order.ref,
order.executed.size,
order.executed.price,
order.executed.value,
order.executed.comm))
For some reason, all the orders seem to be getting in but also getting out at exact same bar

Where am I going wrong?