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

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


订阅虚值10%最活跃的一个活跃期权
TBPY问题请高手老师指点
我用chatgtp 编译成功了一个策略,有老师高手请求指点,谢谢!
老师请指点
期权合约订阅问题
能提供一下tb中的全部期货和期权合约的名字吗?
期货期权
开盘时间的挂单及后续订单管理的策略开发思路
想根据期货行情的涨跌指标信号,下单交易期权,能实现吗
根据期货标的信号,tbq3量化如何选择期权来执行?