风险提示:本内容为量化技术及平台操作的纯知识分享,不构成任何投资建议,不推荐任何具体证券或交易时机。部分内容可能理解包含错误,请自行核实。市场有风险,投资需谨慎
我们在做QMT策略开发中,经常看见,其他人开发的漂亮的参数面板,不需要再源代码里面修改参数分别方便,还有提示,这样的话可以加密策略,再外输入参数,可以保护自己的策略,比如我写的简单例子

第一步我们需要建立一个xml文件和策略的名称保持一样,这样系统才能读取到界面的xml,先做一下界面文件xml的配置,复制和策略名字一样的xml文件到qmt下面,

点击qmt安装路径

选择python文件夹

打开formulaLayout文件夹,把xml文件夹放在这个文件下面就可以

这样就完成了界面的配置,现在开始开发一个完整的xml,xml框架参考
<?xml version="1.0" encoding="UTF-8"?> <!-- 1. XML声明(必须) -->
<TCStageLayout> <!-- 2. 根节点(必须) -->
<control note="..."> <!-- 3. control节点(必须) -->
<variable note="..."> <!-- 4. variable节点(必须) -->
<item .../> <!-- 5. item节点(至少一个) -->
<item .../>
</variable>
</control>
</TCStageLayout>
我们主要需要编写的部分是item这个部分,其他的部分基本是固定的
<?xml version="1.0" encoding="UTF-8"?>
<TCStageLayout>
<control note="控件组说明">
<variable note="变量说明">
<item bind="字段ID" name="显示名称" note="提示说明" value="默认值" type="控件类型"/>
</variable>
</control>
</TCStageLayout>

bind,在qmt中绑定的参数名称,name,参数名称可以随便取,只需要绑定的参数bind唯一就可以,value默认的参数值,type是参数的类型,note,参数的说明提示,鼠标放在qmt的界面上会显示的提示

下面看一下type类型,包含了我们常见的输入,单选,下拉,多选框等

简单的不同类型的参考
Input 输入框
<item bind="字段名" name="显示名" note="提示" value="默认值" type="input"/>
Combo 下拉框
<item list="选项1,选项2,选项3" bind="字段名" name="显示名" note="提示" value="默认值" type="combo"/>
<!-- 可选:comboType="类型标识" -->
Radio 单选框
<item list="选项1,选项2,选项3" bind="字段名" name="显示名" note="提示" value="默认值" type="radio"/>
CheckBox 复选框
<item bind="字段名" name="显示名" note="提示" value="True/False" type="checkBox"/>

在外面写完xml界面,需要怎么样在qmt文件读取这个参数,只需要外面使用的参数和 xml界面里面的bind绑定的参数一样就可以,账户,账户类型是qmt界面自带的参数

来自界面的这个部分,每一个qmt策略都有

只需要参数名称和界面xml里面的bind一样就会自动加载


界面类型的策略参数来自外部,直接在编辑里面点击运行是加载不了参数的,需要点击模型交易,弹出界面才会读取到界面的全部内容

系统读取的界面参数的和内容

不懂的内容问我就可以,加我备注入群可以加入量化研究群

xml界面内容的参考,包含了常见的全部内容,策略的名称必须和xml文件的名称保持一样
<?xml version="1.0" encoding="UTF-8"?>
<TCStageLayout>
<control note="第一个界面策略例子 - 策略参数配置">
<variable note="策略参数">
<!-- ==================== 1. 输入类型 (Input) ==================== -->
<item bind="strategy_name" name="策略名称" note="自定义策略名称" value="我的第一个策略" type="input"/>
<item bind="initial_capital" name="初始资金" note="策略启动时的初始资金(万元)" value="100" type="input"/>
<item bind="max_position" name="最大持仓比例" note="单品种最大持仓占总资金比例" value="0.3" type="input"/>
<item bind="stop_loss_rate" name="止损比例" note="触发止损的亏损比例" value="0.05" type="input"/>
<item bind="take_profit_rate" name="止盈比例" note="触发止盈的盈利比例" value="0.10" type="input"/>
<item bind="trade_interval" name="交易间隔" note="两次交易之间的最小间隔(秒)" value="5" type="input"/>
<item bind="max_daily_trades" name="每日最大交易次数" note="单日允许的最大交易笔数" value="20" type="input"/>
<item bind="slippage" name="滑点" note="预期成交滑点" value="0.01" type="input"/>
<!-- ==================== 2. 下拉类型 (Combo) ==================== -->
<item list="上证50,沪深300,中证500,创业板指" bind="index_code" name="跟踪指数" note="策略跟踪的标的指数" value="沪深300" type="combo"/>
<item list="日线,4小时,1小时,30分钟,15分钟,5分钟" bind="timeframe" name="K线周期" note="策略使用的K线时间周期" value="30分钟" type="combo"/>
<item list="MACD,RSI,布林带,均线,KDJ" bind="indicator_type" name="主图指标" note="策略使用的主要技术指标" value="均线" type="combo"/>
<item list="收盘价,开盘价,最高价,最低价,加权价" bind="price_type" name="价格类型" note="计算指标使用的价格类型" value="收盘价" type="combo"/>
<!-- ==================== 3. 单选框类型 (Radio) ==================== -->
<item list="多头,空头,多空双向" bind="direction" name="交易方向" note="策略允许的交易方向" value="多空双向" type="radio"/>
<item list="日内,隔夜,混合" bind="holding_type" name="持仓方式" note="策略的持仓周期类型" value="日内" type="radio"/>
<item list="激进,稳健,保守" bind="risk_level" name="风险等级" note="策略的风险偏好程度" value="稳健" type="radio"/>
<item list="趋势跟踪,均值回归,突破交易" bind="strategy_style" name="策略风格" note="策略的核心交易逻辑" value="趋势跟踪" type="radio"/>
<!-- ==================== 4. 复选框类型 (CheckBox) ==================== -->
<item bind="enable_stop_loss" name="启用止损" note="是否启用止损功能" value="True" type="checkBox"/>
<item bind="enable_take_profit" name="启用止盈" note="是否启用止盈功能" value="True" type="checkBox"/>
<item bind="enable_trailing_stop" name="启用移动止损" note="是否启用动态跟踪止损" value="False" type="checkBox"/>
<item bind="auto_restart" name="自动重启" note="策略异常时是否自动重启" value="True" type="checkBox"/>
<item bind="send_email_alert" name="邮件预警" note="交易信号触发时是否发送邮件通知" value="False" type="checkBox"/>
<item bind="enable_backtest" name="回测模式" note="是否以回测模式运行(不真实下单)" value="False" type="checkBox"/>
<item bind="show_chart" name="显示图表" note="是否实时显示K线图表" value="True" type="checkBox"/>
</variable>
</control>
</TCStageLayout>
qmt文件内容代码参考
#encoding:gbk
'''
第一个界面策略例子
'''
import pandas as pd
import numpy as np
import talib
def init(c):
c.text = {
#系统自带参数****************
"账户":str(account),
"账户类型":str(accountType),
##########################
"策略名称": strategy_name,
"初始资金": initial_capital,
"最大持仓比例": max_position,
"止损比例": stop_loss_rate,
"止盈比例": take_profit_rate,
"交易间隔": trade_interval,
"每日最大交易次数": max_daily_trades,
"滑点": slippage,
"跟踪指数": index_code,
"K线周期": timeframe,
"主图指标": indicator_type,
"价格类型": price_type,
"交易方向": direction,
"持仓方式": holding_type,
"风险等级": risk_level,
"策略风格": strategy_style,
"启用止损": enable_stop_loss,
"启用止盈": enable_take_profit,
"启用移动止损": enable_trailing_stop,
"自动重启": auto_restart,
"邮件预警": send_email_alert,
"回测模式": enable_backtest,
"显示图表": show_chart
}
print(c.text)