大家好,我是从聚宽迁移过来的用户,在开发QMT内置Python策略时遇到几个问题,已经折腾了几天了,客服让我来社区求助。
一、核心问题:回测无成交记录
现象:
- 策略运行后,日志中有 [BUY] 和 [SELL] 打印
- 但回测报告窗口是空白的(只有框子,没有内容)
- 用 get_trade_detail_data('test', 'stock', 'deal') 获取成交记录,返回空
- 用 get_trade_detail_data('test', 'stock', 'position') 获取持仓,也返回空
回测参数设置:
- 已按文档要求以"副图模式"执行
- 最大成交比例设置为 100
- 回测时间:2024-01-01 到 2024-12-31
- 初始资金:500000
问题:
- 回测报告空白是什么原因?策略到底有没有实际成交?
- 如何确认回测是否成交?有没有可靠的查看方式?
- "当日买入"和"持仓明细"面板在回测中是否本来就没有内容?
二、下单函数选择疑问
我看到两种下单方式,不确定哪个对:
方式1(网上找的,8个参数):
passorder(23, 1101, accountid, stock, 11, price, volume, ContextInfo)
方式2(官方文档,11个参数):
passorder(opcode, ordertype, accountid, stock, price_type, price, volume, strategy_name, quicktrade, remark, C)
问题:
- passorder() 到底是 8 个参数还是 11 个参数?
- 官方文档写的是 11 个参数,但网上大部分示例是 8 个参数,哪个是对的?
- 回测中应该用哪种下单方式?
三、其他疑问
- order_target_value() 在回测中是否能用?官方文档没有提到这个函数
- get_bar_timetag(barpos) 在回测中返回 0,这是正常的吗?有没有其他获取时间的方法?
- 代码中已经加了 #coding:gbk,还有哪里需要注意?
四、测试代码(简化版)
coding:gbk
import pandas as pd
import numpy as np
def init(C):
C.accountid = "testS"
C.set_universe(['000820.SZ', '601700.SH'])
C.positions = {}
print('Strategy initialized')
def handlebar(C):
barpos = C.barpos
# Get current time
timetag = C.get_bar_timetag(barpos)
if timetag > 0:
import datetime
timestamp_sec = timetag / 1000.0
dt = datetime.datetime.fromtimestamp(timestamp_sec)
current_time = dt.hour * 100 + dt.minute
else:
current_time = 0
# Check buy signal at 14:50
if current_time == 1450:
for code in C.get_universe():
# Buy logic (simplified)
passorder(23, 1101, C.accountid, code, 5, -1, 100, C)
print('BUY %s' % code)
# Check sell signal at 14:30
if current_time == 1430:
for code in C.get_universe():
if code in C.positions:
passorder(24, 1101, C.accountid, code, 5, -1, 100, C)
print('SELL %s' % code)
日志输出:
Strategy initialized
BUY 000820.SZ
BUY 601700.SH
SELL 000820.SZ
SELL 601700.SH
但回测报告空白,get_trade_detail_data 返回空。
请问各位大佬,这是哪里做错了?是下单函数参数不对,还是回测配置有问题?
感谢!