diff --git a/easyquant/main_engine.py b/easyquant/main_engine.py index 59a0bc0..e983a54 100644 --- a/easyquant/main_engine.py +++ b/easyquant/main_engine.py @@ -26,7 +26,7 @@ class MainEngine: """主引擎,负责行情 / 事件驱动引擎 / 交易""" def __init__(self, broker=None, need_data=None, quotation_engines=None, - log_handler=DefaultLogHandler(), now=None, tzinfo=None): + log_handler=DefaultLogHandler(), tzinfo=None): """初始化事件 / 行情 引擎并启动事件引擎 """ self.log = log_handler @@ -46,7 +46,7 @@ def __init__(self, broker=None, need_data=None, quotation_engines=None, self.log.info('选择了无交易模式') self.event_engine = EventEngine() - self.clock_engine = ClockEngine(self.event_engine, now, tzinfo) + self.clock_engine = ClockEngine(self.event_engine, tzinfo) quotation_engines = quotation_engines or [DefaultQuotationEngine] diff --git a/easyquant/push_engine/clock_engine.py b/easyquant/push_engine/clock_engine.py index 5b8a96c..d64b89b 100644 --- a/easyquant/push_engine/clock_engine.py +++ b/easyquant/push_engine/clock_engine.py @@ -101,7 +101,7 @@ class ClockEngine: """ EventType = 'clock_tick' - def __init__(self, event_engine, now=None, tzinfo=None): + def __init__(self, event_engine, tzinfo=None): """ :param event_engine: :param event_engine: tzinfo @@ -109,9 +109,7 @@ def __init__(self, event_engine, now=None, tzinfo=None): """ # 默认使用当地时间的时区 self.tzinfo = tzinfo or tz.tzlocal() - # 引擎启动的时间,默认为当前.测试时可手动设置模拟各个时间段. - self.time_delta = self._delta(now) - # self.start_time = self.now_dt.replace(hour=0, minute=0, second=0, microsecond=0) + self.event_engine = event_engine self.is_active = True self.clock_engine_thread = Thread(target=self.clocktick) @@ -150,15 +148,15 @@ def close(): for interval in (0.5, 1, 5, 15, 30, 60): self.register_interval(interval) - def _delta(self, now): - if now is None: - return 0 - if now.tzinfo is None: - now = arrow.get(datetime.datetime( - now.year, now.month, now.day, now.hour, now.minute, now.second, now.microsecond, self.tzinfo, - )) - - return (arrow.now() - now).total_seconds() + # def _delta(self, now): + # if now is None: + # return 0 + # if now.tzinfo is None: + # now = arrow.get(datetime.datetime( + # now.year, now.month, now.day, now.hour, now.minute, now.second, now.microsecond, self.tzinfo, + # )) + # + # return (arrow.now() - now).total_seconds() @property def now(self): @@ -166,7 +164,7 @@ def now(self): now 时间戳统一接口 :return: """ - return time.time() - self.time_delta + return time.time() @property def now_dt(self): @@ -175,13 +173,13 @@ def now_dt(self): """ return arrow.get(self.now).to(self.tzinfo) - def reset_now(self, now=None): - """ - 调试用接口,请勿在生产环境使用 - :param now: - :return: - """ - self.time_delta = self._delta(now) + # def reset_now(self, now=None): + # """ + # 调试用接口,请勿在生产环境使用 + # :param now: + # :return: + # """ + # self.time_delta = self._delta(now) def start(self): self.clock_engine_thread.start() diff --git a/unitest_demo.py b/unitest_demo.py index 51eb426..3e3363b 100644 --- a/unitest_demo.py +++ b/unitest_demo.py @@ -4,9 +4,11 @@ """ import time import unittest +from unittest import mock import datetime import pandas as pd from easyquant.easydealutils.time import get_next_trade_date, is_trade_date +import arrow from dateutil import tz from easyquant.main_engine import MainEngine @@ -57,7 +59,7 @@ def setUp(self): now = datetime.datetime.combine(self.trade_date, self.time) # 此处重新定义 main_engine - self._main_engine = MainEngine('ht', now=now) + self._main_engine = MainEngine('ht', 'tmp/ht.json') # 设置为不在交易中 self.clock_engine.trading_state = False @@ -86,41 +88,24 @@ def tearDown(self): def test_set_now(self): """ 重设 clock_engine 的时间 + 通过 mock 来重设时间戳 + mock 只能重设 time.time 函数的时间戳,但是不能重设 datetime.datetime.now 函数的时间戳,详情见: + http://stackoverflow.com/questions/4481954/python-trying-to-mock-datetime-date-today-but-not-working :return: """ - tzinfo = tz.tzlocal() - now = datetime.datetime.combine( - self.trade_date, - datetime.time(8, 59, 00, tzinfo=tzinfo), - ) - clock_engien = ClockEngine(EventEngine(), now, tzinfo) - - # 去掉微秒误差后比较 - self.assertEqual(clock_engien.now_dt.replace(microsecond=0), now) - - def test_reset_now(self): - """ - 重设时钟引擎当前时间为其他时间点 - :return: - """ - tzinfo = tz.tzlocal() - clock_engien = ClockEngine(EventEngine()) - now = datetime.datetime.combine( - self.trade_date, - datetime.time(8, 59, 00, tzinfo=tzinfo), - ) - clock_engien.reset_now(now) + # 使用datetime 类构建时间戳,转化为浮点数时间戳 + now = datetime.datetime(1990, 10, 16, 19, 27, 16) - # 去掉微秒误差后比较 - self.assertEqual(clock_engien.now_dt.replace(microsecond=0), now) + # 通过mock ,将 time.time() 函数的返回值重设为上面的打算模拟的值 + time.time = mock.Mock(return_value=now) - # 重设为当前时间 - clock_engien.reset_now() - now = datetime.datetime.now(tzinfo).replace(microsecond=0) + # 生成一个时钟引擎 + clock_engien = ClockEngine(EventEngine(), tzinfo) - # 去掉微秒误差后比较 - self.assertEqual(clock_engien.now_dt.replace(microsecond=0), now) + # 去掉微秒误差后验证其数值 + self.assertEqual(clock_engien.now, now) # time.time 时间戳 + self.assertEqual(clock_engien.now_dt, arrow.get(now)) # datetime 时间戳 def test_clock_moment_is_active(self): # 设置时间