def getHistoryBars(self, code, cycle='1m', limit=100, inc_last=False): """获取历史k线 剔除最后一根活动k线(盘中不能使用最后一根k线,或许是未完成计算的中间结果) result 以时间升序排列 """ # if self.bar_nums.get(ktype,0) == 0: # return () stock = self.product.getOrNewTradeObject(code) stk = stock.stk bars = { '1m': stk.MinuteData1, '5m': stk.MinuteData5, '15m': stk.MinuteData15, '30m': stk.MinuteData30, 'd': stk.DailyData, 'w': stk.WeeklyData, 'm': stk.MonthlyData, 'q': stk.QuarterlyData, 'y': stk.YearlyData } result = [] kdata = bars.get(cycle) max = kdata.Count offset = 0 if not inc_last: offset = -1 # print max - limit + offset, max + offset for num in range(max - limit + offset, max + offset): # 不包含最后一根 d = kdata[num] bar = stbase.BarData() bar.close = d.Close result.append(bar) # print d.Close return result
def on_bar_triggered(self, stock, cycle, kdata, num): """k线数据触发""" bar = kdata[num] data = stbase.BarData() data.amount = bar.Amount data.open = bar.Open data.high = bar.High data.low = bar.Low data.close = bar.Close data.vol = bar.Vol year,mon,day,hour,min,sec = bar.DateTime[:4],\ bar.DateTime[4:6],\ bar.DateTime[6:8],\ bar.DateTime[8:10],\ bar.DateTime[10:12],\ bar.DateTime[12:14] data.time = datetime.datetime(int(year), int(mon), int(day), int(hour), int(min), int(sec)) data.sys_time = datetime.datetime.now() data.code = stock.code data.trade_object = stock data.cycle = cycle data.num = num # bar的最大流水 self.putData(data)
def getHistoryBars(self, code, cycle, limit, now=None): """ 获取历史k线记录 cycle: k线周期类型 limit: 最大返回记录 now : 当前时间, dataset[now-limit:now] :return: """ kmap = {'5m': '5', '15m': '15', '30m': '30', '60m': '60', 'd': 'D'} ktype = kmap.get(cycle) if not ktype: print 'Error: cycle({}) not match in getHistoryBars()'.format( cycle) return [] result = [] # 帅选出 指定时间 now 之前的 limit根 k线 df = self.df[:now] print len(df) for time, close in df.close.to_dict().items(): bar = stbase.BarData() bar.code = self.cfgs.get('code') bar.cycle = ktype bar.time = time bar.close = close result.append(bar) return result
def open(self): """加载历史行情,开始播放""" df = self.df st = self.cfgs.get('play_start') et = self.cfgs.get('play_end') # 过滤回放时间段的记录 df = df[st:et] rows = zip(df.index, df.close) # for time_,close in rows.items(): for _ in rows: time_, close = _ bar = stbase.BarData() bar.code = self.cfgs.get('code') bar.time = parse(time_) bar.close = close if self.cfgs.get('wait_sec'): time.sleep(self.cfgs.get('wait_sec')) if self.market: if self.cfgs.get('async_send'): # 异步发送推入 market的接收队列 self.market.putData(bar) else: # 否则直接调用 行情 处罚处理接口 self.market.onBar(bar) else: print bar.dict()
def open(self): """开始播放""" st = self.cfgs.get('play_start') if not st: st = datetime.datetime.now() st = st.replace(hour=9, minute=20, second=0) else: st = parse(self.cfgs.get('play_start')) et = None if self.cfgs.get('play_end'): et = parse(self.cfgs.get('play_end')) if not et: et = datetime.datetime.now() et = et.replace(hour=15, minute=20, second=0) if self.cfgs.get('ktype'): collname = '{}_{}'.format(self.cfgs.get('code'), self.cfgs.get('ktype')) else: # tick 数据 collname = self.cfgs.get('code') coll = self.db[collname] rs = coll.find({'time': {'$gte': st, '$lte': et}}).sort('time', 1) rs = list(rs) if self.onStart: self.onStart() # rs.append({}) for r in rs: if self.cfgs.get('ktype'): data = stbase.BarData() else: data = stbase.TickData() # object_assign(data,r) data.assign(r) # if not data.code: # print data if self.cfgs.get('wait_sec'): time.sleep(self.cfgs.get('wait_sec')) if self.market: if self.cfgs.get('async_send'): self.market.putData(data) else: if self.cfgs.get('ktype'): self.market.onBar(data) else: self.market.onTick(data) else: print data.dict() if self.onEnd: self.onEnd()