提供一个根据期货订阅期权思路,希望各位老师及群内高手指点

目前订阅的是虚值10%左右的期权(想订阅平值的,大家可以直接更改,感觉这个代码订阅平值的更实用),改进了下思路,之前的想法是订阅所有期权合约,然后再通过比较复杂的步长什么计算才能得出,发现自己根本实现不了,简化了下,直接根据价格范围取整数。缺点,针对特定合约仍然无法提取比较活跃的合约,比如黄金,另外取出的合约有时便远,仍不活跃,比如针对白银,假设我计算的价格是15055,他取的看涨合约是16000,如果计算的是14955,取的是15000,但实际上两个15000都是更好的,希望各位老师以及社区的高手可以提些改进意见,非常感谢!Params Numeric millsecs(2000); Numeric MarginRatio(0.1); Numeric BigPriceThre(100000); Vars Array<String> SignBuf; String ExchCode; Global Integer timerId; Numeric S; Numeric UpperLimit; Numeric downperLimit; Numeric upstrike1; Numeric downStrike1; Numeric upstrike2; Numeric downStrike2; Numeric sdmar; String a1; String a2; String b1; String b2; Defs Integer getOptionSign(Integer DataIDX, ArrayRef<String> OptionSign) { OptionSign[0] = "C"; OptionSign[1] = "P"; If(Data[DataIDX].ExchangeCode == "SSE" || Data[DataIDX].ExchangeCode == "CFFEX" || Data[DataIDX].ExchangeCode == "GFEX" || Data[DataIDX].ExchangeCode == "DCE") { OptionSign[0] = "-C-"; OptionSign[1] = "-P-"; } Return 0; } Events OnInit() { PrintClear(); // SetArraySize补充第三个默认空字符串参数,解决1040报错 SetArraySize(SignBuf, 2, ""); timerId = createTimer(millsecs); // Array<String> symbols; //Integer size = GetOptSymbolsByCode(Symbol,symbols); //print("size = "+Text(size) + ",symbols = " + TextArray(symbols)); //目前智大不支持 } OnReady() { Print("ExpiredDateTime:" + Text(ExpiredDateTime(),0)); } OnTimer(Integer id,Integer intervalMillsecs) { if(id == timerId) { ExchCode = Data[0].ExchangeCode; getOptionSign(0, SignBuf); Print("=======分隔======"); Print("BarType:" + Text(BarType())); Print("保证金:" + Text(MarginRatio())); Print(MainSymbol()); Print("代码:" + ExchCode); Print("Call标识:" + SignBuf[0]); Print("Put标识:" + SignBuf[1]); sdmar=min(MarginRatio(),0.12); S = Close[0]; UpperLimit = S * (1 + sdmar); downperLimit = S * (1 - sdmar); /// Print(ContinuousSymbol()); ///Print(Symbol()); Bool ret = Exact(ContinuousSymbol(), Symbol()); // Print("Exact,ret:" + IIFString(ret, "True", "False")); if (ret) { a1 = MainSymbol(); b1 = MainSymbol(); a2 = MainSymbol(); b2 = MainSymbol(); } Else { a1 = Symbol(); b1 = Symbol(); a2 = Symbol(); b2 = Symbol(); } Print(a1); //Print(a2); ///Print(b1); // Print(b2); If(S > 200000) { upStrike1 = Ceiling(UpperLimit, 25000) ; upStrike2 = Floor(UpperLimit, 25000) ; downStrike1 = Floor(downperLimit, 25000) ; downStrike2= Ceiling(downperLimit, 25000) ; } ELSE If(S > 100000) { upStrike1 = Ceiling(UpperLimit, 10000) ; upStrike2 = Floor(UpperLimit, 10000) ; downStrike1 = Floor(downperLimit, 10000) ; downStrike2= Ceiling(downperLimit, 10000) ; } ELSE If(S > 10000) { upStrike1 = Ceiling(UpperLimit, 1000) ; upStrike2 = Floor(UpperLimit, 1000) ; downStrike1 = Floor(downperLimit, 1000) ; downStrike2= Ceiling(downperLimit, 1000) ; } ELSE If(S > 5000) { upStrike1 = Ceiling(UpperLimit, 500) ; upStrike2 = Floor(UpperLimit, 500) ; downStrike1 = Floor(downperLimit, 500) ; downStrike2= Ceiling(downperLimit, 500) ; } ELSE If(S > 2500) { upStrike1 = Ceiling(UpperLimit, 100) ; upStrike2 = Floor(UpperLimit, 100) ; downStrike1 = Floor(downperLimit, 100) ; downStrike2= Ceiling(downperLimit, 100) ; } ELSE If(S > 1000) { upStrike1 = Ceiling(UpperLimit, 100) ; upStrike2 = Floor(UpperLimit, 100) ; downStrike1 = Floor(downperLimit, 100) ; downStrike2= Ceiling(downperLimit, 100) ; } ELSE If(S < 1000) { upStrike1 = Ceiling(UpperLimit, 8) ; upStrike2 = Floor(UpperLimit, 8) ; downStrike1 = Floor(downperLimit, 8) ; downStrike2= Ceiling(downperLimit, 8) ; } StringReplace(a1, ".", SignBuf[0] + text(upStrike1) + "."); StringReplace(a2, ".", SignBuf[0] + text(upStrike2) + "."); StringReplace(b1, ".", SignBuf[1] + text(downStrike1) + "."); StringReplace(b2, ".", SignBuf[1] + text(downStrike2) + "."); Print("UpperLimit:"+Text(UpperLimit)); Print("downperLimit:"+Text(downperLimit)); Print(a1); Print(a2); Print(b1); Print(b2); if((Close[0] > Close[240] and BarType()==1) or (Close[0] > Close[1] and BarType()==0)) { SubscribeBar(a2, Frequency, BeginDateTime); SubscribeBar(a1, Frequency, BeginDateTime); } else if((Close[0] < Close[240] and BarType()==1) or (Close[0] < Close[1] and BarType()==0)) { SubscribeBar(b2, Frequency, BeginDateTime); SubscribeBar(b1, Frequency, BeginDateTime); //目前小于1000的主要是黄金,也做不成 } Bool ret1 = StopTimer(id); } }

可以用getsymbols,获取所有期权,再处理

回复:想过,再难了,得学习一段时间