目前订阅的是虚值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);
}
}