def api_get(self, method, params={}): # 现货API if self.account: apikey, secretkey = get_account_key("okex", self.account) okcoinSpot = OKCoinSpot(okcoinRESTURL, apikey, secretkey) if method == "userinfo": api_do = "okcoinSpot.%s()" % (method) return eval(api_do) elif method in ["buy", "sell"]: return okcoinSpot.trade(params["symbol"], method, params["price"], params["amount"]) elif method == "cancelOrder": return okcoinSpot.cancelOrder(params["symbol"], params["id"]) elif method in ["order_info", "orders_info"]: return okcoinSpot.orderinfo(params["symbol"], params["id"]) elif method == "ticker": return okcoinSpot.ticker(symbol=params["symbol"]) elif method == "funds_transfer": return okcoinSpot.funds_transfer(params["amount"],params["From"],params["To"], params["symbol"]) elif method == "withdraw": #tradepwd = get_tradepwd("okex", self.account) tradepwd="huangxinyu2" return okcoinSpot.withdraw(params["symbol"], params["address"], params["amount"], tradepwd, params["fee"], params["addr_tag"])
def api_get(self, method, params={}): # 现货API if self.account: apikey, secretkey = get_account_key("okex", self.account) okcoinSpot = OKCoinSpot(okcoinRESTURL, apikey, secretkey) if method == "userinfo": api_do = "okcoinSpot.%s()" % (method) return eval(api_do) elif method in ["buy", "sell"]: return okcoinSpot.trade(params["symbol"], method, params["price"], params["amount"]) elif method == "cancelOrder": return okcoinSpot.cancelOrder(params["symbol"], params["id"]) elif method in ["order_info", "orders_info"]: return okcoinSpot.orderinfo(params["symbol"], params["id"]) elif method == "ticker": return okcoinSpot.ticker(symbol=params["symbol"]) elif method == "funds_transfer": return okcoinSpot.funds_transfer(params["amount"], params["from"], params["to"], symbol=params["symbol"])
print okcoinSpot.depth('btc_usd') print u' 现货历史交易信息 ' print okcoinSpot.trades() print u' 用户现货账户信息 ' print okcoinSpot.userinfo() print u' 现货下单 ' print okcoinSpot.trade('ltc_usd','buy','0.1','0.2') print u' 现货批量下单 ' print okcoinSpot.batchTrade('ltc_usd','buy','[{price:0.1,amount:0.2},{price:0.1,amount:0.2}]') print u' 现货取消订单 ' print okcoinSpot.cancelOrder('ltc_usd','18243073') print u' 现货订单信息查询 ' print okcoinSpot.orderinfo('ltc_usd','18243644') print u' 现货批量订单信息查询 ' print okcoinSpot.ordersinfo('ltc_usd','18243800,18243801,18243644','0') print u' 现货历史订单信息查询 ' print okcoinSpot.orderHistory('ltc_usd','0','1','2') print u' 期货行情信息' print okcoinFuture.future_ticker('ltc_usd','this_week') print u' 期货市场深度信息' print okcoinFuture.future_depth('ltc_usd','this_week','6')
class okex(): def __init__(self): ##初始化apikey,secretkey,url apikey = config.apikey secretkey = config.secretkey okcoinRESTURL = 'www.okex.com' #请求注意:国内账号需要 修改为 www.okcoin.cn #现货API self.okcoinSpot = OKCoinSpot(okcoinRESTURL,apikey,secretkey) # 期货API self.okcoinFuture = OKCoinFuture(okcoinRESTURL, apikey, secretkey) self.depth = {} def getTicker(self, symbol): return self.okcoinSpot.ticker(symbol)['ticker'] def getDepth(self, symbol): while(1): sleep(0.5) try: depth = self.okcoinSpot.depth(symbol) except Exception: pass DEPTH[symbol] = {'sell':{'price':depth['asks'][-1][0], 'amount':depth['asks'][-1][1]}, 'buy':{'price':depth['bids'][0][0], 'amount':depth['bids'][0][1]}} print(symbol) print(DEPTH) # return {'sell':{'price':depth['asks'][-1][0], 'amount':depth['asks'][-1][1]}, # 'buy':{'price':depth['bids'][0][0], 'amount':depth['bids'][0][1]}} def getBalance(self): ''' :return: ''' self.balance = {} info = json.loads(self.okcoinSpot.userinfo()) for symbol in info['info']['funds']['free'].keys(): self.balance[symbol] = float(info['info']['funds']['free'][symbol]) def trade(self, symbol, type, price, amount): ''' :param symbol: :param type: :param price: :param amount: :return: order_id ''' if price != '': logging.info('[order]' + symbol + '|' + type+ '|' + str(price) + '|' + str(amount)) rsp = json.loads(self.okcoinSpot.trade(symbol, type, price, amount)) if 'error_code' in rsp: if str(rsp['error_code']) != '1003': logging.info('[trade error]' + str(rsp['error_code'])) return False if rsp['result']: return rsp['order_id'] def getOrderInfo(self, symbol, order_id): ''' :param symbol: :param order_id: :return: order_status: -1:已撤销 0:未成交 1:部分成交 2:完全成交 3:撤单处理中 ''' rsp = json.loads(self.okcoinSpot.orderinfo(symbol, order_id)) if 'error_code' in rsp: logging.info('[getOrderInfo error]' + str(rsp['error_code'])) return False if rsp['result']: return int(rsp['orders'][0]['status']) else: return False def toBtc(self): self.getBalance() for symbol in self.balance.keys(): if symbol != 'usdt' and symbol != 'btc' and symbol != 'mtl' and self.balance[symbol] != 0: # print(symbol) if self.balance[symbol] != 0: tradeSymbol = symbol + '_btc' self.trade(tradeSymbol, 'sell_market', '', self.balance[symbol]) def cancelOrder(self, symbol, order_id): ''' :param symbol: :param order_id: :return: True or False ''' rsp = json.loads(self.okcoinSpot.cancelOrder(symbol, order_id)) if 'error_code' in rsp: logging.info('[cancelOrder error]' + str(rsp['error_code'])) return False return rsp['result'] def good_trade(self, symbols, Threshold=1.02): ''' :param symbols: such as [btc, eth, mco] :return: ''' symbol_1 = symbols[1] + '_' + symbols[0] symbol_2 = symbols[2] + '_' + symbols[0] symbol_3 = symbols[2] + '_' + symbols[1] t1 = self.getTicker(symbol_1) t2 = self.getTicker(symbol_2) t3 = self.getTicker(symbol_3) # print ('=======================================') # temp = (float(t2['sell']) / float(t3['buy'])) a1 = (float(t2['sell']) / float(t3['buy'])) / float(t1['buy']) a2 = (float(t1['sell']) * float(t3['sell'])) / float(t2['buy']) if a1 < Threshold: traderSymbol = [symbol_2, symbol_3, symbol_1] logging.debug('=======================================') logging.debug(a1) logging.debug('[trader] ' + symbols[0] + '--->' + symbols[2] + '--->' + symbols[1] + '--->' + symbols[0]) logging.debug(t1) logging.debug(t2) logging.debug(t3) elif a2 < Threshold: traderSymbol = [symbol_1, symbol_3, symbol_2] logging.debug('=======================================') logging.debug(a2) logging.debug('[trader] ' + symbols[0] + '--->' + symbols[1] + '--->' + symbols[2] + '--->' + symbols[0]) logging.debug(t1) logging.debug(t2) logging.debug(t3) else: pass def tradePolicy(self, symbols, initAmount=0.005, Threshold=1.02): ''' :param symbols: such as [btc, eth, mco] :return: ''' retry = 3 symbol_1 = symbols[1] + '_' + symbols[0] symbol_2 = symbols[2] + '_' + symbols[0] symbol_3 = symbols[2] + '_' + symbols[1] t1 = self.getDepth(symbol_1) t2 = self.getDepth(symbol_2) t3 = self.getDepth(symbol_3) a1 = (float(t2['sell']['price']) / float(t3['buy']['price'])) / float(t1['buy']['price']) a2 = (float(t1['sell']['price']) * float(t3['sell']['price'])) / float(t2['buy']['price']) # logging.debug(t1) if a1 < Threshold: if float(t2['sell']['amount']) < amount[symbol_2] or float(t3['buy']['amount']) < amount[symbol_3] or\ float(t1['buy']['amount']) < amount[symbol_1]: return logging.info('=========================================================') logging.debug(a1) traderSymbol = [symbol_2, symbol_3, symbol_1] logging.debug('[trader] ' + symbols[0] + '--->' + symbols[2] + '--->' + symbols[1] + '--->' + symbols[0]) logging.debug(t1) logging.debug(t2) logging.debug(t3) #step1 logging.info('[step1]') self.getBalance() self.toBtc() logging.info('[Balance]') logging.info(self.balance) amount1 = round((initAmount * 0.999) / float(t2['sell']['price']), 8) for i in range(retry): logging.info('[order]' + symbol_2 + '|buy|' + str(float(t2['sell']['price'])) + '|' + str(amount1)) orderId = self.trade(symbol_2, 'buy', float(t2['sell']['price']), amount1) if orderId: break if orderId: logging.info('[orderId]' + str(orderId)) status = self.getOrderInfo(symbol_2, orderId) if status != 2: print(status) sleep(0.5) status = self.getOrderInfo(symbol_2, orderId) if status != 2: print(status) self.cancelOrder(symbol_2, orderId) logging.info('[cancelOrder!]') return else: logging.info('[order succssed!]') else: logging.info('[order succssed!]') else: logging.info('[order failed!]') return #step2 logging.info('[step2]') self.getBalance() logging.info('[Balance]') logging.info(self.balance) amount2 = self.balance[symbols[2]] for i in range(retry): logging.info('[order]' + symbol_3 + '|sell|' + str(float(t3['buy']['price'])) + '|' + str(amount2)) orderId = self.trade(symbol_3, 'sell', float(t3['buy']['price']), amount2) if orderId: break if orderId: logging.info('[orderId]' + str(orderId)) status = self.getOrderInfo(symbol_3, orderId) if status != 2: sleep(0.5) status = self.getOrderInfo(symbol_3, orderId) if status != 2: self.cancelOrder(symbol_3, orderId) logging.info('cancelOrder!') return else: logging.info('[order succssed!]') else: logging.info('[order succssed!]') else: logging.info('[order failed!]') return #step3 logging.info('[step3]') self.getBalance() logging.info('[Balance]') logging.info(self.balance) amount3 = self.balance[symbols[1]] for i in range(retry): logging.info('[order]' + symbol_1 + '|sell|' + str(float(t1['buy']['price'])) + '|' + str(amount3)) orderId = self.trade(symbol_1, 'sell', float(t1['buy']['price']), amount3) if orderId: break if orderId: logging.info('[orderId]' + str(orderId)) status = self.getOrderInfo(symbol_1, orderId) if status != 2: sleep(0.5) status = self.getOrderInfo(symbol_1, orderId) if status != 2: self.cancelOrder(symbol_1, orderId) logging.info('cancelOrder!') return else: logging.info('[order succssed!]') else: logging.info('[order succssed!]') else: logging.info('[order failed!]') return elif a2 < Threshold: if float(t2['buy']['amount']) < amount[symbol_2] or float(t3['sell']['amount']) < amount[symbol_3] or\ float(t1['sell']['amount']) < amount[symbol_1]: return logging.info('=========================================================') logging.debug(a2) traderSymbol = [symbol_1, symbol_3, symbol_2] logging.debug('[trader] ' + symbols[0] + '--->' + symbols[1] + '--->' + symbols[2] + '--->' + symbols[0]) logging.debug(t1) logging.debug(t2) logging.debug(t3) # step1 logging.info('[step1]') self.getBalance() self.toBtc() logging.info('[Balance]') logging.info(self.balance) amount1 = round((initAmount * 0.999) / float(t1['sell']['price']), 8) for i in range(retry): logging.info('[order]' + symbol_1 + '|buy|' + str(float(t1['sell']['price'])) + '|' + str(amount1)) orderId = self.trade(symbol_1, 'buy', float(t1['sell']['price']), amount1) if orderId: break if orderId: logging.info('[orderId]' + str(orderId)) status = self.getOrderInfo(symbol_1, orderId) if status != 2: sleep(0.5) status = self.getOrderInfo(symbol_1, orderId) if status != 2: self.cancelOrder(symbol_1, orderId) logging.info('cancelOrder!') return else: logging.info('[order succssed!]') else: logging.info('[order succssed!]') else: logging.info('[order failed!]') return # step2 logging.info('[step2]') self.getBalance() logging.info('[Balance]') logging.info(self.balance) amount2 = round((self.balance[symbols[1]] * 0.999) / float(t3['sell']['price']), 8) for i in range(retry): logging.info('[order]' + symbol_3 + '|buy|' + str(float(t3['sell']['price'])) + '|' + str(amount2)) orderId = self.trade(symbol_3, 'buy', float(t3['sell']['price']), amount2) if orderId: break if orderId: logging.info('[orderId]' + str(orderId)) status = self.getOrderInfo(symbol_3, orderId) if status != 2: sleep(0.5) status = self.getOrderInfo(symbol_3, orderId) if status != 2: self.cancelOrder(symbol_3, orderId) logging.info('cancelOrder!') return else: logging.info('[order succssed!]') else: logging.info('[order succssed!]') else: logging.info('[order failed!]') return # step3 logging.info('[step3]') self.getBalance() logging.info('[Balance]') logging.info(self.balance) amount3 = self.balance[symbols[2]] for i in range(retry): logging.info('[order]' + symbol_2 + '|sell|' + str(float(t2['buy']['price'])) + '|' + str(amount3)) orderId = self.trade(symbol_2, 'sell', float(t2['buy']['price']), amount3) if orderId: break if orderId: logging.info('[orderId]' + str(orderId)) status = self.getOrderInfo(symbol_2, orderId) if status != 2: sleep(0.5) status = self.getOrderInfo(symbol_2, orderId) if status != 2: self.cancelOrder(symbol_2, orderId) logging.info('cancelOrder!') return else: logging.info('[order succssed!]') else: logging.info('[order succssed!]') else: logging.info('[order failed!]') return else: pass def getCoinList(self, symbols): coinList = [] for k in permutations(symbols, 2): tmp = ['btc', k[0], 'eth', k[1]] coinList.append(tmp) return coinList def getTradeSymbol(self, coinlist): ts =[] for c in coinlist: s = ['_'.join((c[1], c[0])), '_'.join((c[1], c[2])), '_'.join((c[3], c[2])), '_'.join((c[3], c[0]))] ts.append(s) return ts def getTradeAmount(self, symbols): print(self.depth) for s in symbols: if s not in self.depth: return 0 print('getTrade:') print(symbols) ss = (self.depth[symbols[1]]['buy']['price'] * self.depth[symbols[3]]['buy']['price']) / (self.depth[symbols[0]]['sell']['price'] * self.depth[symbols[2]]['sell']['price']) if ss > 0.90: # logging.debug('profit: %f' % ss) # logging.debug(symbols) # logging.debug(self.depth[symbols[0]]) # logging.debug(self.depth[symbols[1]]) # logging.debug(self.depth[symbols[2]]) # logging.debug(self.depth[symbols[3]]) amount = [] amount.append(self.depth[symbols[0]]['sell']['price'] * min(self.depth[symbols[0]]['sell']['amount'],self.depth[symbols[1]]['buy']['amount'])) amount.append(self.depth[symbols[3]]['buy']['price'] * min(self.depth[symbols[3]]['buy']['amount'],self.depth[symbols[2]]['sell']['amount'])) amount.sort() logging.debug('amount: %f' % amount[0]) if amount[0] > 0.0001: logging.debug('profit: %f' % ss) logging.debug(symbols) logging.debug(self.depth[symbols[0]]) logging.debug(self.depth[symbols[1]]) logging.debug(self.depth[symbols[2]]) logging.debug(self.depth[symbols[3]]) return amount[0] else: return 0 def doTrade(self, symbols, amount): if self.balance['btc'] < amount * 0.9: initamount = self.balance['btc'] * 0.99 else: initamount = amount * 0.9 logging.debug('step1') amount1 = round(initamount / self.depth[symbols[0]]['sell']['price'], 8) orderId = self.trade(symbols[0], 'buy', self.depth[symbols[0]]['sell']['price'], amount1) if orderId: logging.info('[orderId]' + str(orderId)) status = self.getOrderInfo(symbols[0], orderId) if status != 2: sleep(0.5) status = self.getOrderInfo(symbols[0], orderId) if status != 2: self.cancelOrder(symbols[0], orderId) logging.info('cancelOrder!') return else: logging.info('[order succssed!]') else: logging.info('[order succssed!]') else: logging.info('[order failed!]') return logging.debug('step2') self.getBalance() logging.info('[Balance]') logging.info(self.balance) amount2 = self.balance[symbols[1].split('_')[0]] orderId = self.trade(symbols[1], 'sell', self.depth[symbols[1]]['buy']['price'], amount2) if orderId: logging.info('[orderId]' + str(orderId)) status = self.getOrderInfo(symbols[1], orderId) if status != 2: sleep(0.5) status = self.getOrderInfo(symbols[1], orderId) if status != 2: self.cancelOrder(symbols[1], orderId) logging.info('cancelOrder!') return else: logging.info('[order succssed!]') else: logging.info('[order succssed!]') else: logging.info('[order failed!]') return logging.debug('step3') self.getBalance() logging.info('[Balance]') logging.info(self.balance) amount3 = round((self.balance[symbols[2].split('_')[1]] / self.depth[symbols[2]]['sell']['price']) * 0.998, 8) orderId = self.trade(symbols[2], 'buy', self.depth[symbols[2]]['sell']['price'], amount3) if orderId: logging.info('[orderId]' + str(orderId)) status = self.getOrderInfo(symbols[2], orderId) if status != 2: sleep(0.5) status = self.getOrderInfo(symbols[2], orderId) if status != 2: self.cancelOrder(symbols[2], orderId) logging.info('cancelOrder!') return else: logging.info('[order succssed!]') else: logging.info('[order succssed!]') else: logging.info('[order failed!]') return logging.debug('step4') self.getBalance() logging.info('[Balance]') logging.info(self.balance) amount4 = self.balance[symbols[3].split('_')[0]] orderId = self.trade(symbols[3], 'sell', self.depth[symbols[3]]['buy']['price'], amount4) if orderId: logging.info('[orderId]' + str(orderId)) status = self.getOrderInfo(symbols[3], orderId) if status != 2: sleep(0.5) status = self.getOrderInfo(symbols[3], orderId) if status != 2: self.cancelOrder(symbols[3], orderId) logging.info('cancelOrder!') return else: logging.info('[order succssed!]') else: logging.info('[order succssed!]') else: logging.info('[order failed!]') return def policy(self, allsymbol): coins = self.getCoinList(allsymbol) tradesymbol = self.getTradeSymbol(coins) while(1): for symbols in tradesymbol: # print(symbols) # self.toBtc() a = self.getTradeAmount(symbols) sleep(0.5)