6.【QMT使用指南】- 系统函数

量化软件 2025-01-13 3559
量化软件:迅投QMT使用指南 6.【QMT使用指南】- 系统函数  第1张
6.【QMT使用指南】- 系统函数  第2张

以下是将HTML转换为Markdown后的输出:

ContextInfo 对象

ContextInfo 是策略运行环境对象,是 initafter_inithandlebar 等基本方法的入参,里面包括了终端自带的属性和方法。一般情况下不建议对 ContextInfo 添加自定义属性,ContextInfo 会随着 bar 的切换而重置到上一根 bar 的结束状态,建议用自建的全局变量来存储。

init - 初始化函数

初始化函数,只在整个策略开始时调用运行一次。用于初始订阅行情,订阅账号信息使用。init 函数执行完成前部分接口无法使用,如交易日获取函数 get_trading_dates

系统函数 不可被手动调用

参数:

名称 类型 描述
ContextInfo object 策略运行环境对象,可以用于存储自定义的全局变量

返回:

示例:

def init(ContextInfo):    ContextInfo.initProfit = 0

init 函数中订阅行情示例:

#coding:gbkdef init(C):    # init函数入参为ContextInfo对象 定义时可以选择更简短的形参名 如C    # 在init函数中 可以进行 订阅行情的操作    # 如需在行情回调函数中下单 下单函数需要传入ContextInfo对象 可以通过在init中定义回调函数 来使用外层的ContextInfo    def my_callback_function(data):        # 自定义行情回调函数 入参为指数据字典        print(data)    stock = '600000.SH'    C.subscribe_quote(stock, period='5m', callback=my_callback_function)    # init函数执行完成后    print('init函数执行完成')

after_init - 初始化后函数

后初始化函数,在初始化函数执行完成后被调用一次。可以用于放置一次性触发的下单,取数据操作代码。

系统会在 init 函数执行完后和执行 handlebar 之前调用 after_init,有些 init 里不支持的函数比如 ContextInfo.get_trading_dates 可以在 after_init 里调用。

系统函数 不可被手动调用

参数:

名称 类型 描述
ContextInfo object 策略运行环境对象,可以用于存储自定义的全局变量

返回:

示例:

#coding:gbkdef init(ContextInfo):    print('init')def after_init(ContextInfo):    print('系统会在init函数执行完后和执行handlebar之前调用after_init')def handlebar(ContextInfo):    if ContextInfo.is_last_bar():        print('handlebar')

after_init 函数中立刻下单示例:

#coding:gbkdef after_init(C):    # after_init 函数 可以用于执行运行开始时 需要执行一次的代码 例如下一笔委托    # account变量是模型交易界面 添加策略时选择的资金账号 不需要手动填写 交易模型需要在模型交易界面运行 才有效    # 快速交易参数(quickTrade )填2 passorder函数执行后立刻下单 不会等待k线走完再委托。 可以在after_init函数 run_time函数注册的回调函数里进行委托    msg = f"投资备注字符串 用来区分不同委托"    passorder(23, 1101, account, '600000.SH', 5, -1, 100, '测试下单', 2, msg, C)

handlebar - 行情事件函数

系统函数 不可被手动调用

释义: 行情事件函数,每根 K 线运行一次;实时行情获取状态下,先每根历史 K 线运行一次,再在每个 tick 数据来后驱动运行一次。

历史 k 线上,按时间顺序每根 K 线触发一次调用;盘中,每个新到达的 TICK 数据驱动运行一次。可以作为行情驱动的函数,实现指标计算,回测,实盘下单的效果。

参数:

名称 类型 描述
ContextInfo object 策略运行环境对象,可以用于存储自定义的全局变量

返回:

示例:

def handlebar(ContextInfo):    # 输出当前运行到的 K 线的位置    print(ContextInfo.barpos)

ContextInfo.schedule_run - 设置定时器

说明:

  • 该函数是新版设置定时器函数,相比旧版 run_time,新版 schedule_run 新增了任务分组、任务取消等多种功能。

原型:

ContextInfo.schedule_run(    func:Callable,  # 回调函数,到达定时器预定时间时触发调用,参数为ContextInfo类型,无需返回值    time_point:Union[dt.datetime,str],  # 表示预定的第一次触发时间,如果设置定时器时已经过了预定时间,会立即执行func以及后续逻辑;当使用str类型时,格式为'yyyymmddHHMMSS'如'20231231235959',需要满足转换dt.datetime.strptime('20231231235959','%Y%m%d%H%M%S')    repeat_times:int=0,  # 表示在预定时间触发后按interval间隔再触发多少次    interval:datetime.timedelta=None,  # 表示预定时间触发后的后续重复执行的时间间隔    name:str=''  # 定时器任务组名,可用于定时器分组,多次设置同名定时任务不会互相覆盖,会计入同一个任务组,按任务组名取消时会全部取消)

参数:

名称 类型 描述
func Callable 回调函数,到达定时器预定时间时触发调用,参数为 ContextInfo 类型,无需返回值,定义示例如下:<br> def on_timer(C:ContextInfo): pass
time_point Union[datetime.datetime,str] 表示预定的第一次触发时间,如果设置定时器时已经过了预定时间,会立即执行 func 以及后续逻辑;<br> 当使用 str 类型时,格式为 yyyymmddHHMMSS20231231235959,需要满足转换 datetime.datetime.strptime('20231231235959','%Y%m%d%H%M%S')
repeat_times int 表示在预定时间触发后按 interval 间隔再触发多少次,传 -1 表示不限制次数
interval datetime.timedelta 表示预定时间触发后的后续重复执行的时间间隔
name str 定时器任务组名,可用于定时器分组,多次设置同名定时任务不会互相覆盖,会计入同一个任务组,按任务组名取消时会全部取消

回调函数参数: ContextInfo:策略模型全局对象

返回值:

int 类型,表示本次调用后生成的定时任务号,可用于取消本次定时任务,全局唯一不重复

示例:

import datetime as dtdef on_timer(C:ContextInfo):    print('hello world')def init(ContextInfo):    tid = ContextInfo.schedule_run(on_timer, '20231231235959', -1, dt.timedelta(minutes=1), 'my_timer')def handlebar(ContextInfo):    pass# 此例为自2023-12-31 23:59:59后每60s运行一次on_timer

ContextInfo.cancel_schedule_run - 取消由 schedule_run 产生的定时任务

原型:

ContextInfo.cancel_schedule_run(    key:Union[seq:int,name:str]  # 定时任务号或定时任务组名称)

参数:

名称 类型 描述
key Union[seq:int,name:str] 类型为 int 时,表示按任务号取消;类型为 str 时,表示按任务组取消,会取消组内所有定时任务

返回值:

bool 类型,表示是否取消成功,即是否能按 key 找到目标定时任务

示例:

ContextInfo.cancel_schedule_run('my_timer')  # 取消 my_timer 任务组所有定时任务ContextInfo.cancel_schedule_run(1)  # 取消任务号为1的定时任务

ContextInfo.run_time - 设置定时器

设置定时器函数,可以指定时间间隔,定时触发用户定义的回调函数。适用于在盘中,持续判断交易信号的模型。

用法: ContextInfo.run_time(funcName,period,startTime) 定时触发指定的 funcName 函数,funcName 函数由用户定义,入参为 ContextInfo 对象。

参数:

  • funcName:回调函数名

  • period:重复调用的时间间隔,'5nSecond' 表示每 5 秒运行 1 次回调函数,'5nDay' 表示每 5 天运行一次回调函数,'500nMilliSecond' 表示每 500 毫秒运行 1 次回调函数

  • startTime:表示定时器第一次启动的时间,如果要定时器立刻启动,可以设置历史的时间

回调函数参数: ContextInfo:策略模型全局对象

示例:

import timedef init(ContextInfo):    ContextInfo.run_time('f','5nSecond','2019-10-14 13:20:00')def f(ContextInfo):    print('hello world')# 此例为自2019-10-14 13:20:00后每5s运行一次函数f

注意:

  1. 模型回测时无效

  2. 定时器没有结束方法,会随着策略的结束而结束。

  3. periodnMilliSecondnSecondDay 三个周期单元,部分周期下定时器函数在第一次运行之前会先等待一个 period

stop - 停止处理函数

系统函数 不可被手动调用

释义: PY 策略模型关闭停止前运行到的函数,复杂策略模型,如中间有起线程可通过在该函数内实现停止线程操作。注意,当前版本 stop 函数被调用时交易连接已断开,不能在 stop 函数中做报单 / 撤单操作。

参数:

名称 类型 描述
ContextInfo object 策略运行环境对象,可以用于存储自定义的全局变量

示例:

def stop(ContextInfo):    print('strategy is stop !')

ContextInfo.is_last_bar - 是否为最后一根 K 线

用法: ContextInfo.is_last_bar()

释义: 判定是否为最后一根 K 线

参数:

返回: bool,返回值含义:

  • True:是右侧最新 k 线

  • False:不是最新 k 线

示例:

def handlebar(ContextInfo):    print(ContextInfo.is_last_bar())

结果:

FalseFalse...FalseTrue

ContextInfo.is_new_bar - 判定是否为新的 K 线

用法: ContextInfo.is_new_bar()

释义: 某根 K 线的第一个 tick 数据到来时,判定该 K 线为新的 K 线,其后的 tick 不会认为是新的 K 线

参数:

返回: bool,返回值含义:

  • True:是

  • False:否

示例:

def handlebar(ContextInfo):    print(ContextInfo.is_new_bar())  # 历史 k 线每根都是新 k 线 盘中 每根新 k 线第一个分笔返回 True 其他分笔返回 False

结果:

TrueTrue...TrueFalse

ContextInfo.get_stock_name - 根据代码获取名称

注意: 我们计划后续版本抛弃这个函数,不建议继续使用,可以用 ContextInfo.get_instrument_detAIl("stockcode")["InstrumentName"] 来实现同样功能。

用法: ContextInfo.get_stock_name('stockcode')

释义: 根据代码获取名称

参数: stockcode:股票代码,如 '000001.SZ',缺省值 ' ' 默认为当前图代码

返回: string(GBK 编码)

示例:

def handlebar(ContextInfo):    print(ContextInfo.get_stock_name('000001.SZ'))

返回值:

平安银行

ContextInfo.get_open_date - 根据代码返回对应股票的上市时间

用法: ContextInfo.get_open_date('stockcode')

释义: 根据代码返回对应股票的上市时间

参数: stockcode:股票代码,如 '000001.SZ',缺省值 ' ' 默认为当前图代码

返回: number

示例:

def init(ContextInfo):    print(ContextInfo.get_open_date('000001.SZ'))

返回值:

19910403

ContextInfo.set_output_index_property - 设定指标绘制的属性

用法: ContextInfo.set_output_index_property(index_name,draw_style=0,color='white',noaxis=False,nodraw=False,noshow=False)

释义: 设定指标绘制的属性,会最终覆盖掉指标对应的属性字段

参数:

  • index_namestring,指标名称,不可缺省

  • draw_style:同 paint 函数的 drawstyle,可缺省,默认为 0

  • color:同 paint 函数的 color,可缺省,默认为 'white'

  • noaxisbool,是否无坐标,可缺省,默认为 False

  • nodrawbool,是否不画线,可缺省,默认为 False

  • noshowbool,是否不展示,可缺省,默认为 False

返回:

示例:

def init(ContextInfo):    ContextInfo.set_output_index_property('单位净值', nodraw=True)  # 使回测指标'单位净值'不画线

create_sector - 创建板块

用法: create_sector(parent_node,sector_name,overwrite)

释义: 创建板块

参数:

  • parent_nodestr,父节点,'''我的'(默认目录)

  • sector_namestr,要创建的板块名

  • overwritebool,是否覆盖。如果目标节点已存在,为 True 时跳过,为 False 时在 sector_name 后增加数字编号,编号为从 1 开始自增的第一个不重复的值。

返回: sector_name2:实际创建的板块名

示例:

sector = create_sector('我的', '新建板块', False)

返回值:

新建板块

create_sector_folder - 创建板块目录节点

用法: create_sector_folder(parent_node,folder_name,overwrite)

释义: 创建板块目录节点

参数:

  • parent_nodestr,父节点,'''我的'(默认目录)

  • folder_namestr,要创建的节点名

  • overwritebool,是否覆盖。如果目标节点已存在,为 True 时跳过,为 False 时在 folder_name 后增加数字编号,编号为从 1 开始自增的第一个不重复的值。

返回: folder_name2:实际创建的节点名

示例:

folder = create_sector_folder('我的', '新建分类', False)

返回值:

新建分类

get_sector_list - 获取板块目录信息

用法: get_sector_list(node)

释义: 获取板块目录信息

参数:

  • nodestr,板块节点名,'' 为顶层目录

返回: info_list[[s1,s2,...],[f1,f2,...]]s 为板块名,f 为目录节点名,例如 [['我的自选'],['新建分类1']]

示例:

get_sector_list('我的')

返回值:

[['我的自选', '龙头', '卖出篮子', 'TMP', '震荡', '待分析'], []]

reset_sector_stock_list - 设置板块成分股

用法: reset_sector_stock_list(sector,stock_list)

释义: 设置板块成分股

参数:

  • sector:板块名

  • stock_listlist,品种代码列表,例如 ['000001.SZ','600000.SH']

返回: resultbool,操作成功为 True,失败为 False

示例:

reset_sector_stock_list('我的自选', ['000001.SZ', '600000.SH'])

返回值:

True / False

remove_stock_from_sector - 移除板块成分股

用法: remove_stock_from_sector(sector,stock_code)

释义: 移除板块成分股

参数:

  • sector:板块名

  • stock_code:品种代码,例如 '000001.SZ'

返回: resultbool,操作成功为 True,失败为 False

示例:

remove_stock_from_sector('我的自选', '000001.SZ')

返回值:

True / False

add_stock_to_sector - 添加板块成分股

用法: add_stock_to_sector(sector,stock_code)

释义: 添加板块成分股

参数:

  • sector:板块名

  • stock_code:品种代码,例如 '000001.SZ'

返回: resultbool,操作成功为 True,失败为 False

示例:

add_stock_to_sector('我的自选', '000001.SZ')
名词“短线资产管理”的核心概念及实际意义
« 上一篇 2025-01-12
Python自动化炒股:使用FastAPI和Kubernetes部署股票数据服务的详细指南
下一篇 » 2025-01-13