def check_locks(self, coin_above_threshold, coin_below_threshold):
        """Check the coins to make sure neither are currently locked."""
        logger.debug("Checking locks for %s and %s", coin_above_threshold,
                     coin_below_threshold)
        if DatabaseManager.get_coin_lock_model(
                coin_above_threshold) is not None:
            logger.debug("Current Avalible Coin Is Locked - %s",
                         coin_above_threshold)
            return False

        if DatabaseManager.get_coin_lock_model(
                coin_below_threshold) is not None:
            logger.debug("Current Eligible Coin Is Locked - %s",
                         coin_below_threshold)
            return False

        return True
Exemple #2
0
    def handle_coin(self, coin, is_over, celery_app):
        """Handle re-balancing an individual coin."""
        if DatabaseManager.get_coin_lock_model(
                coin) is None and DatabaseManager.get_wallet_trade_lock_model(
                    coin) is None:
            if not coin == "BTC":
                if not self.em.market_active(coin, "BTC"):
                    logger.error("Market for %s/BTC offline", coin)
                    return

            amount = self.calculate_amount(coin, is_over)

            if amount is None:
                return

            if not coin == "BTC":
                self.handle_trade(coin, amount, is_over, celery_app)

        else:
            logger.warning("Coin %s is locked and cannot be traded", coin)
Exemple #3
0
def perform_algo_task():
    coinsAboveThreshold = {}
    coinsElgibleForIncrease = {}

    indexInfo = DatabaseManager.get_index_info_model()

    if indexInfo.Active == True:
        percentage_btc_amount = indexInfo.TotalBTCVal * (
            indexInfo.BalanceThreshold / 100)
        logger.debug("Percentage_to_btc_amount: " + str(percentage_btc_amount))

        if percentage_btc_amount <= CondexConfig.BITTREX_MIN_BTC_TRADE_AMOUNT:
            logger.debug("Current BTC Threshold Value To Low - " +
                         str(percentage_btc_amount))
        else:
            # Generate our winners/lossers list
            for indexedCoin in DatabaseManager.get_all_index_coin_models():
                if indexedCoin.UnrealizedGain >= indexInfo.BalanceThreshold:
                    coinsAboveThreshold[
                        indexedCoin.Ticker] = indexedCoin.UnrealizedGain
                elif indexedCoin.UnrealizedGain <= indexInfo.BalanceThreshold:
                    coinsElgibleForIncrease[
                        indexedCoin.Ticker] = indexedCoin.UnrealizedGain

            # Sort our tables
            coinsAboveThreshold = Util.tuple_list_to_dict(
                sorted(coinsAboveThreshold.iteritems(),
                       key=lambda (k, v): (v, k),
                       reverse=True))
            coinsElgibleForIncrease = Util.tuple_list_to_dict(
                sorted(coinsElgibleForIncrease.iteritems(),
                       key=lambda (k, v): (v, k),
                       reverse=True))

            if len(coinsAboveThreshold) >= 1:
                logger.debug("Currently " + str(len(coinsAboveThreshold)) +
                             " avalible for rebalance")
                logger.debug(coinsAboveThreshold)

                if len(coinsElgibleForIncrease) >= 1:
                    logger.debug("Currently " +
                                 str(len(coinsElgibleForIncrease)) +
                                 " elgible for increase")
                    logger.debug(coinsElgibleForIncrease)
                    for akey in coinsAboveThreshold:

                        # Check to see if we still have coins to increase
                        if len(coinsElgibleForIncrease) >= 1:

                            elgibleCoinTicker = coinsElgibleForIncrease.keys(
                            )[0]

                            rebalanceCoinLocked = False
                            elgibleCoinLocked = False

                            if DatabaseManager.get_coin_lock_model(akey):
                                rebalanceCoinLocked = True

                            if DatabaseManager.get_coin_lock_model(
                                    elgibleCoinTicker):
                                rebalanceCoinLocked = True

                            if rebalanceCoinLocked == False and elgibleCoinLocked == False:

                                indexCoinInfo = DatabaseManager.get_index_coin_model(
                                    akey)
                                coinBalance = DatabaseManager.get_coin_balance_model(
                                    akey)

                                rebalanceSpecialTicker = akey + "/BTC"

                                if akey == "BTC":
                                    rebalanceSpecialTicker = "BTC/USDT"

                                rebalanceCoinTickerModel = DatabaseManager.get_ticker_model(
                                    rebalanceSpecialTicker)
                                elgibleCoinTickerModel = DatabaseManager.get_ticker_model(
                                    elgibleCoinTicker + "/BTC")

                                amountOfRebalanceToSell = 0.0

                                if akey == "BTC":
                                    amountOfRebalanceToSell = percentage_btc_amount
                                else:
                                    amountOfRebalanceToSell = percentage_btc_amount / rebalanceCoinTickerModel.BTCVal

                                amountOfEligbleToBuy = percentage_btc_amount / elgibleCoinTickerModel.BTCVal

                                if coinBalance.TotalCoins >= amountOfRebalanceToSell:
                                    DatabaseManager.create_coin_lock_model(
                                        akey)
                                    DatabaseManager.create_coin_lock_model(
                                        elgibleCoinTicker)

                                    logger.info("Performing Rebalance " +
                                                akey.upper() + " " +
                                                str(amountOfRebalanceToSell) +
                                                " - " +
                                                elgibleCoinTicker.upper() +
                                                " " +
                                                str(amountOfEligbleToBuy))
                                    #perform_rebalance_task.s(akey.upper(), amountOfRebalanceToSell, elgibleCoinTicker.upper(), amountOfEligbleToBuy)
                                    app.send_task(
                                        'Tasks.perform_rebalance_task',
                                        args=[
                                            akey.upper(),
                                            amountOfRebalanceToSell,
                                            elgibleCoinTicker.upper(),
                                            amountOfEligbleToBuy
                                        ])
                                    # Need to remove the eligbile coin from dictireonary
                                    del coinsElgibleForIncrease[
                                        elgibleCoinTicker]
                                else:
                                    logger.error(
                                        "Failed to sell coins - we do not have enough of "
                                        + str(akey))

                            else:
                                logger.debug("One of the coins where locked")

                else:
                    logger.debug("No coins eligible for increase")
            else:
                logger.debug("No coins above threshold")
Exemple #4
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")

    logger.debug("Checking Wallet Locks")

    walletLockDeleteList = []

    # Clear up the wallet locks.
    for walletLockModel in DatabaseManager.get_all_wallet_trade_lock_models():
        if DatabaseManager.get_coin_lock_model(walletLockModel.Ticker) == None:
            walletLockDeleteList.append(walletLockModel.Ticker)

    for walletLockTicker in walletLockDeleteList:
        DatabaseManager.delete_wallet_trade_lock_model(walletLockTicker)

    for key in DatabaseManager.get_all_supported_coin_models():

        btcbalance = 0.0
        usdBalance = 0.0
        totalCoins = None
        tickerModel = get_ticker(key)

        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)

    totalUnrealizedGain = 0.0
    totalRealizedGain = 0.0

    for key in DatabaseManager.get_all_supported_coin_models():

        tickerModel = get_ticker(key)
        coinBalance = DatabaseManager.get_coin_balance_model(key.Ticker)
        indexedCoin = DatabaseManager.get_index_coin_model(key.Ticker)

        if indexedCoin is not None:

            if DatabaseManager.update_index_coin_model(
                    indexedCoin.Ticker, indexedCoin.DesiredPercentage,
                    indexedCoin.get_distance_from_target(
                        coinBalance, totalBtcValue), indexedCoin.Locked):

                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()

    if DatabaseManager.update_index_info_model(indexInfo.Active, totalBtcValue,
                                               btcUsdValue * totalBtcValue,
                                               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")