订阅期权失败

Params

   Numeric ChangePercent(1);

   Integer Strike_Price_step(250);

Vars

   String OptionSymbol;

   Global Numeric g1(0);   //流程控制,先在OnReady()中整理数据,然后重新返回OnInit()中订阅期权

   Global bar mybar;

   Global Integer op_index(0);

   Global Integer id(0);

Defs

   //此处添加策略函数

   

Events

   //此处实现事件函数

   

   //初始化事件函数,策略运行期间,首先运行且只有一次

   OnInit()

   {

       If(g1 == 1)

       {

           String OptionSymbol;

           Array<String> str1;

           StringSplit(Symbol, ".", str1);

           Numeric a = Round(mybar.close / Strike_Price_step, 0) * Strike_Price_step;

           Numeric b = Round(13935/250,0)*250;

           Print("收盘价:"+Text(mybar.close) +"a:"+ Text(a)+"b:"+Text(b));

           Print(Text(mybar.dateTime));

           OptionSymbol = str1[0] + "C" + Text(a) + "." + str1[1];

           Print("OptionSymbol=" + OptionSymbol);

           op_index = SubscribeBar(OptionSymbol, Frequency, BeginDateTime);

           id = SubscribeBar(RelativeSymbol,"1d", BeginDateTime);

       }

   }

   OnReady()

   {

       If(g1 == 0)

           {

               GetReadyBar(mybar, BarCount - 1);

               g1 = 1;

               ReStart(False);     //所有全局变量不重置

           }

   }



   //Bar更新事件函数,参数indexs表示变化的数据源图层ID数组

   OnBar(ArrayRef<Integer> indexs)

   {

       Numeric volty = Volatility(data[id].Close);

       Print("BlackModel:" + Text(BlackModel(TradingDayLeft, StrikePrice, data[id].Close, 5, volty, OptionType, OptionStyle)));

   }

求助:我在oninit里有两个变量存放平值期权的行权价,我不明白为啥算出来的行权价会不对(算出来是13950,没有这一档),但如果把具体数值代进去就没有问题(算出来橡胶的平值期权行权价是14000),也就是我有变量a和b分别存放了两个结果,不明白为什么会不一样,怎么会算出来13950呢?奇怪。麻烦老师有空帮我分析一下,谢谢

多图层期权合约平仓失败
订阅行情失败的问题
请问如何在000指数上订阅主力月期权?
通过订阅实现甄别对应商品的平值期权的方法?
TB支持上证50的期权行情订阅吗?为何无法订阅?
回测999指数时,显示订阅K线失败
请问,    SubscribeBar("ag999.SHFE","1h",20200101);订阅失败什么原因
如何订阅股指期权平值合约的行情
用什么函数可以订阅所有沪深300历史期权的历史数据进行回测?
期权回测架构的尝试

获得期权标识

Integer getOptionSign(Integer DataIDX, ArrayRef<String> OptionSign)
	{
		OptionSign[0] = "C";
		OptionSign[1] = "P";
		If(Data[DataIDX].Exchange == ".SSE" || Data[DataIDX].Exchange == ".CFFEX" || Data[DataIDX].Exchange == ".GFEX" || Data[DataIDX].Exchange == ".DCE")
		{
			OptionSign[0] = "-C-";
			OptionSign[1] = "-P-";
		}
		Return 0;
	}


这你是做了个函数吗,但行权价这块怎么弄啊?

行权价问题

前面回复都说的很详细了


包括其他注意点

不是简单的算一下

就一定是ATM

13935/250=55.74*250=14000

?


56*250=14000

我手算也没问题


不过这种方式还是不可取

很多品种行权间距都是有变化的

算出来值不一定凑得上

大多情况下需要算法矫正

这是你上面的代码运行出来的结果

//relativesymbol是空值,注释掉了


下面是把你输入的13935改成close参数,也没问题


所以,你的问题是什么?

我看你的截图

TBQ3界面还是挺优美的呀

很喜欢它的界面

分屏是我最爱

好奇怪,在你那儿运行是正常的啊,你看我这儿是这样的

你程序编译

把策略或K线上参数再看看

程序重新设置参数

不会改变策略已有参数

你这个正常啊

ATM是个理论值

有没有这个档不一定

要看行权价间距的


如果你不要求非常精确的档位

以品种的最小间距循环订阅直到成功


如果你要求非常精确的档位

我有个帖子去翻一下

可以获得所有期权标的

现在两种模式我实盘都有用到

看你自己策略逻辑需要


还有一个要提醒你

OnReady域订阅意义不大

无论是兼顾回溯历史还是实盘只交易当日期权

都应该是放到OnBarOpen去处理

历史回溯 用数组记录每个bar.Open或者bar.Close[1]

一次性订阅所需要用到的期权


当日交易就比较简单

只需要订阅当天所需的1-2个期权标的



好的,我还要和你多学习学习