量化软件QMT和ptrade两者均提供历史数据下载、模型编辑、模型回测、模型交易、算法交易及交易风控等完整量化交易功能。
用户可以快速的将自己的转化为计算机代码,形成自己的交易策略,让计算机帮助用户实现策略的回测检验并实现无人值守自动化交易。
ptrade提供一套专有的Python API。风格偏封装、简洁,更接近于一些成熟的量化平台。
QMT支持VBA和python语言,风格更偏向于底层、直接的交易指令。今天我们详细看看QMT重要函数,以及一个完整的策略框架。
今天以一个简单的策略给大家详细介绍QMT搭建一个完整的策略框架必备的框架。
#encoding:gbkdef init(ContextInfo):print('hello init')def handlebar(ContextInfo):print('hello handlebar')
上图展示了在 QMT 量化平台中,通过 Python 编写基础输出模型的完整流程。
上面模型包含了QMT 策略必须实现的两个核心接口:init() 与 handlebar()。
从下面运行日志可以看到,策略启动后,系统会先执行一次 init (),输出 hello init;随后在行情每触发一根 K 线时,自动调用一次 handlebar (),并输出 hello handlebar。
init是一个Python模型的初始化方法。在模型加载的时候,系统会调用init方法,做一些必要的初始化,比如初始化股票池、初始化资金账号、初始化全局变量等。
def init(ContextInfo):# 设定股票池方法一,取板块的成分股作为股票池,例如取"上证50"成分股 ContextInfo.trade_code_list = ContextInfo.get_stock_list_in_sector("上证50")# 设定股票池方法二,可以自定义将股票代码写到列表里 ContextInfo.trade_code_list = ['******.SH', '******.SZ'] ContextInfo.set_universe(ContextInfo.trade_code_list) #初始化设定股票池 ContextInfo.accID = '******'# 初始化设定资金账号 ContextInfo.order = 10 # 初始化设置一些全局变量,例如设定买入的手数如果用户的模型不需要做初始化,可以在方法体中写pass,但方法的定义必须存在,否则模型的运行会报错。
handlebar 是 Python 策略模型的核心执行方法。当模型从数据端获取到所需的行情数据后,会逐根 K 线(bar)触发一次 handlebar 函数,并在该方法中完成对当前 K 线数据的处理工作。
因此,策略的核心逻辑,包括数据获取、交易条件判断、下单指令生成等内容,通常都编写在这个函数内部。
在 handlebar 中处理完数据后,用户可以通过 paint 方法将需要绘图输出的结果返回给界面。界面会将输出结果如实的展示出来。
def handlebar(ContextInfo): buy_sum = 0 sell_sum = 0 index = ContextInfo.barpos realtimetag = ContextInfo.get_bar_timetag(index)print timetag_to_datetime(realtimetag, '%Y%m%d %H:%M:%S') dict_close=ContextInfo.get_history_data(7, '1d', 'close', 3)#持仓市值 holdvalue = 0#持仓 holdings=get_holdings(ContextInfo.accountid, "STOCK")init 和 handlebar 是 Python 模型中最重要的方法,也是唯二由 C++ 直接调用的方法,所有的执行代码都尽量写在这两个方法中或由其中的函数调用。
想在 QMT 里写一套完整的交易策略,其实就几步:先选好你要交易的股票;再调用 QMT 自带的历史数据,算出均线这类你要用的指标;因为要真实下单,还得先看看账户里的资金和持仓情况;最后用平台的下单函数发出买卖指令就可以了。
我们以单均线策略为例,给大家详细讲解。
买入条件:当收盘价上穿 20 日均线时,触发买入信号。
卖出条件:当收盘价下穿 20 日均线时,触发卖出信号。

下面我会一步步讲清楚要用哪个 QMT 函数、怎么写,保证你照着就能操作。
编写策略的第一步,就是先定好要买卖哪几只股票。放到 QMT 里写代码,这一步专业叫法是设定股票池。对应的专用函数就是 ContextInfo.set_universe()。
def init(ContextInfo): stocklist = ['******.SH','******.SZ'] ContextInfo.set_universe(stocklist)它的参数是一个列表,里面就是股票代码,代码有后缀,后缀是为了区分市场,“SH”表示上海市场,“SZ”表示深圳市场。
选好操作哪只票后就开始获取行情数据,由于需要计算20日均线,所以需要用到历史行情数据。
获取历史数据相应的QMT函数就是:get_history_data
用法:
ContextInfo.get_history_data(len, period, field, dividend_type='none', skip_paused=True)示例:
def init(ContextInfo): ContextInfo.set_universe(['******.SH', '******.SZ'])def handlebar(ContextInfo):# 获取股票池中所有股票的最近两日的收盘价 hisdict = ContextInfo.get_history_data(2, '1d', 'close')for k, v in hisdict.items():if len(v) > 1:print(k, ':', v[1]-v[0]) # 今日涨幅我们可以看到这个函数的返回值是一个字典,键是股票代码,值是股票行情。这个函数的参数里面没有股票代码,原因是我们之前订阅了股票,获取的就是订阅股票池的历史行情数据。
接下来就是获取账户资金,这里用到的函数就是get_trade_detail_data,这个函数可以获取账户的资金、持仓、委托、成交等信息。
用法:
get_trade_detail_data(accountID,strAccountType,strDatatype);示例:
def handlebar(ContextInfo): obj_list = get_trade_detail_data('6000000248', 'stock', 'position')for obj in obj_list:print(obj.m_strInstrumentID)print(dir(obj)) # 查看有哪些属性字段函数返回的是一个列表,列表里面是某个数据类型的对象,数据类型传什么,则返回什么数据类型。
最后用下单函数进行下单,QMT里面有很多下单函数,今天介绍这个最基本的下单函数,order_target_value,这个函数表示把仓位调整到某个价值,这个函数比较适合用于对股票值调仓,
用法:
order_target_value(stockcode, tar_value[, style, price], ContextInfo[, accId])参数:
stockcode:股票代码
tar_value:目标金额(元),就是将股票市值调整到多少,
style:下单选价类型,包括最新价、买一价等等。
ContextInfo[, accId]:资金账号
以上就是QMT一个基本的单均线策略需要用到的函数,4个基本函数就可以实现一个策略,明天我们继续分享ptrade重要函数。
(1)开户成功后入金10万后提交QMT申请流程
(2)申请过程全程线上,预计2个工作日申请完成。
(3)等待开通过程中,可以提供测试账号、安装配置流程、量化会员资料。
(4)开通成功后,会通过邮件发送你软件下载地址,登录账号后就可以使用。

福利1:惊喜佣金
福利2:领取完整教程
福利3:添加量化讨论群
福利4:提供专业量化问题解答
福利5:量化工具安装使用教程、视频
福利6:极速柜台,量化投资者专用,速度微秒级
福利7:提供服务器托管模式:ptrade+ldp极速柜台+vip定向服务器(限50人)
