Esempio n. 1
0
def get_avg(exchanges):
    """Calculate average last value from the specified exchanges

    Args:
        exchanges (LIST): Exchanges' names

    Returns:
        FLOAT: Average value
    """
    values = []
    for exchange in active_exchanges():
        exchange_lower = exchange.name.lower().replace(' ', '_')
        if exchange_lower in exchanges:
            res = get_alternate_value(exchange, position='previous')
            if res:
                last, buy, trend = res
                values.append(last)
    avg = reduce(lambda x, y: x + y, values) / len(values)
    return avg
Esempio n. 2
0
def get_exchanges_info():
    """Generate response used by the exchanges API

    Returns:
        DICT: Exchanges info and last value
    """
    now = datetime.now()

    res = {
        '_timestamp': now.strftime('%a %b %d %Y, %H:%M:%S'),
    }

    for exchange in active_exchanges():

        if exchange.key_buy:
            previous = last = buy = trend = None

            # Get the last/buy values and trend computed by the get_values task
            previous = get_alternate_value(exchange, position='previous')
            if previous:
                last, buy, trend = previous

            # Get the last value history from the last 10 days
            query = Graph.query.filter_by(
                exchange_id=exchange.id).order_by(
                Graph.date.desc()).limit(10).all()

            history = []
            for assoc in query:
                history.append(assoc.last)

            key = exchange.name.lower().replace(' ', '_')

            res[key] = {
                'currency': exchange.currency_to.name,
                'buy': buy,
                'sell': last,
                'history': history[::-1],
                'trend': trend or None,
            }

    return res
Esempio n. 3
0
def get_values():
    """
    Manager command to get last values from all active exchanges
    """
    for exchange in active_exchanges():

        ticker = exchange.url + exchange.api
        subject = '[ERROR] %s exchange' % exchange.name
        error_msg = "Exchange: %s\nTicker: %s\nException: " % (exchange.name,
                                                               ticker)

        try:
            previous_last = last = buy = trend = None

            last = exchange.get_value(exchange.key_last)
            if exchange.key_buy:
                buy = exchange.get_value(exchange.key_buy)
            # Close session opened after the execution of get_value method
            db.session.close()

            # Also get previous to calculate trend
            res = get_alternate_value(exchange, position='previous')
            if res:
                previous_last, previous_buy, trend = res

            if previous_last and last:
                if previous_last < last:
                    trend = 'up'
                elif previous_last > last:
                    trend = 'down'
                else:
                    trend = 'equal'

            assoc = Association(
                exchange_id=exchange.id,
                last=last,
                buy=buy,
                trend=trend or None,
                date=date.today(),
                time=datetime.now().time()
            )
            if assoc.last:
                print '%s: %s %s %s' % (exchange.name,
                                        assoc.last,
                                        exchange.currency_to.name,
                                        trend or '')

                db.session.add(assoc)
            else:
                raise Exception

        except Exception as err:
            if not err.message:
                err.message = 'Connection Error. Ticker API is down.'
            print subject + ': ' + str(err.message)
            if app.config.get('ENABLE_MAIL_NOTIFICATIONS', False):
                send_async_email(subject, error_msg + str(err.message))

        finally:
            db.session.commit()
            db.session.close()
Esempio n. 4
0
def get_graphs():
    """
    Store graph data in database to be used later by the graphs API
    """
    # List of exchanges to store values for a candlesticks graph
    candlesticks_exchanges = ['Bitstamp']

    for exchange in active_exchanges():

        ticker = exchange.url + exchange.api
        subject = '[ERROR] %s exchange (GRAPH)' % exchange.name
        error_msg = "Exchange: %s\nTicker: %s\nException: " % (exchange.name,
                                                               ticker)

        try:

            last = opn = high = low = close = volume = None
            last = exchange.get_value(exchange.key_last)
            # Close session opened after the execution of get_value method
            db.session.close()
            if exchange.name in candlesticks_exchanges:
                # Get the open value (the first value of the day)
                opn, buy, trend = get_alternate_value(exchange,
                                                      position='first')
                # Get ticker to obtain additional values to show in graph
                response = get_ticker_response(exchange)

                if opn and response:

                    # Serialize ticker response
                    json = loads(response.content)

                    close = json['last'] or None,
                    high = json['high'] or None,
                    low = json['low'] or None,
                    volume = float(json['volume']) or None,

        except ConnectionError:
            if not last:
                previous = get_alternate_value(exchange, position='previous')
                if previous:
                    last = previous[0]
                    excep = 'Error connecting with API. Using previous value.'
                    if app.config.get('ENABLE_MAIL_NOTIFICATIONS', False):
                        send_async_email(subject, error_msg + excep)
                else:
                    excep = 'Error connecting with API. No previous value get.'
                    if app.config.get('ENABLE_MAIL_NOTIFICATIONS', False):
                        send_async_email(subject, error_msg + excep)
                print subject + ': ' + excep

        except Exception as err:
            print subject + ': ' + str(err.message)
            if app.config.get('ENABLE_MAIL_NOTIFICATIONS', False):
                send_async_email(subject, error_msg + str(err.message))

        finally:
            try:
                # Write obtained values to database
                graph = Graph(
                    exchange_id=exchange.id,
                    last=last,
                    opn=opn,
                    close=close,
                    high=high,
                    low=low,
                    volume=volume,
                    date=date.today(),
                    time=datetime.now().time()
                )

                if graph.last:
                    print "Getting graph data for '%s'" % exchange.name
                    db.session.add(graph)
                else:
                    raise Exception

            except Exception as err:
                if not err.message:
                    err.message = 'Connection Error. Ticker API is down.'
                print subject + ': ' + str(err.message)
                if app.config.get('ENABLE_MAIL_NOTIFICATIONS', False):
                    send_async_email(subject, error_msg + str(err.message))

            finally:
                db.session.commit()
                db.session.close()