from tqsdk import TqApi, TqAuth, TqBacktest, TargetPosTask, BacktestFinished
from datetime import date,datetime
from tqsdk.ta import MA # 新增导入
# ====================== 策略参数配置 ======================
# SYMBOL = “KQ.m@SHFE.AL2509” # 氧化铝202509 主连(回测推荐用主连,数据完整)
SYMBOL = “SHFE.ao2606” # 如需直接回测指定合约,取消注释这行,注释上一行
PERIOD = “5min” # 5分钟K线周期
MA_FAST = 5 # 快均线:5日均线
MA_SLOW = 20 # 慢均线:20日均线
# ====================== 回测初始化 ======================
api = TqApi(
auth=TqAuth(“xxx”, “.xxx”), # 必须填写你的信易账号
backtest=TqBacktest(
start_dt=date(2026, 5, 1), # 回测开始日期
end_dt=date(2026, 5, 29) # 回测结束日期
),
web_gui=”http://127.0.0.1:3001″
)
# 获取K线数据
klines = api.get_kline_serial(SYMBOL, duration_seconds=300, data_length=MA_SLOW+2)
# 目标持仓任务(TqSdk标准持仓管理)
target_pos = TargetPosTask(api, SYMBOL)
print(“=” * 50)
print(f”启动回测 | 合约:{SYMBOL} | 周期:{PERIOD} | 均线:{MA_FAST}日 & {MA_SLOW}日”)
print(“=” * 50)
try:
while True:
# 等待行情更新
api.wait_update()
# 仅在新K线生成时计算指标(避免重复计算)
if api.is_changing(klines.iloc[-1], “datetime”):
# 计算均线(使用收盘价)
ma_fast_val = klines.close.rolling(MA_FAST).mean().iloc[-1]
ma_slow_val = klines.close.rolling(MA_SLOW).mean().iloc[-1]
# 上一根K线的均线值(用于判断金叉死叉)
pre_ma_fast = klines.close.rolling(MA_FAST).mean().iloc[-2]
pre_ma_slow = klines.close.rolling(MA_SLOW).mean().iloc[-2]
dt = datetime.fromtimestamp(klines.iloc[-1].datetime / 1000000000)
print(f”时间:{dt} | 5均线:{ma_fast_val:.3f} | 20均线:{ma_slow_val:.3f}”)
# ====================== 交易逻辑 ======================
# 金叉:5日均线上穿20日均线 → 做多
if pre_ma_fast < pre_ma_slow and ma_fast_val > ma_slow_val:
print(“👉 金叉信号 → 开多仓”)
target_pos.set_target_volume(1) # 1手多单
# 死叉:5日均线下穿20日均线 → 做空/平多
elif pre_ma_fast > pre_ma_slow and ma_fast_val < ma_slow_val:
print(“👉 死叉信号 → 平多仓/开空仓”)
target_pos.set_target_volume(0) # 平仓
except BacktestFinished:
# 回测结束,输出统计报告
print(“\n” + “=” * 50)
print(“✅ 回测执行完毕!”)
api.close()
支持的。你这段代码里目前只是计算并打印了 `ma_fast_val`、`ma_slow_val`,还没有把指标序列写回 `klines`,所以 web_gui 没有可绘制的数据。
处理方式是:在 `api.wait_update()` 之后,把完整的均线序列加到 K 线 DataFrame 的附加列上。
画到主图:新增 `ma_fast_MAIN`、`ma_slow_MAIN` 两列,值分别用 `klines.close.rolling(MA_FAST).mean()` 和 `klines.close.rolling(MA_SLOW).mean()`。如需指定颜色,再新增 `ma_fast_MAIN.color`、`ma_slow_MAIN.color` 两列。
画到附图:新增指标列后,再设置对应的 `.board` 附加列。例如 `ma_fast_sub.board` 和 `ma_slow_sub.board` 都设置为同一个名字(如 `MA`),这两根线就会画在同一个附图里。
另外建议把 `web_gui` 参数写成 `web_gui=True` 或 `web_gui=”:3001″` 这类格式;程序也要持续调用 `api.wait_update()`,web 端才会收到并刷新绘图数据。
有其他问题欢迎加入官方Q群748265037一起交流