def show_stats(self):
        indexInfo = IndexInfoModel.get(id=1)

        # Create the Index Table
        cointTableData = [[
            'Coin', 'Amount', 'BTC Val', 'USD Val', 'Desired %', 'Locked',
            'Active %', 'U Gain %', 'R Gain %'
        ]]

        for coin in IndexedCoinModel.select():

            coinBalance = CoinBalanceModel.get(
                CoinBalanceModel.Coin == coin.Ticker)
            realizedGainModel = DatabaseManager.get_realized_gain_model(
                coin.Ticker)

            newArray = [
                coin.Ticker,
                coinBalance.TotalCoins,
                coinBalance.BTCBalance,
                round(coinBalance.USDBalance, 2),
                coin.DesiredPercentage,
                coin.Locked,
                coin.CurrentPercentage,
                coin.UnrealizedGain,
                realizedGainModel.RealizedGain,
            ]
            cointTableData.append(newArray)

        # Create the summary table
        summary_table_data = [[
            'Active', 'Index Count', 'BTC Val', 'USD Val', 'Unrealized Gain %',
            'Realized Gain %'
        ]]
        summary_table_data.append([
            True,
            len(IndexedCoinModel.select()), indexInfo.TotalBTCVal,
            indexInfo.TotalUSDVal,
            round(indexInfo.TotalUnrealizedGain, 2),
            round(indexInfo.TotalRealizedGain, 2)
        ])

        coin_table = AsciiTable(cointTableData)
        summary_table = AsciiTable(summary_table_data)

        sys.stdout.write("\nCurrent Index Summary\n")
        sys.stdout.write(summary_table.table)

        sys.stdout.write("\nCurrent Index Table\n")
        sys.stdout.write(coin_table.table)
        sys.stdout.write('\n')
Ejemplo n.º 2
0
def wallet_update_task():

    em = ExchangeManager()
    walletData = em.get_balance()
    btcUsdValue = em.get_btc_usd_value()

    totalBtcValue = 0.0

    logger.info("Starting Wallet Update Task")

    for key in DatabaseManager.get_all_supported_coin_models():

        btcbalance = 0.0
        usdBalance = 0.0
        totalCoins = None
        fullTicker = key.Ticker + "/BTC"

        if key.Ticker == 'BTC':
            fullTicker = 'BTC/USDT'

        tickerModel = DatabaseManager.get_ticker_model(fullTicker)

        try:
            btcbalance = walletData[key.Ticker]['total'] * tickerModel.BTCVal
            totalCoins = walletData[key.Ticker]['total']
            usdBalance = btcUsdValue * btcbalance
        except:
            btcbalance = 0.0
            totalCoins = 0.0

        if key.Ticker == 'BTC':
            btcbalance = walletData[key.Ticker]['total']
            usdBalance = btcUsdValue * btcbalance

        indexedCoin = DatabaseManager.get_index_coin_model(key.Ticker)

        if indexedCoin is not None:
            totalBtcValue = totalBtcValue + btcbalance

        if DatabaseManager.create_coin_balance_model(key.Ticker, btcbalance,
                                                     usdBalance, totalCoins,
                                                     datetime.datetime.now()):
            #logger.debug("Created Coin Balance Model - " + key.Ticker)
            pass
        else:
            if DatabaseManager.update_coin_balance_model(
                    key.Ticker, btcbalance, btcUsdValue * btcbalance,
                    totalCoins, datetime.datetime.now()):
                #logger.debug("Updated Coin Balance Model - " + key.Ticker)
                pass
            else:
                logger.error("Failed Update Coin Balance Model - " +
                             key.Ticker)

    totalUnrealizeGain = 0.0
    totalRealizedGain = 0.0

    for key in DatabaseManager.get_all_supported_coin_models():

        coinBalance = DatabaseManager.get_coin_balance_model(key.Ticker)
        indexedCoin = DatabaseManager.get_index_coin_model(key.Ticker)
        realizedGainModel = DatabaseManager.get_realized_gain_model(key.Ticker)

        if indexedCoin is not None:

            if DatabaseManager.update_index_coin_model(
                    indexedCoin.Ticker, indexedCoin.DesiredPercentage,
                (coinBalance.BTCBalance / totalBtcValue) * 100,
                ((coinBalance.BTCBalance / totalBtcValue) * 100) -
                    indexedCoin.DesiredPercentage, indexedCoin.Locked):
                totalUnrealizeGain = totalUnrealizeGain + (
                    ((coinBalance.BTCBalance / totalBtcValue) * 100) -
                    indexedCoin.DesiredPercentage)
                totalRealizedGain = totalRealizedGain + realizedGainModel.RealizedGain

                logger.debug("Total unrealized gain - " +
                             str(totalUnrealizeGain))
                logger.debug("Updated Indexed Coin Model - " +
                             indexedCoin.Ticker)
            else:
                logger.error("Failed To Update Indexed Coin Model - " +
                             indexedCoin.Ticker)

    indexInfo = DatabaseManager.get_index_info_model()

    totalUnrealizeGain = totalUnrealizeGain

    if DatabaseManager.update_index_info_model(
            indexInfo.Active, totalBtcValue, btcUsdValue * totalBtcValue,
            totalRealizedGain, totalUnrealizeGain, indexInfo.BalanceThreshold,
            indexInfo.OrderTimeout, indexInfo.OrderRetryAmount,
            indexInfo.RebalanceTickSetting):
        logger.debug("Updated Index Info Model")
    else:
        logger.error("Failed To Update Index Info Model")

    logger.info("Wallet Update Task Completed")
Ejemplo n.º 3
0
def perform_rebalance_task(rebalanceTicker, rebalanceSellAmount, elgibleTicker,
                           elgibleBuyAmount):

    coinSellIncomplete = True
    coinBuyIncomplete = True
    coinSellRetryCount = 0
    coinBuyRetryCount = 0
    coinSellFailed = False

    sellOrderUUID = ""
    buyOrderUUID = ""

    indexInfo = DatabaseManager.get_index_info_model()

    retryLimit = indexInfo.OrderRetryAmount

    rebalanceTickerGainModel = DatabaseManager.get_realized_gain_model(
        rebalanceTicker)
    elgibleCoinTicker = DatabaseManager.get_ticker_model(elgibleTicker +
                                                         "/BTC")

    em = ExchangeManager()

    partial_fill_amount = 0
    partial_filled = False

    if rebalanceTicker != "BTC" and rebalanceTicker != "btc":

        while coinSellIncomplete:

            if coinSellRetryCount >= retryLimit:
                coinSellFailed = True
                coinSellIncomplete = False
                break
                # Cancel Order
            else:

                rebalanceCoinTicker = DatabaseManager.get_ticker_model(
                    rebalanceTicker + "/BTC")

                if CondexConfig.DEBUG == True:
                    logger.info("Placing Sell Order For " + rebalanceTicker +
                                "/BTC")
                else:
                    logger.info("Selling " + str(rebalanceSellAmount) +
                                " of " + rebalanceTicker + " at " +
                                str(rebalanceCoinTicker.BTCVal))
                    sellOrderUUID = em.create_sell_order(
                        rebalanceTicker, rebalanceSellAmount,
                        rebalanceCoinTicker.BTCVal)['id']
                    time.sleep(60 * indexInfo.OrderTimeout)

                # Check order succeded through
                if CondexConfig.DEBUG == True:
                    logger.debug("Fetching order")
                    coinSellIncomplete = False
                else:

                    order_result = em.fetch_order(sellOrderUUID)
                    order_filled_amount = order_result['filled']

                    if order_result['status'] == "closed":
                        logger.debug("Sold coin " + rebalanceTicker + " for " +
                                     str(order_result['price']))
                        coinSellIncomplete = False
                        DatabaseManager.update_realized_gain_model(
                            rebalanceTicker,
                            rebalanceTickerGainModel.RealizedGain +
                            ((order_filled_amount * rebalanceCoinTicker.BTCVal)
                             / indexInfo.TotalBTCVal) * 100)
                    elif (
                            order_filled_amount * rebalanceCoinTicker.BTCVal
                    ) > CondexConfig.BITTREX_MIN_BTC_TRADE_AMOUNT and order_result[
                            'status'] == "open":
                        em.cancel_order(sellOrderUUID)
                        logger.debug("Sold partial of coin " +
                                     rebalanceTicker + " for " +
                                     str(order_result['price']))
                        coinSellIncomplete = False
                        partial_filled = True
                        partial_fill_amount = order_filled_amount * rebalanceCoinTicker.BTCVal
                        DatabaseManager.update_realized_gain_model(
                            rebalanceTicker,
                            rebalanceTickerGainModel.RealizedGain +
                            ((order_filled_amount * rebalanceCoinTicker.BTCVal)
                             / indexInfo.TotalBTCVal) * 100)
                    else:
                        coinSellRetryCount = coinSellRetryCount + 1
                        if CondexConfig.DEBUG == True:
                            logger.debug("Canceling sell order")
                        else:
                            em.cancel_order(sellOrderUUID)
                            logger.debug("Sell Order Timeout Reached")
                        time.sleep(10)  #Magic Number

    if coinSellFailed:
        logger.info("Sell of coin " + rebalanceTicker + " failed after " +
                    str(coinSellRetryCount) + " attempts")

    else:
        while coinBuyIncomplete:

            if coinBuyRetryCount >= retryLimit:
                coinBuyIncomplete = False
                logger.info("Buying of coin " + rebalanceTicker +
                            " failed after " + str(coinBuyRetryCount) +
                            " attempts")
                break
                # Cancel Order
            else:

                if CondexConfig.DEBUG == True:
                    logger.debug("Putting in buy order")
                else:
                    logger.info("Buying " + str(elgibleBuyAmount) + " of " +
                                elgibleTicker + " at " +
                                str(elgibleCoinTicker.BTCVal))
                    if partial_filled == True:
                        buyOrderUUID = em.create_buy_order(
                            elgibleTicker,
                            partial_fill_amount / elgibleCoinTicker.BTCVal,
                            elgibleCoinTicker.BTCVal)['id']
                    else:
                        buyOrderUUID = em.create_buy_order(
                            elgibleTicker, elgibleBuyAmount,
                            elgibleCoinTicker.BTCVal)['id']
                    time.sleep(60 * indexInfo.OrderTimeout)

                # Check order succeded through
                if CondexConfig.DEBUG == True:
                    logger.debug("Fetching order")
                    coinBuyIncomplete = False
                else:

                    order_result = em.fetch_order(buyOrderUUID)
                    order_filled_amount = order_result['filled']

                    if order_result['status'] == "closed":
                        logger.info("Bought coin " + elgibleTicker + " for " +
                                    str(order_result['price']))
                        coinBuyIncomplete = False

                        if rebalanceTicker == "BTC" or rebalanceTicker == "btc":
                            DatabaseManager.update_realized_gain_model(
                                rebalanceTicker,
                                rebalanceTickerGainModel.RealizedGain +
                                ((order_filled_amount *
                                  elgibleCoinTicker.BTCVal) /
                                 indexInfo.TotalBTCVal) * 100)

                    elif (
                            order_filled_amount * elgibleCoinTicker.BTCVal
                    ) > CondexConfig.BITTREX_MIN_BTC_TRADE_AMOUNT and order_result[
                            'status'] == "open":
                        em.cancel_order(buyOrderUUID)
                        logger.debug("Bought partial of coin " +
                                     elgibleCoinTicker + " for " +
                                     str(order_result['price']))
                        coinBuyIncomplete = False

                        if rebalanceTicker == "BTC" or rebalanceTicker == "btc":
                            DatabaseManager.update_realized_gain_model(
                                rebalanceTicker,
                                rebalanceTickerGainModel.RealizedGain +
                                ((order_filled_amount *
                                  elgibleCoinTicker.BTCVal) /
                                 indexInfo.TotalBTCVal) * 100)

                    else:
                        coinBuyRetryCount = coinBuyRetryCount + 1
                        if CondexConfig.DEBUG == True:
                            logger.debug("Canceling buy order")
                        else:
                            try:
                                em.cancel_order(buyOrderUUID)
                            except:
                                coinBuyIncomplete = False
                                pass  # order failed to cancel got filled previously
                            logger.debug("Buy Order Timeout Reached")
                        time.sleep(10)  #Magic Number

    # Delete the locks
    if CondexConfig.DEBUG != True:
        DatabaseManager.delete_coin_lock_model(rebalanceTicker)
        DatabaseManager.delete_coin_lock_model(elgibleTicker)