指标编写
您好,我想写一个指标,比较各期货对应合约的持仓量/指数的持仓量,我应该如何在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,有办法统一处理吗?
回复:自己写代码,拼