自动获得期权行权价间距
《TBQuant如何获得期权“行权价间距”》 在动态加载期权合约时,要知道订阅哪些“档位”的合约。我们只有知道当前价格和行权价间距,才能合理、正确的订阅期权合约。比如rb2510当前价格2980,上下几档分析是3100,3050,3000,2950,2900,螺纹行权价间距是50。 获得“行权价间距”有两种方法。第一种,是代码人工设定,代码示例如图一。实现比较简单。缺点是比较死板。有些品种行权价很特殊,比如橡胶是250,黄金是8;有些品种会随着价格变化,行权价间距会变化,比如黄金以前是2。 需要一种更灵活的方法,获得“行权价间距”,思路如图二。1、通过GetSymbols函数获得所有rb2010的期货合约;2、提取这些合约的行权价,计算“行权价间距”。这个方法是动态的,适应能力强,不担心间距的变化。
//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) );