def internal_send_order(self, order: Order): if order.limit_price is not None: order.limit_price = round(order.limit_price, self.symbol_object.pricePrecision) if order.stop_price is not None: order.stop_price = round(order.stop_price, self.symbol_object.pricePrecision) order_type = OrderType.STOP else: order_type = OrderType.LIMIT elif order.stop_price is not None: order.stop_price = round(order.stop_price, self.symbol_object.pricePrecision) order_type = OrderType.STOP_MARKET else: order_type = OrderType.MARKET order.amount = round(order.amount, self.symbol_object.quantityPrecision) quantityFormat = "{:." + str(self.symbol_object.quantityPrecision) + "f}" priceFormat = "{:." + str(self.symbol_object.pricePrecision) + "f}" # yes have to send the price and quantity in as str (although it wants float) cause otherwise it converts it # inernally and that sometimes f**k up the precision (0.023 -> 0.02299999999) resultOrder: binance_f.model.Order = self.client.post_order( symbol=self.symbol, side=OrderSide.BUY if order.amount > 0 else OrderSide.SELL, ordertype=order_type, timeInForce=TimeInForce.GTC if order_type in [OrderType.LIMIT, OrderType.STOP] else None, quantity=quantityFormat.format(abs(order.amount)), price=priceFormat.format(order.limit_price) if order.limit_price is not None else None, stopPrice=priceFormat.format(order.stop_price) if order.stop_price is not None else None, newClientOrderId=order.id) order.exchange_id = resultOrder.orderId
def internal_update_order(self, order: Order): order_type = "Market" if order.stop_price is not None and ( self.last - order.stop_price) * order.amount >= 0: order.stop_price = None # already triggered if order.limit_price is not None: if order.stop_price is not None: order_type = "StopLimit" else: order_type = "Limit" elif order.stop_price is not None: order_type = "Stop" if (order.stop_price >= self.last and order.amount < 0) or \ (order.stop_price <= self.last and order.amount > 0): # prevent error of "would trigger immediatly" order_type = "Market" params = dict(symbol=self.symbol, side="Buy" if order.amount > 0 else "Sell", orderQty=abs(order.amount), ordType=order_type, stopPxEp=self.scale_price(order.stop_price), priceEp=self.scale_price(order.limit_price), triggerType="ByLastPrice" if order.stop_price is not None else None) self.client.amend_order(symbol=self.symbol, orderID=order.exchange_id, params=params)
def internal_send_order(self, order: Order): order_type = "Market" if order.limit_price is not None: order_type = "Limit" if order.stop_price is not None and (self.last - order.stop_price) * order.amount >= 0: order.stop_price = None # already triggered orderType = TradingBot.order_type_from_order_id(order.id) if order.stop_price is not None: # conditional order base_side = self.symbol_info.tickSize * ( 1 if order.amount < 0 else -1) # buy stops are triggered when price goes higher (so it is # considered lower before) normalizedStop = self.symbol_info.normalizePrice(order.stop_price, order.amount > 0) result = self._execute(self.bybit.LinearConditional.LinearConditional_new(side=("Buy" if order.amount > 0 else "Sell"), symbol=self.symbol, order_type=order_type, qty=strOrNone( self.symbol_info.normalizeSize( abs(order.amount))), price=strOrNone( self.symbol_info.normalizePrice( order.limit_price, order.amount < 0)), stop_px=strOrNone(normalizedStop), order_link_id=order.id, base_price=strOrNone(round( normalizedStop + base_side, self.symbol_info.pricePrecision)), time_in_force="GoodTillCancel", reduce_only= orderType != OrderType.ENTRY, close_on_trigger= orderType != OrderType.ENTRY)) if result is not None: order.exchange_id = result['stop_order_id'] else: result = self._execute(self.bybit.LinearOrder.LinearOrder_new(side=("Buy" if order.amount > 0 else "Sell"), symbol=self.symbol, order_type=order_type, qty=strOrNone( self.symbol_info.normalizeSize( abs(order.amount))), price=strOrNone( self.symbol_info.normalizePrice(order.limit_price, order.amount < 0)), order_link_id=order.id, time_in_force="GoodTillCancel", reduce_only= orderType != OrderType.ENTRY, close_on_trigger= orderType != OrderType.ENTRY)) if result is not None: order.exchange_id = result['order_id']
def internal_send_order(self, order: Order): order_type = "Market" if order.limit_price is not None: order_type = "Limit" if order.stop_price is not None and ( self.last - order.stop_price) * order.amount >= 0: order.stop_price = None # already triggered if order.stop_price is not None: # conditional order base_side = self.symbol_info.tickSize * ( 1 if order.amount < 0 else -1 ) # buy stops are triggered when price goes higher (so it is # considered lower before) normalizedStop = self.symbol_info.normalizePrice( order.stop_price, order.amount > 0) result = self.handle_result( lambda: self.pybit.place_conditional_order( side=("Buy" if order.amount > 0 else "Sell"), symbol=self.symbol, order_type=order_type, qty=strOrNone(int(abs(order.amount))), price=strOrNone( self.symbol_info.normalizePrice( order.limit_price, order.amount < 0)), stop_px=strOrNone(normalizedStop), order_link_id=order.id, base_price=strOrNone( round(normalizedStop + base_side, self.symbol_info. pricePrecision)), time_in_force="GoodTillCancel")) if result is not None: order.exchange_id = result['stop_order_id'] else: result = self.handle_result(lambda: self.pybit.place_active_order( side=("Buy" if order.amount > 0 else "Sell"), symbol=self.symbol, order_type=order_type, qty=strOrNone(int(abs(order.amount))), price=strOrNone( self.symbol_info.normalizePrice(order.limit_price, order. amount < 0)), order_link_id=order.id, time_in_force="GoodTillCancel")) if result is not None: order.exchange_id = result['order_id']
def internal_send_order(self, order: Order): order_type = "Market" if order.limit_price is not None: order_type = "Limit" if order.stop_price is not None and ( self.last - order.stop_price) * order.amount >= 0: order.stop_price = None # already triggered if order.stop_price is not None: # conditional order base_side = 1 if order.amount < 0 else -1 # buy stops are triggered when price goes higher (so it is # considered lower before) normalizedStop = self.symbol_info.normalizePrice( order.stop_price, order.amount > 0) result = self._execute( self.bybit.Conditional.Conditional_new( side=("Buy" if order.amount > 0 else "Sell"), symbol=self.symbol, order_type=order_type, qty=abs(order.amount), price=self.symbol_info.normalizePrice( order.limit_price, order.amount < 0), stop_px=normalizedStop, order_link_id=order.id, base_price=normalizedStop + base_side, time_in_force="GoodTillCancel")) if result is not None: order.exchange_id = result['stop_order_id'] else: result = self._execute( self.bybit.Order.Order_newV2( side=("Buy" if order.amount > 0 else "Sell"), symbol=self.symbol, order_type=order_type, qty=abs(order.amount), price=self.symbol_info.normalizePrice( order.limit_price, order.amount < 0), order_link_id=order.id, time_in_force="GoodTillCancel")) if result is not None: order.exchange_id = result['order_id']