def open(self, trader, instrument, direction, order_type, order_price, quantity, take_profit, stop_loss, leverage=1.0, hedging=None): """ Open a position or buy an asset. @param hedging If defined use the defined value else use the default from the market. """ order = Order(trader, instrument.market_id) order.direction = direction order.order_type = order_type order.quantity = quantity order.leverage = leverage order.margin_trade = True order.post_only = False if order_type == Order.ORDER_LIMIT: order.price = order_price if hedging: order.hedging = hedging # generated a reference order id trader.set_ref_order_id(order) self.create_ref_oid = order.ref_order_id self.dir = order.direction self.op = order.price # retains the order price self.oq = order.quantity # ordered quantity self.tp = take_profit self.sl = stop_loss self.leverage = leverage self._stats['entry-order-type'] = order.order_type if trader.create_order(order, instrument): # keep the related create position identifier if available self.create_oid = order.order_id self.position_id = order.position_id if not self.eot and order.created_time: # only at the first open self.eot = order.created_time return True else: self._entry_state = StrategyTrade.STATE_REJECTED return False
def close(self, trader, instrument): """ Close the position and cancel the related orders. """ if self._closing: # already closing order return False if self.create_oid: # cancel the remaining buy order if trader.cancel_order(self.create_oid): self.create_ref_oid = None self.create_oid = None self._entry_state = StrategyTrade.STATE_CANCELED if self.stop_oid: # cancel the stop order if trader.cancel_order(self.stop_oid): self.stop_ref_oid = None self.stop_oid = None if self.limit_oid: # cancel the limit order if trader.cancel_order(self.limit_oid): self.limit_ref_oid = None if self.e - self.x > 0.0: # bitmex case no have position id order = Order(trader, instrument.market_id) order.direction = -self.dir # neg dir order.order_type = Order.ORDER_MARKET order.reduce_only = True order.quantity = self.e - self.x # remaining qty order.leverage = self.leverage order.margin_trade = True # generated a reference order id trader.set_ref_order_id(order) self.stop_ref_oid = order.ref_order_id self._stats['stop-order-type'] = order.order_type if trader.create_order(order): self.stop_oid = order.order_id self.stop_order_qty = order.quantity # closing order defined self._closing = True return True else: self.stop_ref_oid = None return False return True
def modify_take_profit(self, trader, instrument, limit_price): if self.limit_oid: # cancel the limit order and create a new one if trader.cancel_order(self.limit_oid): self.limit_ref_oid = None self.limit_oid = None self.limit_order_qty = 0.0 else: return False if self.e == self.x: # all entry qty is filled return True if self.e < self.x: # something wrong but its ok return False if self.position_id: # if not accepted as modification do it as limit order if trader.modify_position(self.position_id, take_profit_price=limit_price): self.tp = limit_price return True elif self.e > 0: # only if filled entry partially or totally order = Order(self, instrument.market_id) order.direction = -self.direction order.order_type = Order.ORDER_LIMIT order.reduce_only = True order.quantity = self.e - self.x # remaining order.price = limit_price order.leverage = self.leverage order.margin_trade = True trader.set_ref_order_id(order) self.limit_ref_oid = order.ref_order_id self._stats['limit-order-type'] = order.order_type if trader.create_order(order): self.limit_oid = order.order_id self.limit_order_qty = order.quantity self.last_tp_ot[0] = order.created_time self.last_tp_ot[1] += 1 self.tp = limit_price return True else: self.limit_ref_oid = None self.limit_order_qty = 0.0 return False
def modify_take_profit(self, trader, instrument, limit_price): if self.limit_oid: # cancel the limit order and create a new one if trader.cancel_order(self.limit_oid, instrument): self.limit_ref_oid = None self.limit_oid = None self.limit_order_qty = 0.0 else: return self.ERROR if self.e == self.x: # all entry qty is filled return self.NOTHING_TO_DO if self.e < self.x: # something wrong but its ok return self.NOTHING_TO_DO if self.e > 0 and limit_price > 0.0: # only if filled entry partially or totally order = Order(self, instrument.market_id) order.direction = -self.direction order.order_type = Order.ORDER_LIMIT order.reduce_only = True order.quantity = self.e - self.x # remaining order.price = limit_price order.leverage = self.leverage order.margin_trade = True trader.set_ref_order_id(order) self.limit_ref_oid = order.ref_order_id self._stats['take-profit-order-type'] = order.order_type if trader.create_order(order, instrument): self.limit_oid = order.order_id self.limit_order_qty = order.quantity self.last_tp_ot[0] = order.created_time self.last_tp_ot[1] += 1 self.tp = limit_price return self.ACCEPTED else: self.limit_ref_oid = None self.limit_order_qty = 0.0 return self.REJECTED return self.NOTHING_TO_DO
def open(self, trader, instrument, direction, order_type, order_price, quantity, take_profit, stop_loss, leverage=1.0, hedging=None): """ Open a position or buy an asset. """ order = Order(trader, instrument.market_id) order.direction = direction order.price = order_price order.order_type = order_type order.quantity = quantity order.post_only = False order.margin_trade = True order.leverage = leverage # generated a reference order id trader.set_ref_order_id(order) self.create_ref_oid = order.ref_order_id self.dir = order.direction self.op = order.price # retains the order price self.oq = order.quantity # ordered quantity self.tp = take_profit self.sl = stop_loss self.leverage = leverage self._stats['entry-order-type'] = order.order_type if trader.create_order(order, instrument): self.position_id = order.position_id # might be market-id if not self.eot and order.created_time: self.eot = order.created_time return True else: self._entry_state = StrategyTrade.STATE_REJECTED return False
def modify_stop_loss(self, trader, instrument, stop_price): if self.stop_oid: # cancel the stop order and create a new one if trader.cancel_order(self.stop_oid): self.stop_ref_oid = None self.stop_oid = None else: return False if self.e == self.x: # all entry qty is filled return True if self.e < self.x: # something wrong but its ok return False if self.e > 0 and stop_price > 0.0: # only if filled entry partially or totally order = Order(self, instrument.market_id) order.direction = -self.direction order.order_type = Order.ORDER_STOP order.reduce_only = True order.quantity = self.e - self.x # remaining order.stop_price = stop_price order.leverage = self.leverage order.margin_trade = True trader.set_ref_order_id(order) self.stop_ref_oid = order.ref_order_id self._stats['stop-order-type'] = order.order_type if trader.create_order(order): self.stop_oid = order.order_id self.stop_order_qty = order.quantity self.last_sl_ot[0] = order.created_time self.last_sl_ot[1] += 1 self.sl = stop_price return True else: self.stop_ref_oid = None self.stop_order_qty = 0.0 return False
def modify_stop_loss(self, trader, instrument, stop_price): if self.stop_oid: # cancel the stop order and create a new one if trader.cancel_order(self.stop_oid, instrument): self.stop_ref_oid = None self.stop_oid = None else: return self.ERROR if self.e - self.x > 0.0: # only if filled entry partially or totally order = Order(self, instrument.market_id) order.direction = -self.direction order.order_type = Order.ORDER_STOP order.reduce_only = True order.quantity = self.e - self.x # remaining order.stop_price = stop_price order.margin_trade = True order.leverage = self.leverage trader.set_ref_order_id(order) self.stop_ref_oid = order.ref_order_id self._stats['stop-order-type'] = order.order_type if trader.create_order(order, instrument): self.stop_oid = order.order_id self.stop_order_qty = order.quantity self.last_stop_ot[0] = order.created_time self.last_stop_ot[1] += 1 self.sl = stop_price return self.ACCEPTED else: self.stop_ref_oid = None self.stop_order_qty = 0.0 return self.REJECTED return self.NOTHING_TO_DO
def modify_take_profit(self, trader, instrument, limit_price): if self.limit_oid: # cancel the limit order and create a new one if trader.cancel_order(self.limit_oid): self.limit_ref_oid = None self.limit_oid = None self.limit_order_qty = 0.0 else: return False if self.e - self.x > 0.0: # only if filled entry partially or totally order = Order(self, instrument.market_id) order.direction = -self.direction order.order_type = Order.ORDER_LIMIT order.reduce_only = True order.quantity = self.e - self.x # remaining order.price = limit_price order.margin_trade = True order.leverage = self.leverage trader.set_ref_order_id(order) self.limit_ref_oid = order.ref_order_id self._stats['limit-order-type'] = order.order_type if trader.create_order(order): self.limit_oid = order.order_id self.limit_order_qty = order.quantity self.last_tp_ot[0] = order.created_time self.last_tp_ot[1] += 1 self.tp = limit_price return True else: self.limit_ref_oid = None self.limit_order_qty = 0.0 return False