订阅期权失败
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呢?奇怪。麻烦老师有空帮我分析一下,谢谢
看你们的回答,就是编译后以为参数也会改可以重新加载或者恢复默认
下次回答问题要绕过你个老六😡
回复:哈哈哈哈哈哈但是你的思路很值得学习
回复:期权集函数捋出来没?早点备着有用两种思路都要熟练掌握
回复:有很多算法细节琢磨一下
回复:琢磨啊琢磨 小鸡啄米咯咯哒哈哈哈哈哈你咯前面跑 我腿短 慢慢追
获得期权标识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
回复:这种-c-和-p-能直接获取到?
回复:固定的格式啊
13935/250=55.74*250=14000?
回复:56*250=14000我手算也没问题不过这种方式还是不可取很多品种行权间距都是有变化的算出来值不一定凑得上大多情况下需要算法矫正
这是你上面的代码运行出来的结果//relativesymbol是空值,注释掉了下面是把你输入的13935改成close参数,也没问题所以,你的问题是什么?
回复:我看你的截图TBQ3界面还是挺优美的呀
回复:很喜欢它的界面分屏是我最爱
回复:好奇怪,在你那儿运行是正常的啊,你看我这儿是这样的
回复:你程序编译把策略或K线上参数再看看程序重新设置参数不会改变策略已有参数
回复:13935/250=55.74round 后5656*250=14000不知道为啥你不行
回复:13935/25=557.4558*25=13950我感觉你是不是round地方被你改错了
回复:怀疑是策略或图表的参数被你设置成了25?是不是还用了roundup
回复:或者是你为了向上取CALL的OTM代码里用算出来的值加了行权间距13935/25=557.4557*25=1392513925+25=13950破案了我服了你个老六
回复:你是被期权订阅折腾废了😂
回复:你给我提供了思路,我把我的Strike_Price_step打出来看了一下,竟然是50,可是我在定义参数的时候设的默认值是250啊,50是之前的品种,用在橡胶时我改成250了,不知道为啥参数修改后实际值 没有变
你这个正常啊ATM是个理论值有没有这个档不一定要看行权价间距的如果你不要求非常精确的档位以品种的最小间距循环订阅直到成功如果你要求非常精确的档位我有个帖子去翻一下可以获得所有期权标的
回复:现在两种模式我实盘都有用到看你自己策略逻辑需要还有一个要提醒你OnReady域订阅意义不大无论是兼顾回溯历史还是实盘只交易当日期权都应该是放到OnBarOpen去处理历史回溯 用数组记录每个bar.Open或者bar.Close[1]一次性订阅所需要用到的期权当日交易就比较简单只需要订阅当天所需的1-2个期权标的
回复:好的,我还要和你多学习学习