好,我在使用TBQuant 1.4.4.6版本开发量化策略时,遇到做空平仓命令无法执行的问题,请帮助确认。
【问题描述】
策略中使用 Sellshort 开空后,无论使用哪种写法的平空命令,空单都无法被平仓。回测结果显示空单从头持仓到回测结束,没有任何平仓记录。
【已测试的四种写法,全部失败】
1. Buytocover(lots, Close)
2. BuyToCover(lots, Close)
3. Sell(lots, Close)
4. Sell(-lots, Close)
【最简测试代码】
Params
Numeric TestLots(1);
Vars
Global Numeric vLastDate(0);
Global Numeric vTested(0);
Global Numeric vOpenBar(0);
Events
OnBar(ArrayRef<Integer> indexs)
{
Numeric nCurPos;
nCurPos = MarketPosition * CurrentContracts;
Numeric nCurTime;
nCurTime = Hour * 100 + Minute;
If(Date <> vLastDate)
{ vLastDate = Date; vTested = 0; vOpenBar = 0; }
If(nCurPos == 0 And vTested == 0 And nCurTime == 930)
{
Sellshort(TestLots, Close);
vTested = 1;
vOpenBar = CurrentBar;
}
If(nCurPos < 0 And vOpenBar > 0 And CurrentBar - vOpenBar >= 5)
{
Buytocover(TestLots, Close); // 四种写法都试过,均失败
vOpenBar = 0;
}
}
【回测参数】
品种:TA888(郑州PTA主力)
周期:5分钟
时间:2024-01-01 至 2024-06-30
资金:100万
【回测结果】
只有1笔交易(开空),空单持仓到回测结束从未平仓。
理论上应该有约100笔开空+平空配对。
【我的问题】
1. 在TBQuant 1.4.4.6中,做空平仓的正确函数名是什么?
2. 策略单元创建时是否需要特殊设置才能支持做空?
3. 是否有完整的做空策略示例代码可以参考?
请帮助解答,谢谢!
我问了AI 没有用啊, 就是不能平空单,你能给我指点下吗
视频区有学习资料。零基础课程里有模型开发相关
或者社区置顶看一下收费代编
函数名正确,不需要特殊设置。那问题很可能就出在 Global 变量上。
我当时的理由:
Global Numeric vLastDate(0);Global 的意思是"跨Bar持久化"——变量值在每根K线之间保留不会重置。我用它来记录"今天是否已经开仓"。
但问题在于:
TBQuant里 Global 变量在整个策略生命周期只初始化一次,有时会和平台内部状态产生冲突,尤其是涉及持仓判断时行为不可预期。
正确写法应该用 Series<Numeric>:
// Global(可能有问题)
Global Numeric vLastDate(0);
// Series(更安全,每根K线都有自己的值,但也能访问前一根)
Series<Numeric> vLastDate(0);Ran a command, read a fileRan a command, read a file
v5发送完毕。
| 之前(可能有问题) | v5(修复版) | |
|---|---|---|
| 变量类型 | Global Numeric | Series<Numeric> |
| 跨Bar读取 | 隐式 | 显式用 [1] 读上一根 |
| 初始化 | 只初始化一次 | 每根K线明确赋值 |
Series<Numeric> 的用法:
vTested = vTested[1]; // 读取上一根K线的值(保持状态)
vTested[1] // 上一根
vTested[2] // 两根前这正是TBQuant里所有策略状态变量的标准写法,包括官方示例里的写法。
......
ai写的代码不分析
有问题问ai
能否把做空的策略库发我看看,或者发点代码,做空可以,但平空不能
1. 在TBQuant 1.4.4.6中,做空平仓的正确函数名是什么?
buytocover
2. 策略单元创建时是否需要特殊设置才能支持做空?
不需要
3. 是否有完整的做空策略示例代码可以参考?
平台的策略库里至少有二十个做空的策略可以参考
大概我觉得就是你定义的三个变量,为什么是global?我不明白,请说明一下这么定义的理由