指标编写

您好,我想写一个指标,比较各期货对应合约的持仓量/指数的持仓量,我应该如何在oninti域里, 处理下代码, 订阅下对应指数。// 简称: JM_OI_Ratio// 名称: 焦煤持仓量比(合约/指数)// 类别: 公式应用// 输出: Void//------------------------------------------------------------------------Params String IndexSymbol("jm999.dce"); // 焦煤品种加权指数,小写+交易所后缀Vars Numeric ContractOI; // 当前合约持仓量 Numeric IndexOI; // 指数持仓量 Numeric OIRatio; // 持仓量比值 Integer LayerId; // 订阅返回的图层号Events OnInit() { // 订阅焦煤指数作为 Data1 // 周期用小写 1d,开始时间给早一点保证数据充足 LayerId = SubscribeBar(IndexSymbol, "1d", 20200101.0930); } OnBar(ArrayRef<Integer> indexs) { // 只在主合约图层(Data0)上计算 Range[0:0] { ContractOI = OpenInt; // 通过 Data[1] 读取指数持仓量 IndexOI = Data[1].OpenInt; If(IndexOI > 0) { OIRatio = ContractOI / IndexOI; } Else { OIRatio = 0; } PlotAuto("持仓量比", OIRatio, 0, Color2()); // 调试:在K线上显示数值,方便确认数据源正常 Commentary("合约OI=" + Text(ContractOI) + " 指数OI=" + Text(IndexOI)); } }

Vars Global Integer izs; Plot plt_vol; Plot plt_OpenInt; Defs // 订阅全市场指数(用于期货日线全市场成交/持仓) string zs() { If(Category == Enum_CategoryFutures) { Return IIFString(Len(SymbolType) == 1, SymbolType + "9000" + "." + ExchangeCode, SymbolType + "000" + "." + ExchangeCode);//单代码得加9000 } Else { Return Symbol; } } Events OnInit() { If(Frequency == "1d")//只在日线显示指数的数据 { izs = SubscribeBar(zs, "1d", BeginDateTime); // 订阅全市场指数数据 Data[izs].Hide; } Range[0:DataCount - 1] { plt_vol.setOption("Vol", "x-format", "time"); plt_vol.setOption("Vol", "style", Enum_Fill); plt_vol.figure(0); plt_OpenInt.subplot(plt_vol); plt_OpenInt.setOption("margin-bottom", "30%"); } } OnBar(ArrayRef<Integer> indexs) { If(izs != -1 And Category == Enum_CategoryFutures) { plt_vol.setOption("Vol", "color", IIF(C > O, Rgb(255, 88, 88), Rgb(0, 255, 255))); plt_vol.barv("Vol", V); plt_OpenInt.setOption("持仓量", "color", IIF(OpenInt > OpenInt[1], Red, Green)); plt_OpenInt.line("持仓量", OpenInt); plt_OpenInt.setOption("全持仓", "color", IIF(Data[izs].OpenInt > Data[izs].OpenInt[1], Red, Green)); If(Data[izs].Vol != InvalidInteger) { plt_vol.setOption("Volzs", "color", IIF(Data[izs].C > Data[izs].O, Rgb(255, 88, 88), Rgb(0, 255, 255))); plt_vol.barv("Volzs", Data[izs].Vol); plt_OpenInt.line("全持仓", Data[izs].OpenInt); } } }

拼指数的代码 // 解析当前合约: Symbol() 形如 "rb2510.SHFE" String curSym = Symbol(); String exch = Section(curSym, ".", 1); // 交易所后缀, 如 "SHFE" String product = SymbolType(); // 品种代码, 如 "rb" // 构造指数合约代码: 品种 + 000 + .交易所 gIndexCode = product + "000." + exch; // 如 "rb000.SHFE"

回复:大部分品种是000,999,但我应用在焦炭时,焦炭是9000,9999,有办法统一处理吗?

回复:自己写代码,拼