策略目的是想将常用的期货策略转为期权策略,所以订阅了多个期权图层,满足不同条件时对不同的期权合约进行交易。
但编写期权程序的时候却发生了异常,开仓能成功,但平仓失败。
请老师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)后,一样平仓失败。