多图层期权合约平仓失败

策略目的是想将常用的期货策略转为期权策略,所以订阅了多个期权图层,满足不同条件时对不同的期权合约进行交易。但编写期权程序的时候却发生了异常,开仓能成功,但平仓失败。请老师sell函数执行失败的原因可能有哪些?代码如下:图层data4开始都是期权图层,我把执行sell函数之前和之后的currentcontracts都打印出来,发现没有变化,都为2。然后尝试判断sell函数的执行结果,确实为false,打印出“平空失败”的提示。打印结果如下:订阅的合约如下图:1、请老师告知sell函数执行失败的原因可能有哪些?2、是否用A函数直接对指定合约发单和平仓较订阅众多期权合约更为高效?

1. 可能你控制上有问题,我随便删除一个条件,自然会平错误的仓,昨天都是少K线的期权2.在不知道你代码的情况下,你放TBQ3也许不会有问题

回复:您的代码条件是currentbar==10,当某分钟少了K线时,currentbar编号并不会留空,所以不出错。但我用的是time作为条件,如果刚好少了那根K线时,就会出错。老师,您觉得A函数能更好实现我的业务需求吗?如果能,我就去学习一下相关知识

回复:time是会有问题,因为你的条件没满足,所以说明系统没有问题

回复:期权成交清淡,1分钟的K线无成交是经常会发生的事,但如果因此少一根bar,导致多图层的代码出现问题似乎不应该,建议官方针对此场景提供解决方案

回复:If(Data0.BarExistStatus * Data1.BarExistStatus * Data2.BarExistStatus * Data3.BarExistStatus != 1) Return;类似这样的用循环Data[i]相乘,如果没有数据就不操作,等待数据对齐再处理

回复:否则买卖都会出问题,回溯都会闪烁

回复:咦 明明我清醒的记得刘老师有专门讲过对齐的 好像也是用你这个函数怎么现在看又跟看新姿势一样......好迷的体验

将相同的代码放到IO期权和MO期权中,都能正常开仓和平仓,就HO期权平仓失败,实在是想不明白原因。💀

回复:找到原因了,平仓失败那个期权合约HO2506-C-2750,在应平仓的那1分钟,由于成交清淡,那1分钟正好没有任何成交,导致少了一根K线。对于这种特殊情况,不知道TB官方有没有更好的解决方案?如果用小周期的期权交易,估计会经常出现这种问题。

//------------------------------------------------------------------------ // 简称: test_0521_2025 // 名称: // 类别: 策略应用 // 类型: 用户应用 // 输出: Void //------------------------------------------------------------------------ Params //此处添加参数 Vars //此处添加变量 Numeric a; Defs //此处添加策略函数 Events //此处实现事件函数 //Bar更新事件函数,参数indexs表示变化的数据源图层ID数组 OnBar(ArrayRef<Integer> indexs) { Numeric i; range[i=0:DataCount-1] { if(BarStatus==0) { buy(i+1,open); } if(currentbar==10 and MarketPosition>0) { bool a = sell(CurrentContracts,open); if(a) { print("good+"+text(i)+"+"+Symbol); } else { print("bad+"+text(i)+"+"+symbol); } print("======================="); } } } //------------------------------------------------------------------------ // 编译版本 2025/5/21 140729 // 版权所有 wangkaiming // 更改声明 TradeBlazer Software保留对TradeBlazer平台 // 每一版本的TradeBlazer策略修改和重写的权利 //------------------------------------------------------------------------随便举个例子

请各位老师们指导,如果想实现对指定期权合约的交易,与订阅多图层相比,是否用A函数直接对指定合约开仓和平仓更为高效?

打印失败?不能作为判断实际委托里怎么拒绝的另外根据打印内容,猜测对应图层没有持仓,所以平失败

回复:不是打印失败,是以执行data[i].Sell(data[i].CurrentContracts,10)语句的结果来决定打印出来的内容。当执行结果为false时,就执行Print("平空失败");“实际委托里怎么拒绝的”,这也是我想向老师请教的内容。“另外根据打印内容,猜测对应图层没有持仓,所以平失败”,从 Print("平仓前"+data[i].Symbol+"有"+text(data[i].CurrentContracts)+"手");语句执行的结果就可以看出,该期权是有持仓的,从工作区上也可以看该期权有持仓。

回复:你用的是buysell指令,平仓前依靠图表上的持仓,你截图的只是账户持仓

回复:这不是账户持仓,就是图表持仓。

回复:图表持仓的话 你看你后面没有出现sell信号

回复:另外你可以拿出IF来看看

回复:我知道没有出现sell信号,这正是我的问题啊😅.............执行了sell命令,但执行结果却是false,然后print出了“平仓失败”的结果

回复:拿出if来看啥?那个sell命令我之前是单独执行的,但发现currentContracts一直为2,说明执行失败。所以特地把执行结果放到 if语句中,根据其执行结果是true还是false,打印出不同的文字进行判断。您能告诉我在主帖中的问题:sell函数执行失败的原因可能有哪些?

回复:我找到老师之前的回答了sell 执行失败,就是你的参数不合法5月15日有10这个价格吗

回复:价格为无效值,数量小于0,数量小于最小交易量,达到最大连续建仓数、资金不足等

回复:谢谢兄弟提醒,我之前用的是open价,一样报错。我改成10是以为那个bar没有价格,所以随便取了一个数。我改成data[i].Sell(data[i].CurrentContracts,open)后,一样平仓失败。