def sendOrder(self, req): # 检查是否填入了价格,禁止市价委托 if req.priceType != PRICETYPE_LIMITPRICE: self.gateway.writeError(u'Gate接口仅支持限价单') return None symbol = req.vtSymbol if req.direction == DIRECTION_LONG: reqID = self.spotTrade(symbol=systemSymbolToVnSymbol(symbol), price=req.price, amount=req.volume, _type="buy") else: reqID = self.spotTrade(symbol=systemSymbolToVnSymbol(symbol), price=req.price, amount=req.volume, _type="sell") self.localID += 1 localID = str(self.localID) self.reqLocalDict[reqID] = localID # 推送委托信息 order = VtOrderData() order.gatewayName = self.gatewayName order.symbol = req.vtSymbol order.exchange = EXCHANGE_GATEIO order.vtSymbol = req.vtSymbol order.orderID = localID order.vtOrderID = '.'.join([order.gatewayName, order.orderID]) order.direction = req.direction if req.direction == DIRECTION_LONG: order.offset = OFFSET_OPEN else: order.offset = OFFSET_CLOSE order.price = req.price order.tradedVolume = 0 order.totalVolume = req.volume order.orderTime = datetime.now().strftime('%H:%M:%S') order.status = STATUS_UNKNOWN self.workingOrderDict[localID] = order self.cacheSendLocalOrder.add(localID) self.gateway.writeLog("sendOrder cacheSendLocalOrder add localID %s" % (localID)) # self.gateway.onOrder(order) # print "sendOrder:" , order.__dict__ # print "sendOrder: req" , req.__dict__ # 返回委托号 return order.vtOrderID
def querySpotTrades(self, u_id, symbol_pair="EOS_USDT", limit=2, last_id=7177813): symbol_pair = systemSymbolToVnSymbol(symbol_pair) self.sendSocketCmd(u_id, "trades.query", [symbol_pair, limit, last_id])
def querySpotDepth(self, u_id, symbol_pair="EOS_USDT", limit=5, interval="0.00000001"): symbol_pair = systemSymbolToVnSymbol(symbol_pair) self.sendSocketCmd(u_id, "depth.query", [symbol_pair, limit, interval])
def onTick(self, data): """实时成交推送""" result_status = data.get("status" , None) if str(result_status) != "0": self.gateway.writeLog( "onTick not success, " + str(data)) else: info = data["data"] u_type = info["type"] ticker = info["ticker"] last_price = float(ticker[0]) use_volume = float(ticker[-1]) symbol_pair = (u_type.split('.'))[1] symbol_pair = systemSymbolToVnSymbol(symbol_pair) if symbol_pair not in self.tickDict: tick = VtTickData() tick.gatewayName = self.gatewayName tick.exchange = EXCHANGE_FCOIN tick.symbol = '.'.join([symbol_pair, tick.exchange]) tick.vtSymbol = '.'.join([symbol_pair, tick.exchange]) self.tickDict[symbol_pair] = tick else: tick = self.tickDict[symbol_pair] tick.highPrice = last_price tick.lowPrice = last_price tick.lastPrice = last_price tick.volume = use_volume tick.datetime = datetime.now() tick.date = tick.datetime.strftime("%Y%m%d") tick.time = tick.datetime.strftime("%H:%M:%S.%f")
def subscribeSpotDepth(self, u_id, symbol_pair="BOT_USDT", limit=30, interval="0.00000001"): symbol_pair = systemSymbolToVnSymbol(symbol_pair) self.sendSocketCmd(u_id, "depth.subscribe", [symbol_pair, limit, interval])
def querySpotKline(self, u_id, symbol_pair="BTC_USDT", start=1516951219, end_time=1516951219, interval=1800): symbol_pair = systemSymbolToVnSymbol(symbol_pair) self.sendSocketCmd(u_id, "kline.query", [symbol_pair, start, end_time, interval])
def onAllTicker(self,msg): """币安支持所有 ticker 同时socket过来""" for symbol_pair_msg_dic in msg: symbol_pair = systemSymbolToVnSymbol(symbol_pair_msg_dic["s"]) vtSymbol = '.'.join([symbol_pair , EXCHANGE_BINANCE]) price = symbol_pair_msg_dic["p"] if symbol_pair not in self.tickDict: tick = VtTickData() tick.gatewayName = self.gatewayName tick.exchange = EXCHANGE_BINANCE tick.symbol = '.'.join([symbol_pair, tick.exchange]) tick.vtSymbol = tick.symbol self.tickDict[tick.symbol] = tick else: tick = self.tickDict[vtSymbol] tick.highPrice = float(symbol_pair_msg_dic["h"]) tick.lowPrice = float(symbol_pair_msg_dic["l"]) tick.lastPrice = (float(symbol_pair_msg_dic["b"]) + float(symbol_pair_msg_dic["a"]))/2.0 tick.volume = float(symbol_pair_msg_dic["v"]) tick.bidPrice1 = float(symbol_pair_msg_dic["b"]) tick.bidVolume1 = float(symbol_pair_msg_dic["B"]) tick.askPrice1 = float(symbol_pair_msg_dic["a"]) tick.askVolume1 = float(symbol_pair_msg_dic["A"]) tick.bidPrice2, tick.bidVolume2 = [0 , 0] tick.bidPrice3, tick.bidVolume3 = [0 , 0] tick.bidPrice4, tick.bidVolume4 = [0 , 0] tick.bidPrice5, tick.bidVolume5 = [0 , 0] tick.askPrice2, tick.askVolume2 = [0 , 0] tick.askPrice3, tick.askVolume3 = [0 , 0] tick.askPrice4, tick.askVolume4 = [0 , 0] tick.askPrice5, tick.askVolume5 = [0 , 0] tick.datetime , tick.date , tick.time = self.generateDateTime( float(msg["E"])) utc_dt = datetime.utcfromtimestamp( float(msg["E"])/1e3) tick.tradingDay = utc_dt.strftime('%Y-%m-%d') if tick.lastPrice == 0 and tick.askPrice1 != 0 and tick.bidPrice1 != 0: tick.lastPrice = (tick.askPrice1 + tick.bidPrice1) / 2 if tick.lastPrice == 0 or tick.askPrice1 == 0 or tick.bidPrice1 == 0: print('onAllTicker drop tick {},lastprice:{},askprice1={},bidPrice1:{}' .format(tick.vtSymbol,tick.lastPrice,tick.askPrice1,tick.bidPrice1)) return self.gateway.onTick(tick)
def onAllTicker(self, msg): """币安支持所有 ticker 同时socket过来""" for symbol_pair_msg_dic in msg: symbol_pair = systemSymbolToVnSymbol(symbol_pair_msg_dic["s"]) vtSymbol = '.'.join([symbol_pair, EXCHANGE_BINANCE]) price = symbol_pair_msg_dic["p"] if symbol_pair not in self.tickDict: tick = VtTickData() tick.gatewayName = self.gatewayName tick.exchange = EXCHANGE_BINANCE tick.symbol = '.'.join([symbol_pair, tick.exchange]) tick.vtSymbol = tick.symbol self.tickDict[tick.symbol] = tick else: tick = self.tickDict[vtSymbol] tick.highPrice = float(symbol_pair_msg_dic["h"]) tick.lowPrice = float(symbol_pair_msg_dic["l"]) tick.lastPrice = (float(symbol_pair_msg_dic["b"]) + float(symbol_pair_msg_dic["a"])) / 2.0 tick.volume = float(symbol_pair_msg_dic["v"]) tick.bidPrice1 = float(symbol_pair_msg_dic["b"]) tick.bidVolume1 = float(symbol_pair_msg_dic["B"]) tick.askPrice1 = float(symbol_pair_msg_dic["a"]) tick.askVolume1 = float(symbol_pair_msg_dic["A"]) tick.bidPrice2, tick.bidVolume2 = [0, 0] tick.bidPrice3, tick.bidVolume3 = [0, 0] tick.bidPrice4, tick.bidVolume4 = [0, 0] tick.bidPrice5, tick.bidVolume5 = [0, 0] tick.askPrice2, tick.askVolume2 = [0, 0] tick.askPrice3, tick.askVolume3 = [0, 0] tick.askPrice4, tick.askVolume4 = [0, 0] tick.askPrice5, tick.askVolume5 = [0, 0] tick.datetime, tick.date, tick.time = self.generateDateTime( float(msg["E"])) self.gateway.onTick(tick)
def onTick(self, msg): symbol_pair = systemSymbolToVnSymbol(msg["s"]) symbol = symbol_pair + "." + EXCHANGE_BINANCE price = msg["p"] if symbol not in self.tickDict: tick = VtTickData() tick.gatewayName = self.gatewayName tick.exchange = EXCHANGE_BINANCE tick.symbol = '.'.join([symbol_pair, tick.exchange]) tick.vtSymbol = tick.symbol self.tickDict[symbol] = tick else: tick = self.tickDict[symbol] tick.highPrice = float(msg["h"]) tick.lowPrice = float(msg["l"]) tick.lastPrice = (float(msg["b"]) + float(msg["a"])) / 2.0 tick.volume = float(msg["v"]) tick.bidPrice1 = float(msg["b"]) tick.bidVolume1 = float(msg["B"]) tick.askPrice1 = float(msg["a"]) tick.askVolume1 = float(msg["A"]) # tick.bidPrice2, tick.bidVolume2 = [0 , 0] # tick.bidPrice3, tick.bidVolume3 = [0 , 0] # tick.bidPrice4, tick.bidVolume4 = [0 , 0] # tick.bidPrice5, tick.bidVolume5 = [0 , 0] # tick.askPrice2, tick.askVolume2 = [0 , 0] # tick.askPrice3, tick.askVolume3 = [0 , 0] # tick.askPrice4, tick.askVolume4 = [0 , 0] # tick.askPrice5, tick.askVolume5 = [0 , 0] tick.datetime, tick.date, tick.time = self.generateDateTime( float(msg["E"]))
def get_bars(self, symbol, period, callback, bar_is_completed=False, bar_freq=1, start_dt=None): """ 返回k线数据 symbol:合约 period: 周期: 1min,3min,5min,15min,30min,1day,3day,1hour,2hour,4hour,6hour,12hour """ ret_bars = [] symbol_pair = systemSymbolToVnSymbol(symbol) if symbol_pair not in symbol_list: msg = u'{} {}不在下载清单中'.format(datetime.now(), symbol_pair) if self.strategy: self.strategy.writeCtaError(msg) else: print(msg) return False, ret_bars symbol = symbol_pair.replace('_', '') if period == '1hour': period = '60min' if period not in period_list: self.writeError(u'{}不在下载时间周期范围:{} 内'.format(period, period_list)) return False, ret_bars url = u'https://api.huobipro.com/market/history/kline?symbol={}&period={}& size=2000&AccessKeyId=fff-xxx-ssss-kkk'.format( symbol, period) self.writeLog('{}开始下载:{} {}数据.URL:{}'.format(datetime.now(), symbol_pair, period, url)) content = None try: content = self.session.get(url).content.decode('gbk') except Exception as ex: self.writeError('exception in get:{},{},{}'.format( url, str(ex), traceback.format_exc())) return False, ret_bars ret_dict = execjs.eval(content) bars = ret_dict.get('data', None) if not isinstance(bars, list): self.writeError('返回数据不是list:{}'.format(content)) return False, ret_bars bars.reverse() for i, bar in enumerate(bars): add_bar = CtaBarData() try: add_bar.vtSymbol = symbol add_bar.symbol = symbol add_bar.datetime = datetime.fromtimestamp(bar[0] / 1000) add_bar.date = add_bar.datetime.strftime('%Y-%m-%d') add_bar.time = add_bar.datetime.strftime('%H:%M:%S') add_bar.tradingDay = add_bar.date add_bar.open = float(bar[1]) add_bar.high = float(bar[2]) add_bar.low = float(bar[3]) add_bar.close = float(bar[4]) add_bar.volume = float(bar[5]) except Exception as ex: self.strategy.writeCtaError( 'error when convert bar:{},ex:{},t:{}'.format( bar, str(ex), traceback.format_exc())) return False, ret_bars if start_dt is not None and bar.datetime < start_dt: continue if callback is not None: callback(add_bar, bar_is_completed, bar_freq) return True, ret_bars
def onOrderInfo(self,data, req, reqID): if self.DEBUG: print(data) result_status = data.get("status" , None) if str(result_status) != "0" and result_status != True: msg = data.get("msg" , u"spot onOrderInfo! 订单查询出错") code = data.get("code" , "f8") self.gateway.writeError( "onCancelOrder data info %s" % (str(data)) + " " + msg , code) else: use_order = data["data"] systemID = use_order["id"] status = use_order["state"] tradedVolume = float(use_order["filled_amount"]) totalVolume = float(use_order["amount"]) price = float(use_order["price"]) side = use_order["side"] use_dt , use_date, now_time = self.generateDateTime(use_order["created_at"]) local_system_dict_keys = self.systemLocalDict.keys() if systemID in local_system_dict_keys: localID = self.systemLocalDict[systemID] order = self.workingOrderDict.get(localID, None) if order != None: bef_has_volume = self.tradedVolumeDict.get(localID , 0.0) newTradeVolume = tradedVolume - bef_has_volume order.tradedVolume = tradedVolume if newTradeVolume > 0.000001: trade = VtTradeData() trade.gatewayName = self.gatewayName trade.symbol = order.symbol trade.vtSymbol = order.vtSymbol self.tradeID += 1 trade.tradeID = str(self.tradeID) trade.vtTradeID = '.'.join([trade.gatewayName,trade.tradeID]) trade.orderID = order.orderID trade.vtOrderID = order.vtOrderID trade.volume = newTradeVolume trade.price = order.price trade.direction = order.direction trade.offset = order.offset trade.exchange = order.exchange trade.tradeTime = now_time self.gateway.onTrade(trade) self.tradedVolumeDict[localID] = tradedVolume self.cache_trade_data.append(trade) # 订单已经结束 if status in ["filled","canceled"]: # 判断是否是 撤销单 if tradedVolume + 0.000001 < totalVolume: order.status = STATUS_CANCELLED else: order.status = STATUS_ALLTRADED order.cancelTime = datetime.now().strftime("%Y-%m-%d %H:%M:%S") self.gateway.onOrder(order) del self.tradedVolumeDict[localID] del self.systemLocalDict[systemID] del self.workingOrderDict[localID] self.cancelSystemOrderFilter.add(systemID) # 排除已经cancel消失得单子 elif status in [ "partial_filled" , "submitted" ]: if tradedVolume > 0.0000001: order.status = STATUS_PARTTRADED else: order.status = STATUS_NOTTRADED self.gateway.onOrder(order) else: if tradedVolume > 0.0000001: order.status = STATUS_PARTTRADED self.gateway.onOrder(order) self.gateway.writeError(" Exchange %s , new status %s , data %s" % (EXCHANGE_FCOIN , str(status) , str(data)), "f13") else: # 说明是以前发的单子 if systemID not in self.cancelSystemOrderFilter: # 排除已经cancel消失得单子 if status not in ["filled" , "canceled"]: symbol_pair = systemSymbolToVnSymbol(use_order["symbol"]) if symbol_pair in self.registerSymbols: self.localID += 1 localID = str(self.localID) order = VtOrderData() order.gatewayName = self.gatewayName order.symbol = symbol_pair + "." + self.gatewayName order.exchange = EXCHANGE_FCOIN order.vtSymbol = order.symbol order.orderID = localID order.vtOrderID = '.'.join([order.gatewayName,order.orderID]) order.direction = DIRECTION_LONG order.offset = OFFSET_OPEN if side == "sell": order.direction = DIRECTION_SHORT order.offset = OFFSET_CLOSE order.price = price order.totalVolume = totalVolume order.tradedVolume = tradedVolume order.orderTime = now_time if status in [ "partial_filled" , "submitted" ]: if order.tradedVolume > 0.0000001: order.status = STATUS_PARTTRADED else: order.status = STATUS_NOTTRADED else: self.gateway.writeError(" Exchange %s , new status %s , data %s" % (EXCHANGE_FCOIN , str(status) , str(data)), "f13") if order.tradedVolume > 0.00000001: order.status = STATUS_PARTTRADED localID = self.autoFixMatch( order , localID) order.orderID = localID order.vtOrderID = '.'.join([order.gatewayName,order.orderID,]) self.gateway.writeLog(" onOrderInfo occure new order, localID %s, sysmtemID %s , order.vtSymbol %s , order.price %s" % (str(localID),str(systemID),str(order.vtSymbol),str(order.price))) self.workingOrderDict[localID] = order self.systemLocalDict[systemID] = localID self.localSystemDict[localID] = systemID self.tradedVolumeDict[localID] = tradedVolume self.gateway.onOrder(order)
def onTradeOrder(self, data, req, reqID): symbol = systemSymbolToVnSymbol(data["symbol"]) localID = self.reqLocalDict[reqID] systemID = str(data['orderId']) self.localSystemDict[localID] = systemID self.systemLocalDict[systemID] = localID # print systemID , localID # 撤单 if localID in self.cancelDict: req = self.cancelDict[localID] self.cancel(req) del self.cancelDict[localID] # 推送委托信息 order = self.workingOrderDict[localID] volume = float(data["executedQty"]) origQty = float(data["origQty"]) status = data["status"] order.tradedVolume = volume use_dt, use_date, now_time = self.generateDateTime( data["transactTime"]) if status == "FILLED": order.status = STATUS_ALLTRADED elif status == "PARTIALLY_FILLED": order.status = STATUS_PARTTRADED elif status == "NEW": order.status = STATUS_NOTTRADED elif status == "CANCELED": order.status = STATUS_CANCELLED order.cancelTime = use_date + " " + now_time else: self.gateway.writeError("%s new status" % EXCHANGE_BINANCE, "b20") if status in ["PARTIALLY_FILLED", "FILLED"]: trade = VtTradeData() trade.gatewayName = self.gatewayName trade.symbol = order.symbol trade.vtSymbol = order.vtSymbol self.tradeID += 1 trade.tradeID = str(self.tradeID) trade.vtTradeID = '.'.join([trade.gatewayName, trade.tradeID]) trade.orderID = order.orderID trade.vtOrderID = order.vtOrderID trade.volume = float(volume) trade.price = order.price trade.direction = order.direction trade.offset = order.offset trade.exchange = order.exchange trade.tradeTime = use_date + " " + now_time self.gateway.onTrade(trade) self.tradedVolumeDict[localID] = volume self.gateway.onOrder(order)
def onOrderList(self, data, req, reqID): # self.gateway.writeLog("onOrderList: %s" % (str(data))) result_status = data.get("result", None) if result_status != "true" and result_status != True: msg = data.get("message", u"spot onOrderList! 订单列表查询出错 ") code = data.get("code", "g9") self.gateway.writeError("data info %s" % (str(data)) + " " + msg, code) else: try: orders = data["orders"] still_live_order_system_id = [ str(x["orderNumber"]) for x in orders ] local_system_dict_keys = self.systemLocalDict.keys() for use_order in orders: systemID = str(use_order["orderNumber"]) status = use_order["status"] tradedVolume = float(use_order["filledAmount"]) price = float(use_order["rate"]) volume = float(use_order["amount"]) side = use_order["type"] use_dt, use_date, now_time = self.generateDateTime( use_order["timestamp"]) if systemID in local_system_dict_keys: localID = self.systemLocalDict[systemID] order = self.workingOrderDict.get(localID, None) if order != None: bef_has_volume = self.tradedVolumeDict.get( localID, 0.0) newTradeVolume = tradedVolume - bef_has_volume order.tradedVolume = tradedVolume if newTradeVolume > 0.000001: self.tradedVolumeDict[localID] = tradedVolume if status == "open": if tradedVolume > 0.0: order.status = STATUS_PARTTRADED self.gateway.onOrder(order) else: order.status = STATUS_NOTTRADED self.gateway.onOrder(order) #elif status == "partial-filled": else: self.gateway.writeError( " Exchange %s , new status %s , data %s" % (EXCHANGE_GATEIO, str(status), str(data)), "g13") else: # 说明是以前发的单子 # self.gateway.writeLog(" registerSymbols :%s" % str(self.registerSymbols)) if systemID not in self.cancelSystemOrderFilter: # 排除已经cancel消失得单子 if status not in ["closed", "cancelled"]: symbol_pair = systemSymbolToVnSymbol( use_order["currencyPair"]) if symbol_pair in self.registerSymbols: self.localID += 1 localID = str(self.localID) order = VtOrderData() order.gatewayName = self.gatewayName order.symbol = symbol_pair + "." + self.gatewayName order.exchange = EXCHANGE_GATEIO order.vtSymbol = order.symbol order.orderID = localID order.vtOrderID = '.'.join( [order.gatewayName, order.orderID]) order.direction = DIRECTION_LONG order.offset = OFFSET_OPEN if side == "sell": order.direction = DIRECTION_SHORT order.offset = OFFSET_CLOSE order.price = price order.totalVolume = volume order.tradedVolume = tradedVolume order.orderTime = now_time if status == "open": if tradedVolume > 0.0: order.status = STATUS_PARTTRADED else: order.status = STATUS_NOTTRADED else: self.gateway.writeError( " Exchange %s , new status %s , data %s" % (EXCHANGE_GATEIO, str(status), str(data)), "g13") localID = self.autoFixMatch(order, localID) order.orderID = localID order.vtOrderID = '.'.join( [order.gatewayName, order.orderID]) self.gateway.writeLog( "onOrderList occure new order, localID %s, sysmtemID %s , order.vtSymbol %s , order.price %s" % (str(localID), str(systemID), str(order.vtSymbol), str( order.price))) self.workingOrderDict[localID] = order self.systemLocalDict[systemID] = localID self.localSystemDict[localID] = systemID self.tradedVolumeDict[ localID] = tradedVolume self.gateway.onOrder(order) except Exception as ex: self.gateway.writeError( "onOrderList parse error ,data %s , ex %s" % (str(data), str(ex)), "g15")
def subscribeSpotTrades(self, u_id, symbol_pair="BOT_USDT"): symbol_pair = systemSymbolToVnSymbol(symbol_pair) self.sendSocketCmd(u_id, "trades.subscribe", [symbol_pair])
def onDepth(self, msg): upper_symbol = msg.get('s', None) if upper_symbol is None: return symbol_pair = systemSymbolToVnSymbol(upper_symbol) first_update_id = msg["U"] final_update_id = msg["u"] bids = msg["b"] asks = msg["a"] uu_time_stamp = msg["E"] all_keys = self.symbol_real_depth_dict.keys() # print "onDepth" # 判断是否已经 读取过历史数据 if symbol_pair in all_keys: # print "if symbol_pair in all_keys:" info = self.symbol_real_depth_dict[symbol_pair] depth_dict_bids = info["depth_dict_bids"] depth_dict_asks = info["depth_dict_asks"] last_event_id = info["last_event_id"] if int(last_event_id) + 1 >= int(first_update_id) and int( last_event_id) < int(final_update_id): for b_arr in bids: price, volume, tmp_arr = b_arr price = float(price) volume = float(volume) if volume > 0: depth_dict_bids[price] = volume else: if price in depth_dict_bids.keys(): del depth_dict_bids[price] for a_arr in asks: price, volume, tmp_arr = a_arr price = float(price) volume = float(volume) if volume > 0: depth_dict_asks[price] = volume else: if price in depth_dict_asks.keys(): del depth_dict_asks[price] self.symbol_real_depth_dict[symbol_pair][ "last_event_id"] = str(final_update_id) else: if int(last_event_id) + 1 < int(first_update_id): # 说明信息已经不及时了 del self.symbol_real_depth_dict[symbol_pair] self.tick_depth_array_dict[symbol_pair] = [msg] self.gateway.writeLog("del update info %s's depth" % symbol_pair) self.dealMsgArrayInfo(symbol_pair) else: # print "else symbol_pair in all_keys:" if symbol_pair not in self.tick_depth_array_dict: self.tick_depth_array_dict[symbol_pair] = [msg] else: self.tick_depth_array_dict[symbol_pair].append(msg) self.dealMsgArrayInfo(symbol_pair) # print "self.symbol_real_depth_dict" # print self.symbol_real_depth_dict depth_dict_bids = self.symbol_real_depth_dict[symbol_pair][ "depth_dict_bids"] depth_dict_asks = self.symbol_real_depth_dict[symbol_pair][ "depth_dict_asks"] symbol = symbol_pair + "." + EXCHANGE_BINANCE if symbol not in self.tickDict: tick = VtTickData() tick.symbol = symbol tick.vtSymbol = tick.symbol tick.exchange = EXCHANGE_BINANCE tick.gatewayName = self.gatewayName self.tickDict[symbol] = tick else: tick = self.tickDict[symbol] try: arr = sorted(depth_dict_bids.items(), key=lambda x: x[0]) # print "tick1" , arr arr_len = len(arr) (tick.bidPrice1, tick.bidVolume1) = arr[-1] if arr_len >= 1 else (0, 0) (tick.bidPrice2, tick.bidVolume2) = arr[-2] if arr_len >= 2 else (0, 0) (tick.bidPrice3, tick.bidVolume3) = arr[-3] if arr_len >= 3 else (0, 0) (tick.bidPrice4, tick.bidVolume4) = arr[-4] if arr_len >= 4 else (0, 0) (tick.bidPrice5, tick.bidVolume5) = arr[-5] if arr_len >= 5 else (0, 0) except Exception as ex: self.gateway.writeError(u'OnDepth Exception:{}'.format(str(ex))) self.gateway.writeLog(u'OnDepth {}'.format(traceback.format_exc())) try: arr = sorted(depth_dict_asks.items(), key=lambda x: x[0]) # print "tick2", arr arr_len = len(arr) (tick.askPrice1, tick.askVolume1) = arr[0] if arr_len >= 1 else (0, 0) (tick.askPrice2, tick.askVolume2) = arr[1] if arr_len >= 2 else (0, 0) (tick.askPrice3, tick.askVolume3) = arr[2] if arr_len >= 3 else (0, 0) (tick.askPrice4, tick.askVolume4) = arr[3] if arr_len >= 4 else (0, 0) (tick.askPrice5, tick.askVolume5) = arr[4] if arr_len >= 5 else (0, 0) except Exception as ex: self.gateway.writeError(u'OnDepth Exception:{}'.format(str(ex))) self.gateway.writeLog(u'OnDepth {}'.format(traceback.format_exc())) tick.datetime, tick.date, tick.time = self.generateDateTime( uu_time_stamp) # print tick.__dict__ self.gateway.onTick(tick)
def subscribeSpotKline(self, u_id, symbol_pair="BOT_USDT", interval=1800): symbol_pair = systemSymbolToVnSymbol(symbol_pair) self.sendSocketCmd(u_id, "kline.subscribe", [symbol_pair, interval])
def onGetAllOrders(self, data, req, reqID): local_system_dict_keys = self.systemLocalDict.keys() stile_live_order_system_id = [str(x["orderId"]) for x in data] for use_order in data: systemID = str(use_order["orderId"]) status = use_order["status"] side = use_order["side"] tradedVolume = float(use_order["executedQty"]) use_dt, use_date, now_time = self.generateDateTime( use_order["time"]) # now_time = self.generateDateTime(use_order["time"]) if systemID in local_system_dict_keys: localID = self.systemLocalDict[systemID] order = self.workingOrderDict.get(localID, None) if order != None: bef_has_volume = self.tradedVolumeDict.get(localID, 0.0) newTradeVolume = tradedVolume - bef_has_volume self.writeLog('{} 成交:{} ,之前累计成交:{},当次成交:{}'.format( localID, tradedVolume, bef_has_volume, newTradeVolume)) order.tradedVolume = tradedVolume if newTradeVolume > 0.000001: trade = VtTradeData() trade.gatewayName = self.gatewayName trade.symbol = order.symbol trade.vtSymbol = order.vtSymbol self.tradeID += 1 trade.tradeID = str(self.tradeID) trade.vtTradeID = '.'.join( [trade.gatewayName, trade.tradeID]) trade.orderID = order.orderID trade.vtOrderID = order.vtOrderID trade.volume = newTradeVolume trade.price = order.price trade.direction = order.direction trade.offset = order.offset trade.exchange = order.exchange trade.tradeTime = now_time self.gateway.onTrade(trade) self.tradedVolumeDict[localID] = tradedVolume if status == "FILLED": # 说明这个单子成交完毕了! order.status = STATUS_ALLTRADED self.gateway.onOrder(order) del self.tradedVolumeDict[localID] del self.systemLocalDict[systemID] del self.workingOrderDict[localID] elif status == "CANCELED": order.status = STATUS_CANCELLED order.cancelTime = use_date + " " + now_time self.gateway.onOrder(order) del self.tradedVolumeDict[localID] del self.systemLocalDict[systemID] del self.workingOrderDict[localID] # 部分成交 elif status == "PARTIALLY_FILLED": order.status = STATUS_PARTTRADED self.gateway.onOrder(order) elif status == "NEW": order.status = STATUS_NOTTRADED self.gateway.onOrder(order) else: # 说明是以前发的单子 symbol_pair = systemSymbolToVnSymbol(use_order["symbol"]) if status not in ["FILLED", "CANCELED"]: self.localID += 1 localID = str(self.localID) order = VtOrderData() order.gatewayName = self.gatewayName order.symbol = symbol_pair + "." + self.gatewayName order.exchange = EXCHANGE_BINANCE order.vtSymbol = order.symbol order.orderID = localID order.vtOrderID = '.'.join( [order.gatewayName, order.orderID]) order.direction = DIRECTION_NET order.offset = OFFSET_OPEN if side == "SELL": order.direction = DIRECTION_SHORT order.offset = OFFSET_CLOSE order.price = float(use_order["price"]) order.totalVolume = float(use_order["origQty"]) order.tradedVolume = float(use_order["executedQty"]) use_dt, use_date, use_time = self.generateDateTime( use_order["time"]) order.orderTime = use_time if status == "PARTIALLY_FILLED": order.status = STATUS_PARTTRADED elif status == "NEW": order.status = STATUS_NOTTRADED self.workingOrderDict[localID] = order self.systemLocalDict[systemID] = localID self.localSystemDict[localID] = systemID self.tradedVolumeDict[localID] = float( use_order["executedQty"]) self.gateway.onOrder(order)
def onOrderList(self,data, req, reqID): if self.DEBUG: print (data) result_status = data.get("status" , None) if str(result_status) != "0": msg = data.get("msg" , u"spot onOrderList! 订单列表查询出错 ") code = data.get("status" , "f9") self.gateway.writeError( "data info %s" % (str(data)) + " " + msg , code) else: try: orders = data["data"] still_live_order_system_id = [ str(x["id"]) for x in orders] local_system_dict_keys = self.systemLocalDict.keys() for use_order in orders: systemID = str(use_order["id"]) status = use_order["state"] tradedVolume = float(use_order["filled_amount"]) totalVolume = float(use_order["amount"]) price = float(use_order["price"]) side = use_order["side"] use_dt , use_date, now_time = self.generateDateTime(use_order["created_at"]) if systemID in local_system_dict_keys: localID = self.systemLocalDict[systemID] order = self.workingOrderDict.get(localID, None) if order != None: bef_has_volume = self.tradedVolumeDict.get(localID , 0.0) newTradeVolume = tradedVolume - bef_has_volume order.tradedVolume = tradedVolume if newTradeVolume > 0.000001: trade = VtTradeData() trade.gatewayName = self.gatewayName trade.symbol = order.symbol trade.vtSymbol = order.vtSymbol self.tradeID += 1 trade.tradeID = str(self.tradeID) trade.vtTradeID = '.'.join([ trade.gatewayName,trade.tradeID]) trade.orderID = order.orderID trade.vtOrderID = order.vtOrderID trade.volume = newTradeVolume trade.price = order.price trade.direction = order.direction trade.offset = order.offset trade.exchange = order.exchange trade.tradeTime = now_time self.gateway.onTrade(trade) self.tradedVolumeDict[localID] = tradedVolume self.cache_trade_data.append(trade) if status == "submitted": if tradedVolume > 0.00000001: order.status = STATUS_PARTTRADED self.gateway.onOrder(order) else: order.status = STATUS_NOTTRADED self.gateway.onOrder(order) else: if tradedVolume > 0.0000001: order.status = STATUS_PARTTRADED self.gateway.onOrder(order) self.gateway.writeError(" Exchange %s , new status %s , data %s" % (EXCHANGE_FCOIN , str(status) , str(data)), "f13") else: # 说明是以前发的单子 # self.gateway.writeLog(" registerSymbols :%s" % str(self.registerSymbols)) if systemID not in self.cancelSystemOrderFilter: # 排除已经cancel消失得单子 if status not in ["filled","canceled"]: symbol_pair = systemSymbolToVnSymbol(use_order["symbol"]) if symbol_pair in self.registerSymbols: self.localID += 1 localID = str(self.localID) order = VtOrderData() order.gatewayName = self.gatewayName order.symbol = symbol_pair + "." + self.gatewayName order.exchange = EXCHANGE_FCOIN order.vtSymbol = order.symbol order.orderID = localID order.vtOrderID = '.'.join([ order.gatewayName,order.orderID]) order.direction = DIRECTION_LONG order.offset = OFFSET_OPEN if side == "sell": order.direction = DIRECTION_SHORT order.offset = OFFSET_CLOSE order.price = price order.totalVolume = totalVolume order.tradedVolume = tradedVolume order.orderTime = now_time if status == "open": if tradedVolume > 0.0: order.status = STATUS_PARTTRADED else: order.status = STATUS_NOTTRADED else: self.gateway.writeError(" Exchange %s , new status %s , data %s" % (EXCHANGE_FCOIN , str(status) , str(data)), "g13") if tradedVolume > 0.0000001: order.status = STATUS_PARTTRADED localID = self.autoFixMatch( order , localID) order.orderID = localID order.vtOrderID = '.'.join([order.gatewayName,order.orderID]) self.gateway.writeLog("onOrderList occure new order, localID %s, sysmtemID %s , order.vtSymbol %s , order.price %s" % (str(localID),str(systemID),str(order.vtSymbol),str(order.price))) self.workingOrderDict[localID] = order self.systemLocalDict[systemID] = localID self.localSystemDict[localID] = systemID self.tradedVolumeDict[localID] = tradedVolume self.gateway.onOrder(order) except Exception as ex: self.gateway.writeError("onOrderList parse error ,data %s , ex %s" % (str(data) , str(ex)) , "f15")
def querySpotTicker(self, u_id, symbol_pair="EOS_USDT", time_period=86400): symbol_pair = systemSymbolToVnSymbol(symbol_pair) self.sendSocketCmd(u_id, "ticker.query", [symbol_pair, time_period])
def onDepth(self, data): result_status = data.get("status", None) if str(result_status) != "0": self.gateway.writeLog( "onDepth not success, " + str(data)) else: info = data["data"] u_type = info["type"] symbol_pair = (u_type.split('.'))[-1] symbol_pair = systemSymbolToVnSymbol(symbol_pair) if symbol_pair not in self.tickDict: tick = VtTickData() tick.gatewayName = self.gatewayName tick.symbol = symbol_pair tick.exchange = EXCHANGE_FCOIN tick.vtSymbol = '.'.join([tick.symbol, tick.exchange]) self.tickDict[symbol_pair] = tick else: tick = self.tickDict[symbol_pair] bids_data = info["bids"] asks_data = info["asks"] bids_data = [float(x) for x in bids_data] asks_data = [float(x) for x in asks_data] llen_bids = len(bids_data) llen_asks = len(asks_data) new_bids_arr = [] for i in range(0,int(llen_bids / 2)): new_bids_arr.append( [bids_data[2*i] , bids_data[2*i+1]] ) new_asks_arr = [] for i in range(0,int(llen_asks / 2)): new_asks_arr.append( [asks_data[2*i] , asks_data[2*i+1]] ) sort_bids_data = sorted(new_bids_arr , key=lambda price_pair: price_pair[0] ) sort_asks_data = sorted(new_asks_arr, key=lambda price_pair: price_pair[0] ) sort_bids_data.reverse() bids = sort_bids_data[:5] asks = sort_asks_data[:5] try: tick.bidPrice1, tick.bidVolume1 = bids[0] tick.bidPrice2, tick.bidVolume2 = bids[1] tick.bidPrice3, tick.bidVolume3 = bids[2] tick.bidPrice4, tick.bidVolume4 = bids[3] tick.bidPrice5, tick.bidVolume5 = bids[4] except Exception as ex: pass try: tick.askPrice1, tick.askVolume1 = asks[0] tick.askPrice2, tick.askVolume2 = asks[1] tick.askPrice3, tick.askVolume3 = asks[2] tick.askPrice4, tick.askVolume4 = asks[3] tick.askPrice5, tick.askVolume5 = asks[4] except Exception as ex: pass tick.datetime = datetime.now() tick.date = tick.datetime.strftime("%Y%m%d") tick.time = tick.datetime.strftime("%H:%M:%S.%f") self.gateway.onTick(tick)
def download_bars(self, symbol, period, size_=None, start_dt=None): """ 返回k线数据 symbol:合约 period: 周期: 1min, 5min, 15min, 30min, 60min, 1day, 1mon, 1week, 1year """ ret_bars = [] symbol_pair = systemSymbolToVnSymbol(symbol) if symbol_pair not in symbol_list: msg = u'{} {}不在下载清单中'.format(datetime.now(), symbol_pair) if self.strategy: self.strategy.writeCtaError(msg) else: print(msg) return ret_bars symbol = symbol_pair.replace('_', '') if period == '1hour': period = '60min' if period not in period_list: self.writeError(u'{}不在下载时间周期范围:{} 内'.format(period, period_list)) return ret_bars url = u'https://api.huobipro.com/market/history/kline?symbol={}&period={}&AccessKeyId=fff-xxx-ssss-kkk'.format( symbol, period) if not isinstance(size_, int): size_ = 2000 url = url + u'&size={}'.format(size_) self.writeLog('{}开始下载:{} {}数据.URL:{}'.format(datetime.now(), symbol_pair, period, url)) content = None try: content = self.session.get(url).content.decode('gbk') except Exception as ex: self.writeError('exception in get:{},{},{}'.format( url, str(ex), traceback.format_exc())) return ret_bars ret_dict = execjs.eval(content) bars = ret_dict.get('data', None) if not isinstance(bars, list): self.writeError('返回数据不是list:{}'.format(content)) return ret_bars bars.reverse() for i, bar in enumerate(bars): add_bar = {} try: bar_datetime = datetime.fromtimestamp(bar.get('id')) add_bar['datetime'] = bar_datetime.strftime( '%Y-%m-%d %H:%M:%S') add_bar['date'] = bar_datetime.strftime('%Y-%m-%d') add_bar['time'] = bar_datetime.strftime('%H:%M:%S') add_bar['open'] = float(bar.get('open', 0.0)) add_bar['high'] = float(bar.get('high', 0.0)) add_bar['low'] = float(bar.get('low', 0.0)) add_bar['close'] = float(bar.get('close', 0.0)) add_bar['volume'] = float(bar.get('vol', 0.0)) except Exception as ex: self.writeError('error when convert bar:{},ex:{},t:{}'.format( bar, str(ex), traceback.format_exc())) ret_bars.append(add_bar) return ret_bars