Код: Выделить всё
def notify_order(self, order):
""" This method is used to monitor the status of an order. """
if order.status in [order.Submitted, order.Accepted]:
# Order is in progress
#logging.info(f"order is submitted {order.status} for {order.ref} with {order.created.price}")
return
if order.status in [order.Completed]:
instrument_name = order.data._name
if order.isbuy():
logging.info(f"BUY EXECUTED at price: {order.executed.price} for {instrument_name} with size {order.executed.size} ")
# calculating profit and loss values
tpslData = self.calculateTpSl(self.tpsl['long_pos'], order.executed.price, order.executed.size,
True)
self.profit_order[instrument_name] = self.sell(size=order.executed.size, exectype=bt.Order.Limit, data = order.data, price=tpslData[1], parent = self.order)
self.loss_order[instrument_name] = self.sell(size=order.executed.size, price=tpslData[0], data = order.data, exectype=bt.Order.Stop, parent = self.order)
elif order.issell():
logging.info(f"SELL EXECUTED at price: {order.executed.price} for {instrument_name} with size {order.executed.size}")
if order != self.loss_order[instrument_name]:
self.cancel(self.loss_order[instrument_name])
if order != self.profit_order[instrument_name]:
self.cancel(self.profit_order[instrument_name])
else:
logging.error(f"Not a expected order type {order.executed.value}")
elif order.status in [order.Canceled, order.Margin, order.Rejected]:
logging.info(f"order status is {order.status} at price: {order.executed.price}")
if i удалите родительский атрибут из ордеров на продажу, тогда он работает нормально, проблема возникает только тогда, когда и целевая прибыль, и стоп-лосс возникают в одной и той же свече, тогда размещаются два ордера на продажу.
Подробнее здесь: https://stackoverflow.com/questions/792 ... -as-parent