QMT 策略编写实操:零基础也能学会的均线策略编写教程
发布时间:5小时前阅读:22
在 QMT 里写策略,零基础不用怕,它最核心的就认准两个函数:init(初始化,只跑一次)和 handlebar(每根 K 线触发一次)。下面用最经典的双均线(金叉买、死叉卖)带你走一遍从建文件到跑通的完整实操。
一、新建策略与编码声明
1. 登录 QMT 客户端,进入顶部「模型研究」。
2. 右键空白处 → 新建策略 → 选 Python 模型,取名如 双均线入门。
3. 在编辑器第一行写上编码声明,防止中文注释乱码:
#coding:gbk
import pandas as pd
import numpy as np
二、编写 init 初始化函数
这个函数只在策略启动时执行一次,用来定参数、绑标的。在 QMT 内置编辑器里,ContextInfo 对象会自动携带当前在界面选择的股票代码和市场信息。
def init(ContextInfo):
# 拼接完整代码(界面选的标的 + 市场,如 000001.SZ)
ContextInfo.stock = ContextInfo.stockcode + "." + ContextInfo.market
# 均线参数
ContextInfo.short_period = 5 # 短期均线(如5日)
ContextInfo.long_period = 20 # 长期均线(如20日)
# 回测/实盘账号(回测填 "testS",实盘会自动替换)
ContextInfo.accountid = "testS"
# 设置订阅品种
ContextInfo.set_universe([Context_Info.stock])
print("策略初始化完成,标的:", ContextInfo.stock)
三、编写 handlebar 核心逻辑(逐 K 线执行)
这里是策略的大脑,每来一根新 K 线(或回测逐根回放时)都会跑一次,负责拿数据 → 算指标 → 下单。
def handlebar(ContextInfo):
# 1. 获取历史收盘价(数量取长周期+1,保证计算够用)
stock = ContextInfo.stock
count = ContextInfo.long_period + 10
# QMT内置接口拿数据,返回字典结构
data = ContextInfo.get_market_data_ex(
fields=["close"],
stock_code=[stock],
period=ContextInfo.period,
count=count
)
# 转成列表方便计算
close_series = data[stock].iloc[:, 0]
close_list = list(close_series)
if len(close_list) < ContextInfo.long_period:
return # 数据不够,先不跑
# 2. 计算均线
ma_short = np.mean(close_list[-ContextInfo.short_period:])
ma_long = np.mean(close_list[-ContextInfo.long_period:])
# 前一周期均线(判断交叉用)
ma_short_prev = np.mean(close_list[-ContextInfo.short_period-1:-1])
ma_long_prev = np.mean(close_list[-ContextInfo.long_period-1:-1])
# 3. 查询账户持仓(判断是否空仓)
positions = get_trade_detail_data(ContextInfo.accountid, "stock", "position")
holdings = {i.m_strInstrumentID + "." + i.m_strExchangeID: i.m_nVolume for i in positions}
hold_vol = holdings.get(stock, 0)
# 4. 交易信号
# 金叉:前一日短≤长,今日短>长,且空仓
if ma_short_prev <= ma_long_prev and ma_short > ma_long and hold_vol == 0:
account = get_trade_detail_data(ContextInfo.accountid, "stock", "account")[0]
cash = int(account.m_dAvailable)
price = close_list[-1]
vol = int(cash / price / 100) * 100 # A股100股整数倍
if vol >= 100:
# 买入:23为股票买入操作码,1101为限价类型,5为卖五价,-1表示使用指定价格类型
passorder(23, 1101, ContextInfo.accountid, stock, 5, -1, vol, ContextInfo)
print(f"金叉触发,买入{vol}股,价格{price}")
# 死叉:前一日短≥长,今日短<长,且有持仓
elif ma_short_prev >= ma_long_prev and ma_short < ma_long and hold_vol > 0:
# 卖出:24为股票卖出操作码
passorder(24, 1101, ContextInfo.accountid, stock, 5, -1, hold_vol, ContextInfo)
print(f"死叉触发,卖出{hold_vol}股")
四、编译、回测与避坑
1. 保存与编译:写完点编辑器上方「编译」,底部输出“编译成功”才能跑;有红字报错按行号检查缩进或拼写。
2. 设置回测:点「回测」,选时间范围(建议 3 年以上)、初始资金(如 10 万)、周期(日线)。
3. 看结果:跑完看收益曲线、最大回撤、交易明细。如果一条成交都没有,优先检查:
• 历史数据下没下够(去行情→历史数据下载补一下);
• get_market_data_ex 的 count 是不是小于长周期;
- 股票是否长期停牌或代码拼错。
五、新手实盘前必做
• 先模拟:在「模型交易」里加载策略,运行模式选“模拟”,跑 1–2 周看日志和委托是否正常,别直接开实盘。
• 加风控:上面示例没写止损,实盘建议在 handlebar 里加持仓亏损比例判断(如亏 5% 强制清仓)。
- 注意下单模式:passorder 默认逐 K 线生效(K 线结束发单),若要盘中即时响应需改参数,新手先用默认即可。
这套双均线骨架是 QMT 入门的“最小可用单元”,后续你可以把 np.mean 换成 ta-lib、加成交量过滤、或多标的循环,都是在这两个函数里往里填逻辑。
如需咨询量化开通和低佣优惠,欢迎点击头像与我联系!
新开账户可免费使用QMT、PTrade等量化系统,支持快速交易通道。
各品种交易佣金可调低至成本附近,还有更多福利活动等你来拿。
温馨提示:投资有风险,选择需谨慎。
-
想换券商又怕麻烦?转户全流程拆解:不用先销户,资产转移比你想象的简单
2026-07-13 10:11
-
104天过会、估值420亿:宇树科技凭什么成为"人形机器人第一股"?
2026-07-13 10:11
-
本周打新日历:2026年A股规模最大IPO【长鑫科技】即将发行!一键速览重点
2026-07-13 10:11


问一问

+微信
分享该文章
