【AIOQuant量化交易框架】第9期 服务心跳 & 协程任务

您所在的位置:网站首页 aioquant下载 【AIOQuant量化交易框架】第9期 服务心跳 & 协程任务

【AIOQuant量化交易框架】第9期 服务心跳 & 协程任务

#【AIOQuant量化交易框架】第9期 服务心跳 & 协程任务| 来源: 网络整理| 查看: 265

AIOQuant 量化交易框架在底层SDK里提供了丰富的功能,其中就包括心跳和协程任务,这些基础功能支撑起了 AIOQuant 交易系统的单进程和多进程的任务调度。

1.服务心跳 我们赋予了程序生命,在它的生命周期里,将会持续不断的、每秒钟执行一次心跳任务,当我们把程序作为守护进程运行在操作系统后台任务里之后,我们的程序依然持续在发光发热,等待着自己的使命,同时用心跳标志着它的存活。

服务心跳的意义非常重大:

标志着程序是否还存活; 广播心跳包,作为分布式协作的基石; 支持协程任务的注册与执行; 在系统配置里,我们可以配置服务心跳的打印时间间隔:

{ "HEARTBEAT": { "interval": 1 } }

配置文件里的 HEARTBEAT 即为系统心跳配置,其中的 interval 可以指定心跳日志的打印时间间隔,单位是秒(s),如果设置为0就代表不打印,系统默认值为0。

在分布式交易系统中,进程服务可以往外广播心跳包,分布式管理服务器可以集中收集所有服务的心跳信息,以此来判断和管理分布式集群服务。

2.协程任务 AIOQuant量化交易框架底层SDK封装了操作系统的 aio*库实现异步事件循环,业务层封装了 RabbitMQ 消息队列实现异步事件驱动。除了程序在执行 quant.start 作为主线程启动之外,几乎所有的操作(对象、函数等)全部是运行在协程调度之中,这也正是 AIOQuant 量化交易框架与其它量化交易框架的不同之处,主要体现在程序运行效率上。

底层SDK主要提供了以下协程任务的调度:

循环任务的注册和取消; 创建一个协程并分配一个任务,立即执行; 创建一个协程并分配一个任务,延迟执行; 2.1 循环任务

在之前的章节中,我们在循环拉取交易所订单薄行情的时候,已经给大家简单介绍过循环任务的使用方法。

首先我们引入任务模块:

from aioquant.tasks import LoopRunTask

LoopRunTask 可以注册和取消一个循环任务,如果注册了循环任务后,底层异步事件循环将按照注册时指定的循环时间间隔来执行注册函数的回调,回调函数必须是 async 异步函数,并且函数入参必须包含可变参数 *args 和 **kwargs。

假设我们需要每隔3秒执行一次打印日志的任务:

async def do_something_per_3s(self, *args, **kwargs): logger.info("I'm Here ...", caller=self)

我们在初始化函数的时候,注册任务:

def __init__(self): LoopRunTask.register(self.do_something_per_3s, 3)

这样我们就注册了一个循环任务,程序启动之后,会每隔3秒回调执行一次 self.do_something_per_3s 函数,函数只是简单打印日志 I’m Here …。

既然支持可变参数,那我们就可以给回调函数 self.do_something_per_3s 传入任意的入参:

def __init__(self): LoopRunTask.register(self.do_something_per_3s, 3, "AIOQuant !!!") async def do_something_per_3s(self, text, *args, **kwargs): logger.info("I'm Here ...:", text, caller=self)

这里我们给回调函数传入了参数 “AIOQuant !!!”,回调函数打印的日志里将会把收到的参数打印出来。

循环任务的扩展空间特别大,可以根据业务需求来定制,比如每隔1小时计算一次收益报表并将信息推送至手机上。

2.2 协程任务

我们可以在程序的任何地方创建一个协程任务,并可以设置协程任务是否立即执行或延迟执行。这个功能超级强大,比如我们在某种条件下,需要立即创建100个委托单,如果使用for循环来下单,那么最后等待着100个委托单都成功提交之后,行情已经过去了,滑点非常大。在这种情况下,我们可以一次性创建100个协程任务,并且让它立即执行,这100个委托单可以并发一次提交,而不必像for循环那么轮流提交,效率明显提升很多。

我们首先引入协程任务模块:

from aioquant.tasks import SingleTask

假设我们需要在某个逻辑里同时创建2个订单:

async def do_somethings(self): ... SingleTask.run(self.create_order, price, qiantity) # 协程调度 SingleTask.run(self.create_order, price, qiantity) # 协程调度 ... async def create_order(self, *args, **kwargs): ... trade.creaet_order ... ...

这样我们就可以几乎在同时提交两个委托单,代码虽然是2行,但在底层是并发执行的。

另外,我们在创建协程任务的时候,也可以延迟执行,比如在当前逻辑里我希望做一个事情,但我又不想立马做,传统方式是使用 sleep 函数,但这种做法是非常低效的。

这里我们的 SingleTask.call_later 就可以提供延迟执行某个函数:

async def do_somethings(self): ... SingleTask.call_later(self.create_order, 2, price, qiantity) # 协程调度 SingleTask.call_later(self.create_order, 2, price, qiantity) # 协程调度 ... async def create_order(self, *args, **kwargs): ... trade.creaet_order ... ...

以上逻辑里,我们延迟2秒执行提交委托单。

3.总结 本文主要介绍了 AIOQuant 量化交易框架的心跳服务和协程任务,底层SDK提供的使用方法非常简单,但功能超级强大,可以实现我们策略逻辑非常复杂的业务功能,那就是发挥大家想象力的时候了。

对AIOQuant量化框架感兴趣的小伙伴,可以百度“交子矩阵”官网查看相关介绍



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3