重要概念
Bar的概念我们把单根K线称之为Bar,每根Bar由tick组成。
分钟Bar示例QMT系统的模型是根据行情驱动,逐K线运行,每根K线调用一次Python模型中的handlebar函数。
根据选择的运行周期不同,handlebar函数的运行次数也不同。如选择在日线上运行策略,则handlebar函数每天被调用一次。
Initinit是一个Python模型的初始化方法。在模型加载的时候,系统会调用init方法,做一些必要的初始化,比如初始化股票池、初始化资金账号、初始化全局变量等。如果用户的模型无需做初始化,可以在方法体中写pass,但方法的定义必须存在,否则模型的运行会报错。
Init初始化
Handlebarhandlebar是整个Python模型中的核心执行函数。当模型从数据层获取到运行所需要的数据之后,会对数据集上的每一根bar,调用一次handlebar函数,处理当前这根bar上的数据。也就是说,用户模型的核心逻辑都是写在该函数中的,如获取数据,设置下单条件等。在handlebar中处理完数据后,用户可以通过paint方法将需要绘输出的结果返回给界面。界面会将输出结果如实的展示出来。
ContextInfoContextInfo是整个Python框架中的一个核心对象。它包含了各种与Python底层框架交互的API方法,也是一个全局的上下文环境,可以在init以及handlebar这两个函数中自由地传递用户创建的各种自定义数据。
Python策略运行机制
用户在界面上提交请求后,在最终看到结果前会经历两步:创建模型,初始化环境,发送数据请求;
数据到达后,调用Python的init函数进行Python初始化,然后运行handlebar方法;ContextInfo是Python模型中的全局对象,其中封装了benchmark,universe等变量,也封装了get_history_data等重要函数,是init与handlebar之间,以及各个handlebar之间进行信息传递的重要载体。用户也可以在其中封装自己想要定义的全局变量或函数,但注意不要与原有的重名。
init和handlebar是Python模型中最重要的方法,也是唯二由C++直接调用的方法,所有的执行代码都尽量写在这两个方法中或由其中的函数调用。init是Python的初始化方法,负责初始化模型运行所需的初始变量,如对于基准benchmark和股票池universe的初始化。handlebar是Python的核心执行函数。在K线上运行时会根据主的时间轴,每个时间点会进入相应的handlebar方法,可在handlebar中使用ContextInfo.barpos来获取当前的bar索引位置。
获取当前Bar位置
交易函数运行机制
QMT系统模型是根据行情驱动,逐K线运行的。即点击运行模型时,模型是从第0根K线开始运行到最后一根K线,每根K线调用一次Python模型中的handlebar函数
在盘中,最后一根K线每变动一次,handlebar函数被执行一次。这根K线的最后一个tick判定模型信号是否成立,如果模型信号成立,交易函数被调用,则在下一根K线的第一个tick发出下单信号,生成下单任务
如上,当盘中运行到最后一根K线的时候,每个tick数据来时都会判定一下这个条件是否成立,当不是这根K线的最后一个tick,之前的所有的tick成立的产生的信号就是虚的信号。只有当这个K线确定时,产生的信号才是有效信号,才会触发下单。模型运行在日K线周期及日K线以上周期时,因为是在下一根K线的第一个tick发出下单信号,而下一个K线就是第二日了。所以模型运行当日无法下单,除非:设置passorder函数中的quickTrade参数为立即下单;使用do_order函数。quickTrade参数设置为1可实现最后一根K线没有走完生成的模型信号也发出下单信号。do_order函数被调用后会把上一根K线生成的模型信号立刻发出,且只发一次,解决交易函数必须是在下一根K线的第一个tick数据时发信号的问题。
文章为作者独立观点,不代表股票交易接口观点