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
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
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
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'所有数据导入完成'
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
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) """
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
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
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