多图层期权合约平仓失败

策略目的是想将常用的期货策略转为期权策略,所以订阅了多个期权图层,满足不同条件时对不同的期权合约进行交易。

但编写期权程序的时候却发生了异常,开仓能成功,但平仓失败。

请老师sell函数执行失败的原因可能有哪些?

代码如下:

图层data4开始都是期权图层,我把执行sell函数之前和之后的currentcontracts都打印出来,发现没有变化,都为2。然后尝试判断sell函数的执行结果,确实为false,打印出“平空失败”的提示。打印结果如下:

订阅的合约如下图:

1、请老师告知sell函数执行失败的原因可能有哪些?

2、是否用A函数直接对指定合约发单和平仓较订阅众多期权合约更为高效?

多图层问题
订阅期权失败
自动平仓失败
多图层
遍历期权图层,引用symbol时仍是0号图层的品种代码,要如何解决
在多图层主连合约和指数合约里如何获取某个合约的持仓量?
请教!关于多品种,跨周期,多图层
A_SellOrder()函数平仓下单失败
获取合约属性失败
期权合约和期货合约的映射

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)后,一样平仓失败。