def _get_new_price(self, order_type, price): margin = self._options.margin + self._get_random_margin_jitter(self._options.margin_jitter) if order_type == Order.TYPE_SELL: return normalize_value(price + price * margin, self._options.pair.second.places) if order_type == Order.TYPE_BUY: return normalize_value(price - price * margin, self._options.pair.second.places) raise Exception('unknown order type %s' % order_type)
def _get_completed_orders(self, pair): try: orders = yield self._trade_api.get_completed_orders(_currency_pair_to_string(pair)) orders = sorted((Order(int(order['id']), Order.TYPE_SELL if order['type'] == 'sell' else Order.TYPE_BUY, normalize_value(order['amount'], pair.first.places), normalize_value(order['price'], pair.second.places), None, order['completed']) for order in orders), key=lambda order: order.completed, reverse=True) except Exception as e: logger.warn('Cannot get completed orders: %s', e) else: self._events.on_next(events.CompletedOrdersEvent(pair, orders))
def _get_price(self, pair): try: price = yield self._public_api.get_price(_currency_pair_to_string(pair)) except Exception as e: logger.warn('Cannot get price: %s', e) else: self._events.on_next(events.PriceEvent(pair, normalize_value(price, pair.second.places)))
def _get_balance(self, currency): try: balance = yield self._trade_api.get_balance(currency.name.lower()) except Exception as e: logger.warn('Cannot get balance: %s', e) else: amount = normalize_value(balance, currency.places) self._events.on_next(events.BalanceEvent(currency, amount))
def _get_random_margin_jitter(self, jitter): return normalize_value(Decimal(uniform(-float(jitter), float(jitter))), 4)
def _send_balance_events(self, balance): for currency in CURRENCIES: amount = balance.get(currency.name.lower()) if amount is not None: self._commands.on_next(events.BalanceEvent(currency, normalize_value(amount, currency.places)))