QMT自定义策略怎么写?零基础快速入门指南~
发布时间:11小时前阅读:53
零基础写 QMT 自定义策略,不用先学成 Python 工程师,只要搞懂“两个必写函数 + 一个下单函数 + 防重复发单”这三件事,就能跑通第一个双均线策略。下面按“框架→代码→避坑→上线”四步走。详询量化开通和低佣优惠,请点击头像与我联系!
一、QMT 策略的固定骨架
QMT 的 Python 策略(标准版模型研究里写)只认两个入口函数,缺一个都跑不起来:
- init(ContextInfo):策略启动时只跑一次,干三件事——绑账号、定标的、设参数(均线周期、资金账号等)。
- handlebar(ContextInfo):每根 K 线触发一次(实盘最后一根 K 线随 tick 刷新会多次调用),所有“取数据→算指标→判断信号→下单”都写这里。
- 文件第一行必须写 #coding:gbk(防中文注释乱码)。
- 跨函数传递变量别用 global,统一挂到 ContextInfo.xxx 上(如 ContextInfo.ma_short = 5)。
二、第一个能跑的策略:日线双均线(金叉买/死叉卖)
直接复制进 QMT「模型研究 → 新建 Python 策略」就能编译,标的界面选 510300 或 000001 都行。
#coding:gbk
import numpy as np
def init(ContextInfo):
# 界面选的标的自动拼成 000001.SZ 这种格式
ContextInfo.stock = ContextInfo.stockcode + "." + ContextInfo.market
ContextInfo.set_universe([ContextInfo.stock])
ContextInfo.short_n = 5
ContextInfo.long_n = 20
ContextInfo.accountid = "testS" # 回测填testS,实盘改成你的资金账号
ContextInfo.has_order_today = False # 防重复发单锁
def handlebar(ContextInfo):
# 历史K线回放时不发单,只在最后一根实时K线判断
if not ContextInfo.is_last_bar():
return
# 取近 long_n 根日线收盘
data = ContextInfo.get_market_data(["close"], [ContextInfo.stock],
period="1d", count=ContextInfo.long_n)
close = data["close"][ContextInfo.stock]
if len(close) < ContextInfo.long_n:
return
ma5 = np.mean(close[-ContextInfo.short_n:])
ma20 = np.mean(close[-ContextInfo.long_n:])
pos = ContextInfo.get_position(ContextInfo.stock).volume # 持仓股数
# 每天只尝试一次,避免tick级重复触发
if ContextInfo.has_order_today:
return
if ma5 > ma20 and pos == 0:
# 23=买入, 1101=单股普通单, 5=最新价, -1=价格忽略, 100股=1手
passorder(23, 1101, ContextInfo.accountid, ContextInfo.stock,
5, -1, 100, "dual_ma", 1, "buy1", ContextInfo)
print("金叉信号:买入100股")
ContextInfo.has_order_today = True
elif ma5 < ma20 and pos > 0:
passorder(24, 1101, ContextInfo.accountid, ContextInfo.stock,
5, -1, pos, "dual_ma", 1, "sell1", ContextInfo)
print("死叉信号:卖出全部持仓")
ContextInfo.has_order_today = True想每天重置发单锁,可在 init 里配合 run_time 定时任务每天开盘清 has_order_today=False,新手先手动重跑策略也能用。
三、核心函数 passorder 参数白话版
passorder(opType, orderType, accountid, orderCode, prType, price, volume, strategyName, quickTrade, userOrderId, ContextInfo)
- opType:23=股票/ETF/转债买入,24=卖出
- orderType:1101=按股数下单(股票100整数倍,转债10张整数倍)
- accountid:资金账号字符串
- orderCode:000001.SZ 带后缀格式
- prType:5=最新价,11=指定价(此时 price 生效)
- price:prType=5 时填 -1 即可
- volume:买入股数/卖出张数
- quickTrade:0=K线走完才报单(回测同款);1=当根K线末tick立即发(需 is_last_bar 配合);2=不管历史K线立即发(历史回放会乱下单,实盘慎用)
- 最后 ContextInfo 必传
四、零基础最容易卡住的 5 个坑
- 没下 Python 库:首次登录 QMT 必须点「我的 → 下载 Python 库」,否则 import numpy 全红。
- 历史 K 线疯狂废单:漏写 if not ContextInfo.is_last_bar(): return,回测逐根回放时把历史信号全发一遍。
- tick 级重复下单:实盘最后一根 K 线每个 tick 都进 handlebar,必须用“当日已下单锁”或查 get_waiting_order 去重。
- 数量不合法:股票不是 100 股整数倍、转债不是 10 张整数倍、可用资金不够,直接废单。
- 跑模型研究不生效:在编辑器点“运行”只是出信号,必须进「模型交易」加载策略,选模拟或实盘模式才真正监控发单。
如需咨询量化开通和低佣优惠,欢迎点击头像与我联系!
新开账户可免费使用QMT、PTrade等量化系统,支持快速交易通道。
各品种交易佣金可调低至成本附近,还有更多福利活动等你来拿。
温馨提示:投资有风险,选择需谨慎。
-
REITs打新日历:四川成都 ⌈锦江 REIT⌋ 本周四售!(附认购操作指南)
2026-07-27 16:59
-
2026夜市委托怎么操作?个人经验攻略全分享
2026-07-27 16:59
-
新股发行:【展芯股份】+【国仪公司】+【超纯应材】本周可申购!(附打新神器)
2026-07-27 16:59


问一问

+微信
分享该文章
