Exemple #1
0
    def create_from_start_amount(cls,
                                 symbol,
                                 start_currency,
                                 amount_start,
                                 dest_currency,
                                 price,
                                 cancel_threshold: float = 0.000001,
                                 max_order_updates: int = 10):

        side = core.get_order_type(start_currency, dest_currency, symbol)

        if not side:
            raise errors.OrderError("Wrong symbol {} for trade {} - {}".format(
                symbol, start_currency, dest_currency))

        if price <= 0:
            raise errors.OrderError(
                "Wrong price. Symbol: {}, Side:{}, Price:{} ".format(
                    symbol, side, price))

        if side == "sell":
            amount = amount_start

        elif side == "buy":
            amount = amount_start / price

        owa_order = cls(symbol, amount, price, side, cancel_threshold,
                        max_order_updates)
        return owa_order
Exemple #2
0
    def _create_next_trade_order_for_remained_amount(self, price):
        """
        creates the next trade order for unfilled amount of Action order

        :param price: price of the new order
        :return:
        """

        amount = self.start_amount - self.filled_start_amount

        if amount <= 0:
            raise errors.OrderError("Bad new order amount {}".format(amount))

        order_params = (self.symbol, self.start_currency, amount,
                        self.dest_currency, price)

        if False not in order_params:
            # self.price = price
            order = TradeOrder.create_limit_order_from_start_amount(
                *order_params)  # type: TradeOrder
            order.supplementary.update(
                {"parent_action_order": {
                    "state": self.state
                }})
            return order

        else:
            raise errors.OrderError("Not all parameters for Order are set")
Exemple #3
0
    def __init__(self,
                 symbol,
                 amount: float,
                 price: float,
                 side: str,
                 cancel_threshold: float = 0.000001,
                 max_order_updates: int = 10):

        if price is None or price <= 0:
            raise errors.OrderError("Wrong price {}".format(price))

        self.id = str(uuid.uuid4())  # internal ID

        self.timestamp = time.time()  # timestamp of object creation
        self.timestamp_close = float()

        # Generic order Parameters
        self.symbol = symbol
        self.amount = amount
        self.price = price
        self.side = side

        self.cancel_threshold = cancel_threshold  # do not cancel if less than this threshold

        self.status = "new"  # new, open, closed

        self.filled_dest_amount = 0.0
        self.filled_start_amount = 0.0
        self.filled_price = 0.0

        self.filled = 0.0  # filled amount of base currency

        self.max_order_updates = max_order_updates  # max amount of order updates

        self.order_command = None  # None, new, cancel

        self.active_trade_order = None
        self.orders_history = list()  # type: List[TradeOrder]

        self.market_data = list(
        )  # list of data received by via order commands

        self._prev_filled_dest_amount = 0.0  # filled amounts on previous orders
        self._prev_filled_start_amount = 0.0  # filled amountsbot, on previous orders
        self._prev_filled = 0.0  # filled amounts on previous orders

        # create initial trade order
        self.active_trade_order = self._create_initial_trade_order(
        )  # type: TradeOrder

        # different tags for additional information
        self.tags = list()

        self._force_close = False
        """
        flag to force ActionOrder  closing. Means to cancel current trade order and finalize
        """

        # init the global parameters of order and state
        self._init()
Exemple #4
0
    def _get_recovery_price_for_best_dest_amount(self):
        """
        :return: price for recovery order from target_amount and target_currency without fee
        """
        if self.best_dest_amount == 0 or self.start_amount == 0:
            raise errors.OrderError(
                "RecoveryManagerError: Zero start ot dest amount")

        if self.symbol is None:
            raise errors.OrderError("RecoveryManagerError: Symbol is not set")

        if self.side is None:
            raise errors.OrderError("RecoveryManagerError: Side not set")

        if self.side == "buy":
            return self.start_amount / self.best_dest_amount
        if self.side == "sell":
            return self.best_dest_amount / self.start_amount
        return False
Exemple #5
0
    def _init_market_price(self):
        try:
            price = self.market_data[self.symbol]["price"][self.side]
        except Exception:
            raise errors.OrderError("Could not set price from market data")

        self.status = "open"
        self.state = "market_price"
        self.order_command = "new"

        self.active_trade_order = self._create_recovery_order(
            price, self.state)
Exemple #6
0
    def _create_recovery_order(self, price, state: str):

        amount = self.start_amount - self.filled_start_amount

        if amount <= 0:
            raise errors.OrderError("Bad new order amount {}".format(amount))

        order_params = (self.symbol, self.start_currency, amount,
                        self.dest_currency, price)

        if False not in order_params:
            self.price = price
            order = TradeOrder.create_limit_order_from_start_amount(
                *order_params)  # type: TradeOrder
            order.supplementary.update(
                {"parent_action_order": {
                    "state": state
                }})
            return order

        else:
            raise errors.OrderError("Not all parameters for Order are set")
Exemple #7
0
    def _close_active_order(self):
        if self.active_trade_order.status == "closed" or self.active_trade_order.status == "canceled":
            self.orders_history.append(copy.copy(self.active_trade_order))
            self.active_trade_order = None
            self.order_command = ""

            self._prev_filled = copy.copy(self.filled)
            self._prev_filled_start_amount = copy.copy(
                self.filled_start_amount)
            self._prev_filled_dest_amount = copy.copy(self.filled_dest_amount)

        else:
            raise errors.OrderError(
                "Active Trade order is not closed {}".format(
                    self.active_trade_order.status))