问题描述
解决方案
在 QMT 中,想要实现“用可用资金的 50% 买入”这一特定需求,最直接且准确的方法是使用 passorder 函数,并配合特定的 orderType(下单方式)。
核心代码
# opType=23 (买入)
# orderType=1123 (单股、单账号、可用资金、比例下单)
# prType=5 (最新价)
# volume=0.5 (50%)
passorder(23, 1123, ContextInfo.accid, '600000.SH', 5, -1, 0.5, ContextInfo)
详细说明
要实现按可用资金比例下单,关键在于 passorder 函数的第二个参数 orderType。
根据文档,orderType 设置为 1123 代表:单股、单账号、可用、比例[0 ~ 1]方式下单。
参数详解:
23(opType): 操作类型,代表股票买入。1123(orderType): 下单方式。这是核心参数,表示按照当前账户可用资金的比例进行计算。ContextInfo.accid(accountID): 你的资金账号(需要在init中设置或直接传入字符串)。'600000.SH'(orderCode): 标的股票代码。5(prType): 报价类型,5代表最新价。-1(price): 委托价格。因为前面选了最新价,这里填-1即可;如果选限价则需填具体价格。0.5(volume): 下单数量。在1123模式下,0.5代表 50%。
完整策略示例
以下是一个完整的策略代码框架,展示了如何在 handlebar 中调用该函数:
# -*- coding: gbk -*-
def init(ContextInfo):
# 设置资金账号
ContextInfo.accid = '6000000000'
ContextInfo.set_account(ContextInfo.accid)
def handlebar(ContextInfo):
# 获取当前主图的股票代码
stock_code = ContextInfo.stockcode + '.' + ContextInfo.market
# 示例:如果是最后一根K线,则下单
if ContextInfo.is_last_bar():
# 使用可用资金的 50% 以最新价买入
passorder(23, 1123, ContextInfo.accid, stock_code, 5, -1, 0.5, ContextInfo)
print(f"已对 {stock_code} 下单,使用可用资金的 50%")
常见误区提示
QMT 还有一个 order_percent 函数,但请注意区别:
order_percent(0.5)通常是指**目标仓位占总资产(投资组合价值)**的 50%,而不是可用资金的 50%。- 如果你的目的是“花掉手里剩下现金的一半”,请务必使用
passorder配合1123模式。
Q&A
Q: orderType 还有哪些常用的比例设置?
A:
1113: 单股、单账号、总资产、比例下单(即目标仓位占总资产的百分比)。1123: 单股、单账号、可用资金、比例下单(即花费可用现金的百分比)。
Q: 如果可用资金不足以买入 1 手怎么办?
A: QMT 的交易接口通常会自动向下取整到 100 股(1手)。如果计算出的资金连 1 手都买不起,该委托通常不会被创建或会被柜台拒绝。
Q: passorder 中的 quickTrade 参数有什么用?
A: quickTrade(倒数第三个参数)用于控制是否立即下单。
0(默认):在当前 K 线走完,下一根 K 线开始时触发(回测常用)。1:立即触发下单(实盘常用,配合ContextInfo.is_last_bar()使用)。2:强行立即触发,不判断 K 线状态(慎用)。