Пример #1
0
    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
Пример #2
0
    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)
Пример #3
0
    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']
Пример #4
0
    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']
Пример #5
0
    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']