Beispiel #1
0
 def loadTick(self, dbName, collectionName, days):
     """从数据库中读取Tick数据,startDate是datetime对象"""
     startDate = self.today - timedelta(days)
     
     d = {'datetime':{'$gte':startDate}}
     tickData = self.mainEngine.dbQuery(dbName, collectionName, d, 'datetime')
     
     l = []
     for d in tickData:
         tick = VtTickData()
         tick.__dict__ = d
         l.append(tick)
     return l    
Beispiel #2
0
 def loadTick(self, dbName, collectionName, days):
     """从数据库中读取Tick数据,startDate是datetime对象"""
     startDate = self.today - timedelta(days)
     
     d = {'datetime':{'$gte':startDate}}
     tickData = self.mainEngine.dbQuery(dbName, collectionName, d)
     
     l = []
     for d in tickData:
         tick = VtTickData()
         tick.__dict__ = d
         l.append(tick)
     return l    
Beispiel #3
0
    def loadTick(self, dbName, collectionName, days):
        """从数据库中读取Tick数据,startDate是datetime对象"""
        print "%s.%s.%s" % (__name__, self.__class__.__name__, get_current_function_name())
        startDate = self.today - timedelta(days)

        d = {'datetime': {'$gte': startDate}}
        tickData = self.mainEngine.dbQuery(dbName, collectionName, d, 'datetime')

        l = []
        for d in tickData:
            tick = VtTickData()
            tick.__dict__ = d
            l.append(tick)
        return l
Beispiel #4
0
    def startWork(self):
        self.bm = BarGenerator(self.onBar, self.kLine, self.onXminBar)
        currentDate = None
        newData = False
        startTime = 0
        count = 0

        startDate = self.startDateFromHistory(self.symbol)
        if not startDate:
            tickCursor = self.tickCollection.find().sort('datetime')
        else:
            flt = {'datetime': {'$gte': startDate}}
            tickCursor = self.tickCollection.find(flt).sort('datetime')
        for d in tickCursor:
            tick = VtTickData()
            tick.__dict__ = d

            tickDateStr = tick.datetime.strftime('%Y%m%d')
            tickDate = datetime.strptime(tickDateStr, '%Y%m%d')
            if not currentDate or currentDate != tickDate:
                # 新的一天k线初始化
                self.newDayTick = tick
                self.bm.manualInit()
                self.newDayTick = None

                if newData:
                    # 保存导入记录
                    self.updateHistory(self.symbol, currentDate)

                    sub = time() - startTime
                    print u'用时:', sub, 's'
                    print u'数据量:', count, '\n'
                    count = 0

                currentDate = tickDate
                # 检查是否有数据库记录
                if not self.needUpdateChecking(self.symbol, currentDate):
                    # 当天的数据已经存在,无需重复导入
                    newData = False
                else:
                    print '*' * 6, tick.datetime.date(), '*' * 6
                    newData = True
                    startTime = time()
            if newData:
                self.bm.updateTick(tick)
                count += 1

        print u'所有数据导入完成'
Beispiel #5
0
def get_current_tick(symbol,type_=ProductClass.Future):
    """查询合约当前最新的价格"""
    redis = instance.datasourceManager.get('redis').conn
    key_name = ''
    try:
        if type_ == ProductClass.Future:
            key_name = CtpMarketSymbolTickFormat.format(symbol=symbol)
        elif type_ == ProductClass.Stock:
            key_name = XtpMarketSymbolTickFormat.format(symbol=symbol)
        data = redis.hgetall(key_name)

        tick = VtTickData()
        tick.__dict__ = data
    except:
        return None
    return tick
Beispiel #6
0
def get_symbol_ticks(message, ctx):
    """订阅的所有合约行情数据"""
    topic = ctx.get('name')
    data = message
    # topic: 订阅的通道名称 ctp_ticks_*
    symbol = topic.split('_')[-1]

    tick = json.loads(data)
    tick['datetime'] = datetime.datetime.strptime(
        ' '.join([tick.get('date'), tick.get('time')]), '%Y%m%d %H:%M:%S.%f')
    tickobj = VtTickData()
    tickobj.__dict__ = tick

    main = instance.serviceManager.get('main')
    # debug = main.cfgs.get('debug',{})
    # if debug.get('enable',False) and symbol in debug.get('symbols',[]):
    #     main.onTick(symbol,tickobj)
    # else:
    main.onTick(symbol, tickobj)
    """
Beispiel #7
0
def make_day_bar(symbol,date,drop =True,product=ProductClass.Future):
    """
    计算日线
    """
    from logging import getLogger
    if isinstance(date,str):
        date = parse(date)
    date = date.replace(hour=0,minute=0,second=0,microsecond=0)
    days = get_timespace_of_trade_day(date)
    bar = None
    if not days:
        getLogger().info("day span is None")
        return None
    t1,t2 = days

    conn = mongodb_conn
    dbname = CTP_TICK_DB
    coll = conn[dbname][symbol]

    rs = coll.find({'datetime':{'$gte':t1,'$lte':t2},'flag':0}).sort( (['datetime',pymongo.ASCENDING],['seq',pymongo.ASCENDING]))
    print symbol, t1, '-->', t2, ' count:',rs.count()
    dbname = CTP_BAR_DB
    collbar_1m = conn[dbname.format('1d')][symbol]

    # 删除已存在 1m bar
    if drop:
        collbar_1m.remove({'datetime':date})
    # 注意,记录的日期是日盘交易的日期
    if rs.count() == 0: # 分钟内无tick数据 ,将连续之前的bar
        # if not prev_bar: #查找前一个bar
        prev_bar = None
        r = collbar_1m.find({'datetime':{'$lt':t1},'flag':0}).sort('datetime',pymongo.DESCENDING).limit(1)
        if r.count() :
            prev_bar = VtBarData()
            prev_bar.__dict__ = r[0]

        if prev_bar:
            prev_bar.datetime = date
            prev_bar.date = prev_bar.datetime.strftime('%Y%m%d')
            prev_bar.time = prev_bar.datetime.strftime('%H:%M:%S.%f')
            prev_bar.high = prev_bar.close
            prev_bar.low = prev_bar.close
            prev_bar.open = prev_bar.close
            prev_bar.volume = 0
            bar = prev_bar
    else: # 计算当前分钟内的bar
        bar = VtBarData()
        tick = VtTickData()
        tick.__dict__ = rs[0]
        bar.datetime = date
        bar.date = bar.datetime.strftime('%Y%m%d')
        bar.time = bar.datetime.strftime('%H:%M:%S.%f')
        bar.vtSymbol = tick.vtSymbol
        bar.symbol = tick.symbol
        bar.exchange = tick.exchange
        bar.open = tick.lastPrice
        bar.high = tick.lastPrice
        bar.low = tick.lastPrice
        last = None

        # 找到前一个k线最后一个tick作为last
        rs = coll.find({'datetime': {'$lt': t1}, 'flag': 0}).sort(
            (['datetime', pymongo.DESCENDING], ['seq', pymongo.DESCENDING])).limit(1)
        if rs.count():
            last = VtTickData()
            last.__dict__ = rs[0]

        for r in rs:
            tick = VtTickData()
            tick.__dict__ = r
            bar.high = max(bar.high, tick.lastPrice)
            bar.low = min(bar.low, tick.lastPrice)

            bar.close = tick.lastPrice
            bar.openInterest = tick.openInterest
            if last:
                bar.volume += (tick.volume - last.volume)
            last = tick
    if bar: #写入bar
        dict_ = bar.__dict__
        if dict_.has_key('_id'):
            del dict_['_id']
        collbar_1m.insert_one(dict_)
        print 'Write {} Bar:'.format(str(date.date())),bar.__dict__
    return bar
Beispiel #8
0
def make_min_bar(symbol,t,nmin='1m',leftMargin=0,rightMargin=0,drop =True,product=ProductClass.Future):
    """
    开始计算指定开始分钟的 bar
    :drop  是否删除存在的分钟 bar

    1. 指定的分钟内没有tick数据
        取前一根有效的bar
        如果前无bar,则忽略本次bar计算

    """

    if nmin not in TimeDuration.SCALES.keys():
        print 'Error: paramter nmin:{} invalid.'.format(nmin)
        return
    mins = TimeDuration.SCALES[nmin]/TimeDuration.MINUTE
    t1 = t.replace(second=0,microsecond=0)
    t2 = t1 + TimeDelta(minutes=mins)
    conn = mongodb_conn
    dbname = CTP_TICK_DB
    coll = conn[dbname][symbol]

    p1 = t1 - TimeDelta(minutes=leftMargin)
    p2 = t2 + TimeDelta(minutes=rightMargin)

    rs = coll.find({'datetime':{'$gte':p1,'$lt':p2},'flag':0}).sort( (['datetime',pymongo.ASCENDING],['seq',pymongo.ASCENDING]))
    print symbol, p1, '-->', p2, ' count:',rs.count()
    dbname = CTP_BAR_DB
    collbar_1m = conn[dbname.format(nmin)][symbol]
    bar = None


    # 删除已存在 1m bar
    if drop:
        collbar_1m.remove({'datetime':t1})

    if rs.count() == 0: # 分钟内无tick数据 ,将连续之前的bar
        # if not prev_bar: #查找前一个bar
        prev_bar = None
        r = collbar_1m.find({'datetime':{'$lt':t1},'flag':0}).sort('datetime',pymongo.DESCENDING).limit(1)
        if r.count() :
            prev_bar = VtBarData()
            prev_bar.__dict__ = r[0]

        if prev_bar:
            prev_bar.datetime = t1
            prev_bar.date = prev_bar.datetime.strftime('%Y%m%d')
            prev_bar.time = prev_bar.datetime.strftime('%H:%M:%S.%f')
            prev_bar.high = prev_bar.close
            prev_bar.low = prev_bar.close
            prev_bar.open = prev_bar.close
            prev_bar.volume = 0
            bar = prev_bar
    else: # 计算当前分钟内的bar
        bar = VtBarData()
        tick = VtTickData()
        tick.__dict__ = rs[0]
        bar.datetime = t1
        bar.date = bar.datetime.strftime('%Y%m%d')
        bar.time = bar.datetime.strftime('%H:%M:%S.%f')
        bar.vtSymbol = tick.vtSymbol
        bar.symbol = tick.symbol
        bar.exchange = tick.exchange
        bar.open = tick.lastPrice
        bar.high = tick.lastPrice
        bar.low = tick.lastPrice
        last = None
        #找到前一个k线最后一个tick作为last
        rs = coll.find({'datetime': {'$lt': p1}, 'flag': 0}).sort((['datetime', pymongo.DESCENDING], ['seq', pymongo.DESCENDING])).limit(1)
        if rs.count():
            last = VtTickData()
            last.__dict__ = rs[0]
        # --
        for r in rs:
            tick = VtTickData()
            tick.__dict__ = r
            bar.high = max(bar.high, tick.lastPrice)
            bar.low = min(bar.low, tick.lastPrice)

            bar.close = tick.lastPrice
            bar.openInterest = tick.openInterest
            if last:
                bar.volume += (tick.volume - last.volume)
            last = tick
    if bar: #写入bar
        dict_ = bar.__dict__
        if dict_.has_key('_id'):
            del dict_['_id']
        collbar_1m.insert_one(dict_)
        print 'Write {} Bar:'.format(nmin),bar.__dict__
    return bar
Beispiel #9
0
def make_min_bar_real_calc(symbol,
                           nmin,
                           kline_time,
                           start,
                           end,
                           drop=True,
                           product=ProductClass.Future):
    """
    """

    # if nmin not in TimeDuration.SCALES.keys():
    #     print 'Error: paramter nmin:{} invalid.'.format(nmin)
    #     return
    # mins = TimeDuration.SCALES[nmin]/TimeDuration.MINUTE
    # t1 = t.replace(second=0,microsecond=0)
    # t2 = t1 + TimeDelta(minutes=mins)
    conn = mongodb_conn
    dbname = CTP_TICK_DB
    coll = conn[dbname][symbol]

    # p1 = t1 - TimeDelta(minutes=leftMargin)
    # p2 = t2 + TimeDelta(minutes=rightMargin)
    t1 = kline_time
    p1 = start
    p2 = end
    rs = coll.find({
        'datetime': {
            '$gte': p1,
            '$lt': p2
        },
        'flag': 0
    }).sort((['datetime', pymongo.ASCENDING], ['seq', pymongo.ASCENDING]))
    print symbol, p1, '-->', p2  #, ' count:',rs.count()
    dbname = CTP_BAR_DB
    collbar_1m = conn[dbname.format(nmin)][symbol]
    bar = None

    # return
    # 删除已存在 1m bar
    if drop:
        collbar_1m.remove({'datetime': t1})

    if rs.count() == 0:  # 分钟内无tick数据 ,将连续之前的bar
        # if not prev_bar: #查找前一个bar
        prev_bar = None
        r = collbar_1m.find({
            'datetime': {
                '$lt': t1
            },
            'flag': 0
        }).sort('datetime', pymongo.DESCENDING).limit(1)
        if r.count():
            prev_bar = VtBarData()
            prev_bar.__dict__ = r[0]

        if prev_bar:
            prev_bar.datetime = t1
            prev_bar.date = prev_bar.datetime.strftime('%Y%m%d')
            prev_bar.time = prev_bar.datetime.strftime('%H:%M:%S.%f')
            prev_bar.high = prev_bar.close
            prev_bar.low = prev_bar.close
            prev_bar.open = prev_bar.close
            prev_bar.volume = 0
            bar = prev_bar
    else:  # 计算当前分钟内的bar

        bar = VtBarData()
        tick = VtTickData()
        tick.__dict__ = rs[0]
        bar.datetime = t1
        bar.date = bar.datetime.strftime('%Y%m%d')
        bar.time = bar.datetime.strftime('%H:%M:%S.%f')
        bar.vtSymbol = tick.vtSymbol
        bar.symbol = tick.symbol
        bar.exchange = tick.exchange
        bar.open = tick.lastPrice
        bar.high = tick.lastPrice
        bar.low = tick.lastPrice
        last = None
        #找到前一个k线最后一个tick作为last
        rs = list(rs)
        # first = rs[0]
        #first = copy.deepcopy(rs[0])
        #if t.time() == Time(14,59) and nmin=='1m':
        #    print 'pause'
        #first_time = first['datetime'].time().replace(second=0,microsecond=0)
        if t1 == Time(21, 0):
            bar.volume = 0

        #if first_time in (Time(20,59),Time(21,0)):
        #   first['volume'] = 0
        #  last = VtTickData()
        #  last.__dict__ = first
        # last = first
        # if t.time()== Time(21,0):
        #     pass
        #else:
        _rs = coll.find({
            'datetime': {
                '$lt': p1
            },
            'flag': 0
        }).sort((['datetime',
                  pymongo.DESCENDING], ['seq', pymongo.DESCENDING])).limit(1)
        try:
            last = VtTickData()
            last.__dict__ = _rs[0]
        except:
            last = None
        if last and t1 == Time(21, 0):
            last.volume = 0

        # if _rs.count():  # too slowly, never use..
        #     last = VtTickData()
        #     last.__dict__ = _rs[0]
        # --
        # ss = list(rs)
        # s = ss[-1]
        # print s
        # return
        """
        if t.time() == Time(21,9):
            print t.time()
            rs = list(rs)
            f = open('test.txt','w')
            for s in rs:
                f.write('time:{} lower-price:{}\n'.format(str(t),s['lowPrice']))
            f.close()
        """
        for r in rs:
            tick = VtTickData()
            tick.__dict__ = r
            bar.high = max(bar.high, tick.lastPrice)
            bar.low = min(bar.low, tick.lastPrice)

            bar.close = tick.lastPrice
            bar.openInterest = tick.openInterest
            if last:
                bar.volume += (tick.volume - last.volume)
            last = tick
            # print bar.volume
    if bar:  #写入bar
        dict_ = bar.__dict__
        if dict_.has_key('_id'):
            del dict_['_id']
        collbar_1m.insert_one(dict_)
        print 'Write {} Bar:'.format(nmin), bar.__dict__
    return bar