如何设计完整的量化开发框架系统

量化框架系统介绍

App与Context

Context是所有框架的运行环境对象,提供了运行时需要的一些基本支持,如:

  • 主线程执行引擎对象MainEventEngine
  • 程序目录路径,创建该程序目录路径下的子目录等。
  • 日志输出

App实现了Context,App的运行实体,并集成了一些框架的管理类,如RunnerManager

app = App(".")
start = datetime(year=2021, month=1, day=2, hour=14)
app.run_backtest(start)     #回测执行
app.engine.go(3600*24*10)   #回测执行时间10天

主线程引擎

MainEventEngine是主线程引擎对象,主线程操作有三种,即Post事件,post方法,post定时。而主线程执行操作是由MainEventEngine引擎实现的,context只是对其方法的一个封装。

post类型Context方法MainEventEngine方法
post事件post()、
post_delay()
、post_at()
postDelay()
post方法post_event()post_event()
post定时post_timer()postTimer()
1) post event

以监听主线程引擎的天数变化事件MainEventEngine.EVNET_DAY_CHANED为例,如下:

  • 1、定义处理event的callble方法:
def onDayChangedEvent(event:str,engine:MainEventEngine):
    print(f"[{engine.now()}]: onDayChanged =>{event}")
    return False  ##表示后面不再接受该event
注意:callble方法返回false时,表示后面不再接受该event事件,就等于注销callble处理该event事件。
  • 2、注册和注销callbale方法:
engine.register(MainEventEngine.EVNET_DAY_CHANED,onDayChangedEvent)
engine.unregister(MainEventEngine.EVNET_DAY_CHANED,onDayChangedEvent)
  • 3、系统Event事件汇总
eventdata说明
MainEventEngine.EVNET_DAY_CHANEDengine天数变化
MainEventEngine.EVNET_STARTengine主线程开始执行
MainEventEngine.EVNET_ENDengine主线程正常结束执行
MainEventEngine.EVNET_EXCEPTIONexception主引擎运行异常结束执行
2) post callable

post操作有三种方式,post、post_delay、post_at

app = App()
app.run()
def run_in_ui_thread(context:Context):
    app.log_i("run_in_ui_thread() start!") 
app.post(lambda : run_in_ui_thread(app))  ##马上提交到主线程执行
app.post_delay(10,lambda : run_in_ui_thread(app)) ##延迟提交到主线程执行
app.post_at("14:55:30",lambda : run_in_ui_thread(app)) ##指定今天时间提交到主线程执行

或者:
app.post(run_in_ui_thread,{'context':app}) ##马上提交到主线程执行
app.post_delay(10,run_in_ui_thread,{'context':app}) ##延迟提交到主线程执行
app.post_at("14:55:30",run_in_ui_thread,{'context':app} ##指定今天时间提交到主线程执行

3) post timer 定时
count = 0
def do_3_time():
    global count
    count+=1
    return count <3
job = context.post_timer(10,do_3_time)

定时每隔10s执行do_3_time(),只执行三次do_3_time函数,超过三次do_3_time()函数将返回False,表示取消定时操作。

另外一种方式是通过返回的job对象的cancel方法取消。

job.cancel()

配置信息存储:ContextStorage

storage = context.getStorage()

  • global_data(): 全局数据
  • daily_data(): 每日数据
  • clear_data(): 清空所有数据。

TaskManager 后台线程任务处理。

  • run_in_thread() 执行后台匿名任务

提交一个匿名线程在后台执行。调用该操作无法或者后台线程处理状态和结果。


    def hard_work(seconds):
        print(f"hard_work begin!")
        sleep(seconds)
        print(f"hard_work finish!")

    task_manager.run_in_thread(hard_work,(3))

  • run_task() 执行后台任务

提交一个任务在后台执行。可以获取执行状态,如:运行、停止、错误,并且可以停止任务的执行。


   task_manager = app.getTaskManager()
   task_manager.register_task(TaskDemo("taskDemo01",3,False))    
   task_manager.run_task("taskDemo01")

RunnerManager 计划任务处理

  • Runner 是一个计划任务运行对象,是根据时间点来驱动运行的,比如实盘运行程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值