示例#1
0
    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
示例#2
0
 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])
示例#3
0
 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])
示例#4
0
    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")
示例#5
0
 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])
示例#6
0
 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])
示例#7
0
    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)
示例#8
0
    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)
示例#9
0
    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"]))
示例#10
0
    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
示例#11
0
    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)
示例#12
0
    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)
示例#13
0
    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")
示例#14
0
 def subscribeSpotTrades(self, u_id, symbol_pair="BOT_USDT"):
     symbol_pair = systemSymbolToVnSymbol(symbol_pair)
     self.sendSocketCmd(u_id, "trades.subscribe", [symbol_pair])
示例#15
0
    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)
示例#16
0
 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])
示例#17
0
    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)
示例#18
0
    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")
示例#19
0
 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])
示例#20
0
    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)

            
示例#21
0
    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