Ejemplo n.º 1
0
 def _start(bot: Bot, update: Update) -> None:
     """
     Handler for /start.
     Starts TradeThread
     :param bot: telegram bot
     :param update: message update
     :return: None
     """
     from main import get_instance
     if get_instance().is_alive():
         TelegramHandler.send_msg('*Status:* `already running`', bot=bot)
     else:
         get_instance(recreate=True).start()
Ejemplo n.º 2
0
 def _stop(bot: Bot, update: Update) -> None:
     """
     Handler for /stop.
     Stops TradeThread
     :param bot: telegram bot
     :param update: message update
     :return: None
     """
     from main import get_instance
     if get_instance().is_alive():
         TelegramHandler.send_msg('`Stopping trader ...`', bot=bot)
         get_instance().stop()
     else:
         TelegramHandler.send_msg('*Status:* `already stopped`', bot=bot)
Ejemplo n.º 3
0
    def _performance(bot: Bot, update: Update) -> None:
        """
        Handler for /performance.
        Shows a performance statistic from finished trades
        :param bot: telegram bot
        :param update: message update
        :return: None
        """
        from main import get_instance
        if not get_instance().is_alive():
            TelegramHandler.send_msg('`trader is not running`', bot=bot)
            return

        pair_rates = Session.query(Trade.pair, func.sum(Trade.close_profit).label('profit_sum')) \
            .filter(Trade.is_open.is_(False)) \
            .group_by(Trade.pair) \
            .order_by('profit_sum DESC') \
            .all()

        stats = '\n'.join(
            '{}. <code>{}\t{}%</code>'.format(i + 1, pair, round(rate, 2))
            for i, (pair, rate) in enumerate(pair_rates))

        message = '<b>Performance:</b>\n{}\n'.format(stats)
        logger.debug(message)
        TelegramHandler.send_msg(message, parse_mode=ParseMode.HTML)
Ejemplo n.º 4
0
    def _status(bot: Bot, update: Update) -> None:
        """
        Handler for /status.
        Returns the current TradeThread status
        :param bot: telegram bot
        :param update: message update
        :return: None
        """
        # Fetch open trade
        trades = Trade.query.filter(Trade.is_open.is_(True)).all()
        from main import get_instance
        if not get_instance().is_alive():
            TelegramHandler.send_msg('*Status:* `trader is not running`',
                                     bot=bot)
        elif not trades:
            TelegramHandler.send_msg('*Status:* `no active order`', bot=bot)
        else:
            for trade in trades:
                # calculate profit and send message to user
                current_rate = api_wrapper.get_ticker(trade.pair)['bid']
                current_profit = 100 * (
                    (current_rate - trade.open_rate) / trade.open_rate)
                orders = api_wrapper.get_open_orders(trade.pair)
                orders = [o for o in orders if o['id'] == trade.open_order_id]
                order = orders[0] if orders else None
                message = """
*Trade ID:* `{trade_id}`
*Current Pair:* [{pair}]({market_url})
*Open Since:* `{date}`
*Amount:* `{amount}`
*Open Rate:* `{open_rate}`
*Close Rate:* `{close_rate}`
*Current Rate:* `{current_rate}`
*Close Profit:* `{close_profit}`
*Current Profit:* `{current_profit}%`
*Open Order:* `{open_order}`
                """.format(
                    trade_id=trade.id,
                    pair=trade.pair,
                    market_url=api_wrapper.get_pair_detail_url(trade.pair),
                    date=arrow.get(trade.open_date).humanize(),
                    open_rate=trade.open_rate,
                    close_rate=trade.close_rate,
                    current_rate=current_rate,
                    amount=round(trade.amount, 8),
                    close_profit='{}%'.format(round(trade.close_profit, 2))
                    if trade.close_profit else None,
                    current_profit=round(current_profit, 2),
                    open_order='{} ({})'.format(
                        order['remaining'], order['type']) if order else None,
                )
                TelegramHandler.send_msg(message, bot=bot)
Ejemplo n.º 5
0
    def _forcesell(bot: Bot, update: Update) -> None:
        """
        Handler for /forcesell <id>.
        Sells the given trade at current price
        :param bot: telegram bot
        :param update: message update
        :return: None
        """
        from main import get_instance
        if not get_instance().is_alive():
            TelegramHandler.send_msg('`trader is not running`', bot=bot)
            return

        try:
            trade_id = int(update.message.text
                           .replace('/forcesell', '')
                           .strip())
            # Query for trade
            trade = Trade.query.filter(and_(
                Trade.id == trade_id,
                Trade.is_open.is_(True)
            )).first()
            if not trade:
                TelegramHandler.send_msg('There is no open trade with ID: `{}`'.format(trade_id))
                return
            # Get current rate
            current_rate = api_wrapper.get_ticker(trade.pair)['bid']
            # Get available balance
            currency = trade.pair.split('_')[1]
            balance = api_wrapper.get_balance(currency)
            # Execute sell
            profit = trade.exec_sell_order(current_rate, balance)
            message = '*{}:* Selling [{}]({}) at rate `{:f} (profit: {}%)`'.format(
                trade.exchange.name,
                trade.pair.replace('_', '/'),
                api_wrapper.get_pair_detail_url(trade.pair),
                trade.close_rate,
                round(profit, 2)
            )
            logger.info(message)
            TelegramHandler.send_msg(message)

        except ValueError:
            TelegramHandler.send_msg('Invalid argument. Usage: `/forcesell <trade_id>`')
            logger.warning('/forcesell: Invalid argument received')