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
13935/250=55.74*250=14000
?
56*250=14000
我手算也没问题
不过这种方式还是不可取
很多品种行权间距都是有变化的
算出来值不一定凑得上
大多情况下需要算法矫正
这是你上面的代码运行出来的结果
//relativesymbol是空值,注释掉了
下面是把你输入的13935改成close参数,也没问题
所以,你的问题是什么?
我看你的截图
TBQ3界面还是挺优美的呀
很喜欢它的界面
分屏是我最爱
好奇怪,在你那儿运行是正常的啊,你看我这儿是这样的
你程序编译
把策略或K线上参数再看看
程序重新设置参数
不会改变策略已有参数
你这个正常啊
ATM是个理论值
有没有这个档不一定
要看行权价间距的
如果你不要求非常精确的档位
以品种的最小间距循环订阅直到成功
如果你要求非常精确的档位
我有个帖子去翻一下
可以获得所有期权标的
现在两种模式我实盘都有用到
看你自己策略逻辑需要
还有一个要提醒你
OnReady域订阅意义不大
无论是兼顾回溯历史还是实盘只交易当日期权
都应该是放到OnBarOpen去处理
历史回溯 用数组记录每个bar.Open或者bar.Close[1]
一次性订阅所需要用到的期权
当日交易就比较简单
只需要订阅当天所需的1-2个期权标的
好的,我还要和你多学习学习