实现功能:
将tick数据转化为分钟K线数据,并更新推送。另外提供了最新分钟K线的实时数据。
以下是完整的类。
不知道怎么用,或者需要完整可用代码的可以找我咨询。
"""
作者:Leo
微信:470770753
"""
########################################################################
class BarManager(object):
"""
K线合成器,支持:
1. 基于Tick合成1分钟K线
"""
# ----------------------------------------------------------------------
def __init__(self, onBar):
"""Constructor"""
self.bar = None # 1分钟K线对象
self.onBar = onBar # 1分钟K线回调函数
self.lastTick = None # 上一TICK缓存对象
self._lastopen=None
self._lasthigh=None
self._lastlow=None
self._lastclose=None
# ----------------------------------------------------------------------
def updateTick(self, tick):
"""TICK更新"""
newMinute = False # 默认不是新的一分钟
# 判断类型
if type(tick.datetime) is str:
tick.datetime = datetime.datetime.strptime(tick.datetime, "%Y-%m-%d %H:%M:%S")
if self.bar and hasattr(self.bar, "datetime") and (type(self.bar) is str):
self.bar.datetime = datetime.datetime.strptime(self.bar.datetime, "%Y-%m-%d %H:%M:%S")
if not self.bar: # 尚未创建对象
self.bar = VtBarData()
newMinute = True
elif self.bar.datetime.minute != tick.datetime.minute: # 新的一分钟
# 生成上一分钟K线的时间戳
self.bar.datetime = tick.datetime
self.bar.datetime = self.bar.datetime.replace(second=0, microsecond=0) # 将秒和微秒设为0
self.bar.date = self.bar.datetime.strftime('%Y%m%d')
self.bar.time = self.bar.datetime.strftime('%H:%M:%S.%f')
# 推送已经结束的上一分钟K线
self.onBar(self.bar)
# 创建新的K线对象
self.bar = VtBarData()
newMinute = True
# 初始化新一分钟的K线数据
if newMinute:
self.bar.vtSymbol = tick.vtSymbol
self.bar.symbol = tick.symbol
self.bar.exchange = tick.exchange
self.bar.open = tick.lastPrice
self.bar.high = tick.lastPrice
self.bar.low = tick.lastPrice
self._lastopen=self._lasthigh=self._lastlow=self._lastclose=tick.lastPrice
# 累加更新老一分钟的K线数据
else:
self.bar.high = max(self.bar.high, tick.lastPrice)
self._lasthigh=self.bar.high
self.bar.low = min(self.bar.low, tick.lastPrice)
self._lastlow=self.bar.low
# 通用更新部分
self.bar.close = tick.lastPrice
self._lastclose=tick.lastPrice
self.bar.datetime = tick.datetime
self.bar.openInterest = tick.openInterest
if self.lastTick:
self.bar.volume += (tick.volume - self.lastTick.volume) # 当前K线内的成交量
# 缓存Tick
self.lastTick = tick
# ----------------------------------------------------------------------
@property
def lastopen(self):
return self._lastopen
@property
def lasthigh(self):
return self._lasthigh
@property
def lastlow(self):
return self._lastlow
@property
def lastclose(self):
return self._lastclose