问题描述
algoParam={
'm_dLimitOverRate': 25, # 量比 25%
'm_dMinAmountPerOrder':0, # 委托最小金额
'm_nStopTradeForOwnHiLow': 1, # 涨跌停控制
'm_strCmdRemark': '投资备注1' # 投资备注
}
smart_algo_passorder(
23,
1123,
C.Account,
code,
12,#11限价;12市价;
0,
0.3, # 委托数量:整数型,单位:%
strategy_name, # 策略名称
1, #新K走完立即下单
msg, #投资备注 ,不可缺省
'VWAP', # 11: 智能VWAP算法
#25, # 量比:25%
#5000, #智能算法最小委托金额,数据范围0-100000
#1,
"09:30:00", #智能算法开始时间
"14:30:00", #智能算法结束时间
#1, # 1:涨停不卖跌停不卖
algoParam,
C
)
在执行上面的算法交易函数的时候,总是反复提示订单为-1,请老师们帮我看看问题出在哪里?是不是不能按照可用资金比例下单?
解决方案
您好!调用 smart_algo_passorder 函数一直返回 -1,通常是因为参数传递错误导致的。根据您提供的代码,主要问题不是出在按可用资金比例下单(1123 是完全支持的),而是函数参数的格式和顺序不符合官方 API 规范。
错误原因分析
-
混淆了
algo_passorder和smart_algo_passorder的参数格式:
您在代码中定义了一个字典algoParam并将其作为参数传入。在 QMT 中,只有普通算法交易函数algo_passorder才接受字典类型(userOrderParam)来设置参数。而智能算法交易函数smart_algo_passorder必须通过明确的顺序位置参数(如limitOverRate,minAmountPerOrder等)来传递,不支持传入字典。 -
参数顺序和数量缺失:
根据 QMT 官方文档,smart_algo_passorder的完整参数顺序如下:
smart_algo_passorder(opType, orderType, accountid, orderCode, prType, modelprice, volume, strageName, quickTrade, userid, smartAlgoType, limitOverRate, minAmountPerOrder, targetPriceLevel, startTime, endTime, ContextInfo)
您的代码中跳过了limitOverRate、minAmountPerOrder等参数,直接传入了时间字符串和字典,导致底层 C++ 解析参数失败,从而直接返回-1。
正确的代码写法
如果您希望使用 VWAP 算法,量比为 25%,最小委托金额为 0,并且按可用资金的 30%(1123 模式)下单,正确的代码应该如下:
# 假设在 handlebar(ContextInfo) 中调用
# 提取需要的变量
account = ContextInfo.accID # 或者您自定义的 C.Account
code = '000001.SZ' # 您的标的代码
strategy_name = 'MyStrategy'
msg = '投资备注1'
# 正确调用 smart_algo_passorder
smart_algo_passorder(
23, # opType: 23 表示股票买入
1123, # orderType: 1123 表示单股、单账号、可用资金、比例下单
account, # accountid: 资金账号
code, # orderCode: 股票代码
12, # prType: 12 表示涨跌停价(注意:智能算法通常建议用 11 模型价或 5 最新价,具体视算法而定)
0, # modelprice: 下单价格(prType为12时此参数无效,填0即可)
0.3, # volume: 比例 0.3 即 30%
strategy_name, # strageName: 策略名
1, # quickTrade: 1 表示立即触发下单
msg, # userid: 投资备注
'VWAP', # smartAlgoType: 智能算法类型
25, # limitOverRate: 量比 25%
0, # minAmountPerOrder: 最小委托金额 0
0, # targetPriceLevel: 目标价格(冰山算法有效,VWAP填0即可)
'09:30:00', # startTime: 算法开始时间
'14:30:00', # endTime: 算法结束时间
ContextInfo # ContextInfo 全局对象
)
关于 1123 比例下单的补充说明
1123(单股、单账号、可用、比例方式下单)是完全支持的。当 orderType 的最后一位是 3 时,volume 参数代表比例,取值范围是 [0 ~ 1]。您传入的 0.3 是合法的。只要您的账户中有足够的可用资金,且参数顺序严格按照上述格式传递,就不会再返回 -1 了。