策略中使用 Sellshort 开空后,无论使用哪种写法的平空命令,空单都无法被平仓

好,我在使用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. 是否有完整的做空策略示例代码可以参考?


请帮助解答,谢谢!

使用A_Buy 或者 A_SellShort 开多单或者开空单,怎么获取实际的成交价格?
【发单】平多的指令成了开空单
手动空平后,信号再次空平
升级更新后,策略参数出现异常导致策略无法使用
Bool A_Buy 这个函数是否只是开仓,开仓之前不会进行空单的平仓吧?
在持有多单的情况下开空单如何表达
市价比开空单委托价高,直接成交的问题
能只开多单或者只开空单吗
白糖图层空单持仓量的疑虑
没有平空后开多,而是只开多的问题

我问了AI 没有用啊, 就是不能平空单,你能给我指点下吗

视频区有学习资料。零基础课程里有模型开发相关

或者社区置顶看一下收费代编


函数名正确,不需要特殊设置。那问题很可能就出在 Global 变量上。



为什么我用了 Global(以及为什么可能有问题)

我当时的理由:


Global Numeric vLastDate(0);

Global 的意思是"跨Bar持久化"——变量值在每根K线之间保留不会重置。我用它来记录"今天是否已经开仓"。

但问题在于:

TBQuant里 Global 变量在整个策略生命周期只初始化一次,有时会和平台内部状态产生冲突,尤其是涉及持仓判断时行为不可预期。

正确写法应该用 Series<Numeric>:


// Global(可能有问题)
Global Numeric vLastDate(0);

// Series(更安全,每根K线都有自己的值,但也能访问前一根)
Series<Numeric> vLastDate(0);


立刻重写测试策略,去掉所有 Global:

Ran a command, read a fileRan a command, read a file


v5发送完毕。



核心改动


之前(可能有问题)v5(修复版)
变量类型Global NumericSeries<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?我不明白,请说明一下这么定义的理由