自动获得期权行权价间距

《TBQuant如何获得期权“行权价间距”》

   在动态加载期权合约时,要知道订阅哪些“档位”的合约。我们只有知道当前价格和行权价间距,才能合理、正确的订阅期权合约。比如rb2510当前价格2980,上下几档分析是3100,3050,3000,2950,2900,螺纹行权价间距是50。

    获得“行权价间距”有两种方法。第一种,是代码人工设定,代码示例如图一。实现比较简单。缺点是比较死板。有些品种行权价很特殊,比如橡胶是250,黄金是8;有些品种会随着价格变化,行权价间距会变化,比如黄金以前是2。

   需要一种更灵活的方法,获得“行权价间距”,思路如图二。1、通过GetSymbols函数获得所有rb2010的期货合约;2、提取这些合约的行权价,计算“行权价间距”。这个方法是动态的,适应能力强,不担心间距的变化。

如何获取期货合约对应的所有期权合约或者行权价、行权价间距
如何获取期货合约对应的所有期权合约或者行权价、行权价间距
怎么在工作区上显示这个期权合约的平值行权价?
程序化交易中期权行权的代码如何编写?
程序化交易中期权行权的代码如何编写?
关于期权行权是否能够程序化操作
权证如何行权?
a函数获期权的报价问题
通过订阅实现甄别对应商品的平值期权的方法?
求助:能否让程序自动选择某个合约下单

是的,目前为止都是自己计算

本来想写一系列期权函数

不想写了

太累

👍

//ReadStrikeInterval,通过读取合约,价格计算出期权行权价间隔。取消月份过滤

Numeric ReadStrikeInterval(string inSymbolType,string inExchangeCode)

{

//函数变量声明

// inSymbolType,期货商品代码

// inCurrentPrice,期货商品当前的价格

// StrikeInterval

Numeric StrikeInterval;

//一、根据期货代码,输出所有期权合约。

Array<String> symbols;

string myCode = inSymbolType + "." + inExchangeCode;

     

if(inExchangeCode=="CFFEX") //股指期权要做特殊处理

{

print("金融版块,期权名字转换,IH IF IC IM,HO IO CO MO");

if (inSymbolType=="IH")

myCode = "000016.SSE";

else if(inSymbolType=="IF")

myCode = "000300.SSE";

else if (inSymbolType=="IC")

myCode = "000852.SSE";

else if (inSymbolType=="IM")

myCode = "999999.SSE";

}

     

//期权"rb.SHFE"

       Integer ret = GetSymbols(myCode,Enum_CategoryOptions,symbols);

       print(myCode + " ret=" + Text(ret) + ",symbols size = "+Text(GetArraySize(symbols)));

       print("所有合约" + TextArray(symbols) );

               

               

       

//二、根据读取的合约,计算行权间隔

Array<Numeric> arrStrike;

Array<Numeric> arrStrike2;

Numeric oneStrike;

Numeric i;

//二.1、根据读取的合约,计算行权价

for i = 0 to GetArraySize(symbols)-1

{

//rb2510C3550.SHFE,取出3550

Array<String> arr;

StringSplit(symbols[i], ".", arr); //rb2510C3550.SHFE,取出rb2510P3550

String Mysymbol1 = arr[0];//rb2510C3550

Array<String> arr2;

StringSplit(Mysymbol1, "C", arr2); //rb2510C3550,取出3550

String Mysymbol2 = arr2[1];//3550


oneStrike = Value(Mysymbol2);

if( oneStrike <>InvalidInteger )

{

ArrayPushBack(arrStrike,oneStrike);

}

}

//二.2 根据行权价数组,计算行权间隔。

ArraySort(arrStrike, False);//数组降序排序

       Print("降序排序结果:" + TextArray(arrStrike));

       

       Array<Numeric> arrStrikeInterval;

for i = 0 to GetArraySize(arrStrike)-2

{

Numeric oneStrikeInterval = arrStrike[i] - arrStrike[i+1];

ArrayPushBack(arrStrikeInterval,oneStrikeInterval);

}

Print("arrStrikeInterval:" + TextArray(arrStrikeInterval));

//清理数组里0值

       Array<Numeric> arrStrikeInterval2;

for i = 0 to GetArraySize(arrStrikeInterval)-1

{

if(arrStrikeInterval[i]>0)

ArrayPushBack(arrStrikeInterval2,arrStrikeInterval[i]);

}

Print("清零后arrStrikeInterval2:" + TextArray(arrStrikeInterval2));

//计算出现次数最多的值

Array<Numeric> dest;

ArrayPushBack(arrStrikeInterval2,999999);//ModeArray有bug,需要塞一个假的数据进去。

       ModeArray(arrStrikeInterval2, dest);//求数组的众数

       //Print("dest:" + TextArray(dest));

       strikeInterval = dest[0];

       Print("最终的行权价间距:" + Text(strikeInterval) );

       

return strikeInterval;

}


OnReady()

{

Numeric interval = ReadStrikeInterval(SymbolType(),ExchangeCode());

Print(SymbolType() + " 标的价格=" + text(Close) +" 行权价间距=" + text( interval) );