Beispiel #1
0
class KuCoin:
    lastTimestamp = None

    def __init__(self, Config):
        self.publicKey = Config.getPublicKey()
        self.secretKey = Config.getSecretKey()
        self.client = Client(self.publicKey, self.secretKey)

    def checkKeys(self):
        try:
            b = self.client.get_api_keys()
            if 'code' not in b:  # If code is there, it means an error code so wrong.
                return True
            #else:
            #    self.errorMessage(b)
            #    return False
        except (Exception):  #TO DO: extract kucoin exception message directly
            self.errorMessage("KuCoin API error.")
            return False

    def getBalance(self, limit=None, page=None):
        try:
            jsonD = self.client.get_all_balances()
        except Exception as e:
            print("Error getting balance.")
            return

        balances = []
        for x in jsonD:
            if x['balance'] != 0.0:
                balances.append(x)  #TO DO, MAKE IT SAME NAMES AS HITBTC
        for b in balances:
            for key in b.keys():
                if (key == "coinType"):
                    newKey = key.replace("coinType", "currency")
                    b[newKey] = b[key]
                    del b[key]
                if (key == "balanceStr"):
                    newKey = key.replace("balanceStr", "available")
                    b[newKey] = b[key]
                    del b[key]

        return balances

    def getSymbols(self):

        jsonD = self.client.get_trading_symbols()
        symbols = []
        for x in jsonD:
            symbols.append(x['symbol'])

        return symbols

    def getOrderHistory(self, Config):
        try:
            orders = self.client.get_dealt_orders(symbol=Config.getCurrency())
            return orders
        except Exception as e:
            print("ERROR GETTING ORDER HISTORY:")
            print(e)
            return None

    def getActiveOrders(self, Config):
        try:
            orders = self.client.get_active_orders(symbol=Config.getCurrency())
            return orders
        except Exception as e:
            print("ERROR GETTING ACTIVE ORDERS")
            print(e)
            return None

    def getOrderBook(self, Config, request):
        try:
            orders = self.client.get_order_book(Config.getCurrency())

            if (request == 'SELL'):
                return orders['SELL']

            if (request == 'BUY'):
                return orders['BUY']

        except Exception as e:
            print(e)
            return None

    def cancelBuyOrders(self, Config):
        try:
            cancelAttempt = self.client.cancel_all_orders(
                Config.getCurrency(), 'BUY')
            if cancelAttempt is None:
                return True
        except Exception as e:
            print(e)
        return False

    def cancelSellOrders(self, Config):
        try:
            cancelAttempt = self.client.cancel_all_orders(
                Config.getCurrency(), 'SELL')
            if cancelAttempt is None:
                return True
        except Exception as e:
            print(e)
        return False

    def cancelOrders(self, Config):
        try:
            cancelAttempt = self.client.cancel_all_orders(
                Config.getCurrency(), 'BUY')
            cancelAttempt = self.client.cancel_all_orders(
                Config.getCurrency(), 'SELL')
            if cancelAttempt is None:
                return True
        except Exception as e:
            print(e)
        return False

    def createOrder(self, symbol, side, price, amount):
        try:
            #sellPrice = str(round(float(price), 6))
            transaction = self.client.create_order(symbol, side.upper(), price,
                                                   amount)
            return transaction  # returns orderOid
        except Exception as e:
            print("Took too long.. mismatch I think??")
            print(e)

    def errorMessage(self, b):
        print(
            '\n =================== CyrCraft - Errrr Errorrrrrr ======================= \n'
        )
        print(b)
        print(
            'Keys are wrong..\nType 1 to set your keys.. or else any key to go Configuration Menu..'
        )
        print(
            '\n ======================================================================= \n'
        )
Beispiel #2
0
class KucoinApi(PyexAPI):
    """kucoin API interface.
    """

    logger = logging.getLogger()

    def __init__(self,
                 api_server: str,
                 api_key: str,
                 secret_key: str,
                 timeout: float,
                 requests_params=None):
        assert (isinstance(api_server, str))
        assert (isinstance(api_key, str))
        assert (isinstance(secret_key, str))
        assert (isinstance(timeout, float))

        self.api_server = api_server
        self.api_key = api_key
        self.secret_key = secret_key
        self.timeout = timeout
        self.client = Client(api_key, secret_key)

    def get_markets(self):
        return self.client.get_trading_markets()

    def ticker(self, pair: str):
        assert (isinstance(pair, str))
        return self.client.get_tick(pair)

    def get_balances(self):
        return self.client.get_all_balances()

    def get_fiat_balance(self, fiat: str):
        assert (isinstance(fiat, str))
        return self.client.get_total_balance(fiat)

    def get_balance(self, coin: str):
        assert (isinstance(coin, str))
        return self.client.get_coin_balance(coin)

    def get_coin_info(self, coin: str):
        assert (isinstance(coin, str))
        return self.client.get_coin_info(coin)

    def get_user_info(self):
        return self.client.get_user()

    def order_book(self, pair: str, limit=None):
        assert (isinstance(pair, str))
        return self.client.get_order_book(pair, limit)

    def get_orders(self, pair: str) -> List[Order]:
        assert (isinstance(pair, str))

        orders = self.client.get_active_orders(pair)

        sell_orders = list(
            map(lambda item: Order.from_list(item, pair, True),
                orders[self.client.SIDE_SELL]))
        buy_orders = list(
            map(lambda item: Order.from_list(item, pair, False),
                orders[self.client.SIDE_BUY]))

        return sell_orders + buy_orders

    def place_order(self, pair: str, is_sell: bool, price: Wad,
                    amount: Wad) -> str:
        assert (isinstance(pair, str))
        assert (isinstance(is_sell, bool))
        assert (isinstance(price, Wad))
        assert (isinstance(amount, Wad))

        side = self.client.SIDE_SELL if is_sell else self.client.SIDE_BUY

        self.logger.info(f"Placing order ({side}, amount {amount} of {pair},"
                         f" price {price})...")

        result = self.client.create_order(pair, side, price, amount)
        order_id = result['orderOid']

        self.logger.info(f"Placed order as #{order_id}")
        return order_id

    def cancel_order(self, order_id: str, is_sell: bool, pair: str):
        assert (isinstance(order_id, str))
        assert (isinstance(is_sell, bool))
        assert (isinstance(pair, str))

        side = self.client.SIDE_SELL if is_sell else self.client.SIDE_BUY

        self.logger.info(f"Cancelling order #{order_id} of type {side}...")

        try:
            self.client.cancel_order(order_id, side, pair)
            self.logger.info(f"Canceled order #{order_id}...")
            return True
        except Exception as e:
            self.logger.error(f"Failed to cancel order #{order_id}... {e}")
            return False

    def get_trades(self, pair: str, page_number: int = 1) -> List[Trade]:
        assert (isinstance(pair, str))
        assert (isinstance(page_number, int))

        page_number = page_number - 1
        limit = 100

        result = self.client.get_symbol_dealt_orders(pair, page_number, limit)

        return list(
            map(lambda item: Trade.from_dict(pair, item), result['datas']))

    def get_all_trades(self, pair: str, page_number: int = 1) -> List[Trade]:
        assert (isinstance(pair, str))
        assert (page_number == 1)

        result = self.client.get_recent_orders(pair, 50)

        return list(map(lambda item: Trade.from_list(pair, item), result))
minSpread = 0.3 # %age
disp = 0.000001 # amount to undercut or outbid
orderSize = 0.00001 # quoted in first currency in pair

# loop to keep bot running
while True:
    # get orderbook to check bid-ask
    orderBook = client.get_order_book(pair, limit=1)
    bid = orderBook["BUY"][0][0]
    ask = orderBook["SELL"][0][0]
    spread = calcSpread(bid, ask)
    print("SPREAD: " + str(spread) + "%")
    
    if spread > minSpread:
        # get our active orders to check quantity and price points
        orders = client.get_active_orders(pair)
        noBuys = len(orders["BUY"]) == 0
        noSells = len(orders["SELL"]) == 0
        
        if noBuys and noSells:
            # place orders
            print("Placing new set of orders...")
            client.create_buy_order(pair, bid + disp, orderSize)
            client.create_sell_order(pair, ask - disp, orderSize)
            print("Orders placed")
        
        #else:
            # if there is a buy order and it is less than the bid, replace it
            #if len(orders["BUY"]) > 0 and orders["BUY"][0][2] < bid:
            #    orderID = orders["BUY"][0][5]
            #    print("Cancelling buy order...")
Beispiel #4
0
                                                           1000)


def determine_order_data(data):
    try:
        logging.info("Found order: " + str(data[0]))
        order = True
    except:
        order = False
    return order


cycle = 0
while True:
    try:
        openOrders = (client.get_active_orders(tokenPair))
        sellOrderData = openOrders['SELL']
        buyOrderData = openOrders['BUY']
        if (openOrders['BUY']) and (openOrders['SELL']):
            logging.info(openOrders)
        elif ((determine_order_data(sellOrderData) == False) and (determine_order_data(buyOrderData) == True))\
                or ((determine_order_data(sellOrderData) == True) and (determine_order_data(buyOrderData) == False)):
            for type in openOrders:
                try:
                    oid = get_oid(openOrders[type])
                    logging.info("Cancel order " + oid)
                    logging.info(client.cancel_order(tokenPair, oid, type))
                except:
                    logging.info("Order type " + type + " completed")
                    if token:
                        post_slack(type)