def __init__(self, process, finish=None, maxsize=500, parent=None): """ Parameters ---------- config: BfConfig对象 process: 每个数据bar事件来时的回调方法 finish: 数据结束的回调方法 maxsize: 缓存大小,默认500 """ LoggerInterface.__init__(self, parent=parent) ConfigInterface.__init__(self, parent=parent) self.__check_tf(self.config.time_frame) self.__maxsize = maxsize self.__dq = Queue(maxsize=maxsize * 2) # 数据缓存器,避免数据在内存里过大,造成内存不足的错误 self.__receiver = TickDataReceiver(parent=self) self.__receiver.register_event(self.config.symbols[0], self.product) self.__symbol = self.config.symbols[0] self.__handle = process # 行情数据监听函数(可以想象成java的interface) self.__finish = finish # 数据结束函数 self._finished = False self.logger_name = "TickDataGenerator"
def __init__(self, config, process, finish=None, maxsize=500): """ Parameters ---------- config: BfConfig对象 process: 每个数据bar事件来时的回调方法 finish: 数据结束的回调方法 maxsize: 缓存大小,默认500 """ # assert isinstance(config, Config) self.__check_tf(config.time_frame) self.__maxsize = maxsize self.__dq = Queue(maxsize=maxsize * 2) # 数据缓存器,避免数据在内存里过大,造成内存不足的错误 self.__config = config self.__receiver = TickDataReceiver() self.__receiver.register_event(config.symbols[0], self.product) self.__symbol = config.symbols[0] self.__handle = process # 行情数据监听函数(可以想象成java的interface) self.__finish = finish # 数据结束函数 self._finished = False
class TickDataGenerator(LoggerInterface, ConfigInterface): """ 这个对象包括两个线程,一个生产者,一段一段的不断从数据库中查询记录,并存入缓存队列. 另一个消费者,不断的从缓存队列中取数据,这样做的好处是避免一次回测的数据太多占用太多的内存 基本使用: dg = DataGenerator(config, self.process, self.finished) # 数据生成器 dg.start() """ def __init__(self, process, finish=None, maxsize=500, parent=None): """ Parameters ---------- config: BfConfig对象 process: 每个数据bar事件来时的回调方法 finish: 数据结束的回调方法 maxsize: 缓存大小,默认500 """ LoggerInterface.__init__(self, parent=parent) ConfigInterface.__init__(self, parent=parent) self.__check_tf(self.config.time_frame) self.__maxsize = maxsize self.__dq = Queue(maxsize=maxsize * 2) # 数据缓存器,避免数据在内存里过大,造成内存不足的错误 self.__receiver = TickDataReceiver(parent=self) self.__receiver.register_event(self.config.symbols[0], self.product) self.__symbol = self.config.symbols[0] self.__handle = process # 行情数据监听函数(可以想象成java的interface) self.__finish = finish # 数据结束函数 self._finished = False self.logger_name = "TickDataGenerator" @property def finished(self): return self._finished def empty(self): return self.__dq.empty() def consume(self): """ 从缓存队列中消费数据(生产行情信号) :return: """ try: data = self.__dq.get(timeout=0.5) self.__handle(data) except Empty: pass except: self.logger.error("\n" + traceback.format_exc()) self.stop() def start(self): self._finished = False # 启动生产者 t1 = threading.Thread(target=self.__receiver.start) # t1.setDaemon(True) # 启动消费者 t2 = threading.Thread(target=consume, args=(self,)) # t2.setDaemon(True) t1.start() t2.start() def stop(self): if not self._finished: self._finished = True self.__receiver.stop() def finish(self): if self.__finish is not None: self.__finish() def product(self, tick): if not self._finished: try: self.__dq.put(tick, timeout=0.5) except Full: pass except: self.logger.error("\n" + traceback.format_exc()) self.stop() @classmethod def __check_tf(cls, time_frame): check_time_frame(time_frame)
class TickDataGenerator(LoggerInterface, ConfigInterface): """ 这个对象包括两个线程,一个生产者,一段一段的不断从数据库中查询记录,并存入缓存队列. 另一个消费者,不断的从缓存队列中取数据,这样做的好处是避免一次回测的数据太多占用太多的内存 基本使用: dg = DataGenerator(config, self.process, self.finished) # 数据生成器 dg.start() """ def __init__(self, process, finish=None, maxsize=500, parent=None): """ Parameters ---------- config: BfConfig对象 process: 每个数据bar事件来时的回调方法 finish: 数据结束的回调方法 maxsize: 缓存大小,默认500 """ LoggerInterface.__init__(self, parent=parent) ConfigInterface.__init__(self, parent=parent) self.__check_tf(self.config.time_frame) self.__maxsize = maxsize self.__dq = Queue(maxsize=maxsize * 2) # 数据缓存器,避免数据在内存里过大,造成内存不足的错误 self.__receiver = TickDataReceiver(parent=self) self.__receiver.register_event(self.config.symbols[0], self.product) self.__symbol = self.config.symbols[0] self.__handle = process # 行情数据监听函数(可以想象成java的interface) self.__finish = finish # 数据结束函数 self._finished = False self.logger_name = "TickDataGenerator" @property def finished(self): return self._finished def empty(self): return self.__dq.empty() def consume(self): """ 从缓存队列中消费数据(生产行情信号) :return: """ try: data = self.__dq.get(timeout=0.5) self.__handle(data) except Empty: pass except: self.logger.error("\n" + traceback.format_exc()) self.stop() def start(self): self._finished = False # 启动生产者 t1 = threading.Thread(target=self.__receiver.start) # t1.setDaemon(True) # 启动消费者 t2 = threading.Thread(target=consume, args=(self, )) # t2.setDaemon(True) t1.start() t2.start() def stop(self): if not self._finished: self._finished = True self.__receiver.stop() def finish(self): if self.__finish is not None: self.__finish() def product(self, tick): if not self._finished: try: self.__dq.put(tick, timeout=0.5) except Full: pass except: self.logger.error("\n" + traceback.format_exc()) self.stop() @classmethod def __check_tf(cls, time_frame): check_time_frame(time_frame)