示例#1
0
def perform_algo_task():
    balanceManager = BalanceManager()

    coinsAboveThreshold = {}
    coinsEligibleForIncrease = {}
    em = ExchangeManager()

    indexInfo = DatabaseManager.get_index_info_model()

    try:
        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/losers list
                for indexedCoin in DatabaseManager.get_all_index_coin_models():
                    if indexedCoin.DistanceFromTarget >= indexInfo.BalanceThreshold:
                        coinsAboveThreshold[indexedCoin.Ticker] = indexedCoin.DistanceFromTarget
                    elif abs(indexedCoin.DistanceFromTarget) >= indexInfo.BalanceThreshold:
                        coinsEligibleForIncrease[indexedCoin.Ticker] = indexedCoin.DistanceFromTarget

                # Sort our tables
                coinsAboveThreshold = Util.tuple_list_to_dict(sorted(coinsAboveThreshold.items(), key=lambda pair: pair[1], reverse=True))
                coinsEligibleForIncrease = Util.tuple_list_to_dict(sorted(coinsEligibleForIncrease.items(), key=lambda pair: pair[1], reverse=True))
                balanceManager.rebalance_coins(coinsAboveThreshold, coinsEligibleForIncrease, percentage_btc_amount, app)
                
    except Exception as e:
        logger.exception(e)
示例#2
0
 def index_stop_command(self):
     indexInfo = DatabaseManager.get_index_info_model()
     DatabaseManager.update_index_info_model(False, indexInfo.TotalBTCVal,
                                             indexInfo.TotalUSDVal,
                                             indexInfo.BalanceThreshold,
                                             indexInfo.OrderTimeout,
                                             indexInfo.OrderRetryAmount,
                                             indexInfo.RebalanceTickSetting)
     logger.info("Index Management Stopped.")
示例#3
0
def increment_rebalance_tick_task():

    indexInfo = DatabaseManager.get_index_info_model()

    if indexInfo.Active == True:
        rebalanceTick = DatabaseManager.get_rebalance_tick_model()

        if rebalanceTick.TickCount >= indexInfo.RebalanceTickSetting:
            app.send_task('Tasks.perform_algo_task',args=[])
        else:
            DatabaseManager.update_rebalance_tick_model(rebalanceTick.TickCount + 1)
示例#4
0
    def index_add_coin(self, coin, percentage=1.0, locked=False):

        lockCoin = False

        totalLockedPercentage = 0.0
        totalUnlockedPercentage = 0.0
        totalUnlockedCoinsCount = 0

        indexInfo = DatabaseManager.get_index_info_model()
        indexedCoins = DatabaseManager.get_all_index_coin_models()

        if locked == "true" or locked == "True":
            lockCoin = True

        for inCoins in indexedCoins:

            if inCoins.Locked == True:
                totalLockedPercentage = totalLockedPercentage + inCoins.DesiredPercentage
            else:
                totalUnlockedPercentage = totalUnlockedPercentage + inCoins.DesiredPercentage
                totalUnlockedCoinsCount = totalUnlockedCoinsCount + 1

        if totalUnlockedPercentage > float(percentage):

            if self.coin_supported_check(coin.upper()):

                percentageToRemove = float(
                    percentage) / totalUnlockedCoinsCount

                for iCoin in indexedCoins:
                    if iCoin.Locked != True:
                        DatabaseManager.update_index_coin_model(
                            iCoin.Ticker,
                            iCoin.DesiredPercentage - percentageToRemove,
                            iCoin.DistanceFromTarget, iCoin.Locked)

                if isinstance(float(percentage), (float, int, complex, int)):
                    if DatabaseManager.create_index_coin_model(
                            coin.upper(), float(percentage), 0.0, lockCoin):

                        logger.info("Coin " + coin.upper() + " added to index")
                    else:
                        # Already Exist
                        logger.warn("Coin already in index")
                else:
                    logger.warn("Percentage isn't a number")

            else:
                logger.warn("Coin not supported")
        else:
            logger.warn("Not Enough Unlocked Percentage")
示例#5
0
    def index_rebalance_tick_update(self, tickcount):

        indexInfo = DatabaseManager.get_index_info_model()

        if isinstance(int(tickcount), (float, int, complex, int)):
            DatabaseManager.update_index_info_model(True,
                                                    indexInfo.TotalBTCVal,
                                                    indexInfo.TotalUSDVal,
                                                    indexInfo.BalanceThreshold,
                                                    indexInfo.OrderTimeout,
                                                    indexInfo.OrderRetryAmount,
                                                    int(tickcount))
            logger.info("Index rebalance time set to " + str(tickcount) +
                        " minutes.")
        else:
            logger.warn("Tick count isn't a number")
    def show_threshold(self):
        indexInfo = DatabaseManager.get_index_info_model()
        sys.stdout.write("\nCurrent Rebalance Threshold\n")

        summary_table_data = [[
            "Active", "Balance Threshold", "Order Timeout",
            "Rebalance Tick Setting"
        ]]
        summary_table_data.append([
            indexInfo.Active, indexInfo.BalanceThreshold,
            indexInfo.OrderTimeout, indexInfo.RebalanceTickSetting
        ])

        summary_table = AsciiTable(summary_table_data)
        sys.stdout.write(summary_table.table)
        sys.stdout.write("\n")
    def index_start_command(self):

        totalIndexPercentage = 0.0
        indexInfo = DatabaseManager.get_index_info_model()
        indexCoins = DatabaseManager.get_all_index_coin_models()

        for coin in indexCoins:
            totalIndexPercentage = totalIndexPercentage + coin.DesiredPercentage

        if totalIndexPercentage == 100:

            for iCoin in indexCoins:

                if iCoin.Ticker != "BTC":

                    coinTicker = DatabaseManager.get_ticker_model(
                        iCoin.Ticker.upper() + "/BTC")

                    sys.stdout.write(coinTicker)
                    sys.stdout.write(iCoin.Ticker)
                    sys.stdout.write('\n')
                    percentage_btc_amount = (indexInfo.TotalBTCVal /
                                             100) * iCoin.DesiredPercentage

                    amountToBuy = percentage_btc_amount / coinTicker.BTCVal

                    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:
                        #buy
                        app.send_task('Tasks.perform_buy_task',
                                      args=[iCoin.Ticker.upper(), amountToBuy])

            DatabaseManager.update_index_info_model(
                True, indexInfo.TotalBTCVal, indexInfo.TotalUSDVal,
                indexInfo.TotalRealizedGain, indexInfo.TotalUnrealizedGain,
                indexInfo.BalanceThreshold, indexInfo.OrderTimeout,
                indexInfo.OrderRetryAmount, indexInfo.RebalanceTickSetting)

        else:
            logger.warn("Index is currently unbalanced please rebuild")
示例#8
0
    def index_threshold_update(self, percentage):

        if isinstance(float(percentage), (float, int, complex, int)):

            indexInfo = DatabaseManager.get_index_info_model()

            percentage_btc_amount = indexInfo.TotalBTCVal * (
                float(percentage) / 100)

            if percentage_btc_amount <= CondexConfig.BITTREX_MIN_BTC_TRADE_AMOUNT:
                logger.error("Desired BTC Threshold Value Too Low - " +
                             str(percentage))
            else:
                DatabaseManager.update_index_info_model(
                    True, indexInfo.TotalBTCVal, indexInfo.TotalUSDVal,
                    round(float(percentage), 2), indexInfo.OrderTimeout,
                    indexInfo.OrderRetryAmount, indexInfo.RebalanceTickSetting)
                logger.info("Index threshold set to " +
                            str(round(float(percentage), 2)))
        else:
            logger.warn("Percentage isn't a number")
示例#9
0
    def index_gen_command(self):

        totalIndexPercentage = 0.0
        indexInfo = DatabaseManager.get_index_info_model()
        indexCoins = DatabaseManager.get_all_index_coin_models()

        for iCoin in indexCoins:

            if iCoin.Ticker != "BTC":

                coinTicker = DatabaseManager.get_ticker_model(
                    iCoin.Ticker.upper() + "/BTC")

                percentage_btc_amount = (indexInfo.TotalBTCVal /
                                         100) * iCoin.DesiredPercentage

                amountToBuy = percentage_btc_amount / coinTicker.BTCVal

                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:
                    #buy
                    app.send_task('Tasks.perform_buy_task',
                                  args=[iCoin.Ticker.upper(), amountToBuy])

        DatabaseManager.update_index_info_model(True, indexInfo.TotalBTCVal,
                                                indexInfo.TotalUSDVal,
                                                indexInfo.BalanceThreshold,
                                                indexInfo.OrderTimeout,
                                                indexInfo.OrderRetryAmount,
                                                indexInfo.RebalanceTickSetting)
示例#10
0
    def index_add_coin(self, coin, percentage, locked):

        lockCoin = False

        totalLockedPercentage = 0.0
        totalUnlockedPercentage = 0.0
        totalUnlockedCoinsCount = 0

        indexInfo = DatabaseManager.get_index_info_model()
        indexedCoins = DatabaseManager.get_all_index_coin_models()

        if locked == "true" or locked == "True":
            lockCoin = True

        percentage_btc_amount = indexInfo.TotalBTCVal * (float(percentage) /
                                                         100)

        if percentage_btc_amount >= CondexConfig.BITTREX_MIN_BTC_TRADE_AMOUNT:

            for inCoins in indexedCoins:

                if inCoins.Locked == True:
                    totalLockedPercentage = totalLockedPercentage + inCoins.DesiredPercentage
                else:
                    totalUnlockedPercentage = totalUnlockedPercentage + inCoins.DesiredPercentage
                    totalUnlockedCoinsCount = totalUnlockedCoinsCount + 1

            if totalUnlockedPercentage > float(percentage):

                if self.coin_supported_check(coin.upper()):

                    percentageToRemove = float(
                        percentage) / totalUnlockedCoinsCount

                    for iCoin in indexedCoins:
                        if iCoin.Locked != True:
                            DatabaseManager.update_index_coin_model(
                                iCoin.Ticker,
                                iCoin.DesiredPercentage - percentageToRemove,
                                iCoin.CurrentPercentage, iCoin.UnrealizedGain,
                                iCoin.Locked)

                    if isinstance(float(percentage),
                                  (float, int, complex, long)):
                        if DatabaseManager.create_index_coin_model(
                                coin.upper(), float(percentage), 0.0, 0.0,
                                lockCoin):

                            DatabaseManager.create_realized_gain_model(
                                coin.upper(), 0.0)

                            logger.info("Coin " + coin.upper() +
                                        " added to index")
                        else:
                            # Already Exist
                            logger.warn("Coin already in index")
                    else:
                        logger.warn("Percentage isn't a number")

                else:
                    logger.warn("Coin not supported")
            else:
                logger.warn("Not Enough Unlocked Percentage")

        else:
            logger.warn(
                "Specified percentage below current bittrex trade value")
示例#11
0
    def calculate_amount(self, coin, is_over):
        """Figure out how much to buy/sell.
        Method should look up current value of each coin as trades fired previously could modify the balance.

        Includes minimum trade check.

        Returns None if amount doesn't meet trade threshold.
        """

        index_info = DatabaseManager.get_index_info_model()
        coin_balance = DatabaseManager.get_coin_balance_model(coin)
        indexed_coin = DatabaseManager.get_index_coin_model(coin)
        amount = None
        off = indexed_coin.get_percent_from_coin_target(
            coin_balance, index_info.TotalBTCVal)
        logger.info(
            "coin off percentage is %s with current coin balance of %s", off,
            coin_balance.BTCBalance)

        if coin_balance.BTCBalance > 0:
            if is_over is True:
                logger.info(
                    "Coin %s over threshold, calculating off percentage", coin)
                if off > 100:
                    amount = round(coin_balance.BTCBalance * (1 / (off / 100)),
                                   8)
                else:
                    amount = round(coin_balance.BTCBalance * off / 100, 8)
            else:
                logger.info(
                    "Coin %s under threshold, calculating off percentage",
                    coin)
                amount = round(
                    (coin_balance.BTCBalance /
                     (1 - (abs(off) / 100))) - coin_balance.BTCBalance, 8)

            logger.info("Amount calculated as %s", amount)

        if amount == None or amount == 0:
            logger.info(
                "Zero amount detected for %s. Attemping to buy 2x the minimum order.",
                coin)
            pair_string = coin
            if pair_string == "BTC":
                pair_string += "/USDT"
            else:
                pair_string += "/BTC"

            min_buy = self.em.get_min_buy_btc(pair_string)

            if min_buy is not None:
                amount = round(min_buy * 2, 8)
            else:
                logger.info(
                    "Zero amount of coin %s and market info cannot be found")
                amount = None

        if amount is not None:
            logger.info(
                "checking to see if amount %s is greater than trade threshold %s",
                amount, CondexConfig.BITTREX_MIN_BTC_TRADE_AMOUNT)

            over_threshold = float(amount) >= float(
                CondexConfig.BITTREX_MIN_BTC_TRADE_AMOUNT)

            if over_threshold is True:
                if is_over is False:
                    logger.info("checking to see if %s is available in BTC",
                                amount)
                    balance_available = 0.0
                    btc_balance = DatabaseManager.get_coin_balance_model("BTC")
                    btc_indexed_coin = DatabaseManager.get_index_coin_model(
                        "BTC")

                    btc_off = btc_indexed_coin.get_percent_from_coin_target(
                        btc_balance, index_info.TotalBTCVal)
                    if btc_off <= 0:
                        return None

                    balance_available = round(
                        btc_balance.BTCBalance * (btc_off / 100), 8)
                    logger.info("Available BTC balance %s", balance_available)
                    if balance_available >= amount:
                        return amount

                    #See if 1x the threshold is available
                    single_threshold_amount = round(
                        amount / (index_info.BalanceThreshold / 100), 8)

                    if not single_threshold_amount >= em.get_min_buy_btc(
                            pair_string):
                        single_threshold_amount = em.get_min_buy_btc(
                            pair_string) * 2

                    if balance_available >= single_threshold_amount and float(
                            single_threshold_amount) >= float(
                                CondexConfig.BITTREX_MIN_BTC_TRADE_AMOUNT):
                        return single_threshold_amount
                    else:
                        amount = None
                    logger.warning(
                        "The amount to trade %s not available currently",
                        amount)
                else:
                    logger.info("selling %s %s to BTC/USDT", amount, coin)
            else:
                logger.warning("Coin %s amount %s not over trade threshold",
                               coin, amount)
                amount = None

        return amount
示例#12
0
    def index_update_coin(self, coin, percentage, locked):

        lockCoin = False

        totalLockedPercentage = 0.0
        totalUnlockedPercentage = 0.0
        totalUnlockedCoinsCount = 0

        indexInfo = DatabaseManager.get_index_info_model()
        indexedCoins = DatabaseManager.get_all_index_coin_models()
        indexedCoin = DatabaseManager.get_index_coin_model(coin.upper())

        for inCoins in indexedCoins:
            if inCoins.Ticker != coin.upper():
                if inCoins.Locked == True:
                    totalLockedPercentage = totalLockedPercentage + inCoins.DesiredPercentage
                else:
                    totalUnlockedPercentage = totalUnlockedPercentage + inCoins.DesiredPercentage
                    totalUnlockedCoinsCount = totalUnlockedCoinsCount + 1

        if len(indexedCoins) > 1:
            if totalUnlockedCoinsCount > 0:
                if locked == "true" or locked == "True":
                    lockCoin = True

                percentage_btc_amount = indexInfo.TotalBTCVal * (
                    float(percentage) / 100)

                if percentage_btc_amount >= CondexConfig.BITTREX_MIN_BTC_TRADE_AMOUNT:

                    if float(percentage) > indexedCoin.DesiredPercentage:
                        if totalUnlockedPercentage > float(percentage):

                            if self.coin_supported_check(coin.upper()):

                                percentageToAdd = 0.0

                                if totalUnlockedCoinsCount > 0:
                                    percentageToAdd = float(
                                        indexedCoin.DesiredPercentage -
                                        float(percentage)
                                    ) / totalUnlockedCoinsCount
                                else:
                                    percentageToAdd = float(
                                        indexedCoin.DesiredPercentage -
                                        float(percentage))

                                for iCoin in indexedCoins:
                                    if iCoin.Ticker != coin.upper():
                                        if iCoin.Locked != True:
                                            DatabaseManager.update_index_coin_model(
                                                iCoin.Ticker,
                                                iCoin.DesiredPercentage -
                                                percentageToAdd,
                                                iCoin.DistanceFromTarget,
                                                iCoin.Locked)

                                if isinstance(float(percentage),
                                              (float, int, complex, long)):
                                    if DatabaseManager.update_index_coin_model(
                                            coin.upper(), float(percentage),
                                            0.0, lockCoin):

                                        logger.info("Coin " + coin.upper() +
                                                    " updated in index")
                                    else:
                                        # Already Exist
                                        logger.warn("Coin already in index")
                                else:
                                    logger.warn("Percentage isn't a number")

                            else:
                                logger.warn("Coin not supported")
                        else:
                            logger.warn("Not Enough Unlocked Percentage")
                    else:
                        ## NEW BLOCK
                        if self.coin_supported_check(coin.upper()):

                            percentageToAdd = 0.0

                            if totalUnlockedCoinsCount > 0:
                                percentageToAdd = float(
                                    indexedCoin.DesiredPercentage - float(
                                        percentage)) / totalUnlockedCoinsCount
                            else:
                                percentageToAdd = float(
                                    indexedCoin.DesiredPercentage -
                                    float(percentage))

                            for iCoin in indexedCoins:
                                if iCoin.Ticker != coin.upper():
                                    if iCoin.Locked != True:
                                        DatabaseManager.update_index_coin_model(
                                            iCoin.Ticker,
                                            iCoin.DesiredPercentage +
                                            percentageToAdd,
                                            iCoin.DistanceFromTarget,
                                            iCoin.Locked)

                            if isinstance(float(percentage),
                                          (float, int, complex, int)):

                                if DatabaseManager.update_index_coin_model(
                                        coin.upper(), float(percentage), 0.0,
                                        lockCoin):

                                    logger.info("Coin " + coin.upper() +
                                                " updated in index")
                                else:
                                    # Already Exist
                                    logger.warn("Coin already in index")
                            else:
                                logger.warn("Percentage isn't a number")

                        else:
                            logger.warn("Coin not supported")

                else:
                    logger.warn(
                        "Specified percentage below current bittrex trade value"
                    )
            else:
                logger.warn(
                    "Currently no unlocked coins to transfer free value")
        else:
            logger.warn(
                "Please add another coin to your index before updating a given coin"
            )
示例#13
0
文件: Tasks.py 项目: alimogh/condex
def perform_sell_task(rebalanceTicker, rebalanceSellAmount):

    coinSellIncomplete = True
    coinSellRetryCount = 0
    sellOrderUUID = ""

    indexInfo = DatabaseManager.get_index_info_model()

    retryLimit = indexInfo.OrderRetryAmount

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

    em = ExchangeManager()

    try:

        partial_fill_amount = 0
        partial_filled = False

        DatabaseManager.create_coin_lock_model(rebalanceTicker)

        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
                    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
                    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
    except Exception as e:
        logger.exception(e)

    finally:
        if CondexConfig.DEBUG != True:
            DatabaseManager.delete_coin_lock_model(rebalanceTicker)
示例#14
0
文件: Tasks.py 项目: sethll/condex
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")
示例#15
0
文件: Tasks.py 项目: sethll/condex
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)
示例#16
0
文件: Tasks.py 项目: alimogh/condex
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")
示例#17
0
文件: Tasks.py 项目: sethll/condex
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")
示例#18
0
文件: Tasks.py 项目: sethll/condex
def perform_buy_task(elgibleTicker, elgibleBuyAmount):

    coinBuyIncomplete = True
    coinBuyRetryCount = 0

    buyOrderUUID = ""

    indexInfo = DatabaseManager.get_index_info_model()

    retryLimit = indexInfo.OrderRetryAmount

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

    em = ExchangeManager()

    partial_fill_amount = 0
    partial_filled = False

    DatabaseManager.create_coin_lock_model(elgibleTicker)

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

                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

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