前言
区间震荡行情用网格,思路是跌一格加仓、涨一格减仓,或反向做均值回归网格。用天勤时若每个格子都直接insert_order,容易手续费爆炸、部分成交乱仓。我更喜欢用TargetPosTask表达「目标净仓」,格子信号只改目标手数,由任务层去拆单。
天勤TqSdk的TargetPosTask适合这类频繁调仓,但必须把「价格档位 → 目标 volume」映射写清楚,并做手续费敏感检查。下面给映射思路和主循环结构,不是完整盈利策略。
一、网格在程序里是什么
抽象成:
- 中心价或均线锚定
- 上下各 N 格,每格宽度
step(元或 tick) - 当前价落在哪一格,对应目标净仓
target_volume(整数手)
例如做多网格:价每下移一格,目标仓 +1;每上移一格,目标仓 -1(或减至 0)。做空网格方向相反。团队要先纸面画表,再写代码。
| 档位(相对中心) | 目标净仓(示例) |
|---|---|
| +2 | 0 |
| +1 | 1 |
| 0 | 2 |
| -1 | 3 |
| -2 | 4 |
表内容仅示意,实际档位与风控上限自定。
二、用 TargetPosTask 承接目标仓
fromtqsdkimportTqApi,TqAuth,TqSim,TargetPosTask api=TqApi(TqSim(),auth=TqAuth("账户","密码"))symbol="SHFE.rb2510"quote=api.get_quote(symbol)kl=api.get_kline_serial(symbol,60,data_length=50)task=TargetPosTask(api,symbol)center=Nonestep=20# 元,示意max_pos=4defprice_to_target(price,center,step,max_pos):ifcenterisNone:return0k=int(round((center-price)/step))# 定义方向与团队表一致k=max(-max_pos,min(max_pos,k))returnk# 或查表whileTrue:api.wait_update()ifapi.is_changing(kl.iloc[-1],"datetime"):center=kl.close.iloc[-2]ifcenterisNoneelsecenter tgt=price_to_target(quote.last_price,center,step,max_pos)task.set_target_volume(tgt)center是否每根 K 线重置、是否用均线锚定,决定网格性格,需回测验证。
三、手续费与调仓频率
网格最怕「价格来回扫、每秒调一次目标仓」。应:
- 只在 K 线收盘或档位跨格时
set_target_volume - 设最小调仓间隔或 hysteresis(跨半格才动)
- 回测里把手续费调高做敏感性测试
若调仓后毛利小于手续费,网格在该品种上可能不成立。
四、风控上限
max_pos必须硬编码或配置化;available资金不足时,TargetPosTask可能部分成交,要读position核对。突破区间后要有「停止网格、只平仓」规则,避免单边趋势满仓逆势。
五、模拟与实盘
网格在TqSim里先跑至少一周,统计日均成交笔数。笔数过高则加大step或减少档位数。切实盘前检查平今手续费(上期所等)。
总结
网格在程序里应是「价格档位 → 目标净仓」映射表,由TargetPosTask负责把目标仓拆成报单,而不是每个格子手写insert_order。中心价或均线锚定、step宽度、max_pos上限要先在纸面画表再编码;做多网格与做空网格方向要在表里写死,避免盘中临时改定义。
调仓频率要克制:宜在 K 线收盘或档位跨格时set_target_volume,必要时加 hysteresis,避免价格在边界来回扫导致手续费吞噬毛利。回测与模拟里用上调手续费、统计日均成交笔数做敏感性测试;突破区间要有停止网格、只平仓或限制逆势加仓的规则。上期所等平今手续费在实盘前单独核对。
建议档位表存 CSV,参数变更只改表;对比粗网格与细网格的笔数、净利与回撤;在TqSim或TqKq跑满一周再考虑加大资金或手数。
FAQ
1)双合约网格?
近远月各一个 task,spread 档位单独定义。
2)中心价每天重置吗?
策略选择,要写进说明。
3)TargetPosScheduler?
需要渐变调仓时用,与瞬间跳变不同。
4)网格适合趋势品种?
趋势市要有限制逆势加仓规则。
风险提示
本文用于策略结构讨论,不构成投资建议。