请教关于”数据中心”中“基础数据”的使用问题

Params

   Numeric pe_rate(0.5);        //pe指标的权重

   Numeric roe_rate(0.5);        //roe指标的权重

 

Vars

   Dic<Array<Numeric>> pershare(\"TB_PUB_DAY_PCP\");        //日仓差%

   Dic<Array<Numeric>> eargo(\"TB_PUB_DAY_RISEPCT\"); //涨幅

   Series<Numeric> cangc;                      //今日仓差%

   Series<Numeric> zhangdf;                     //涨跌幅

   

   Global Array<Integer> id11;              //排序下标数组

   Global Array<Integer> id22;              //排序下标数组

   Global Array<Integer> id33;              //排序下标数组

   Global Array<Integer> id44;              //排序下标数组

   Global Array<Integer> id31;              //排序下标数组

   Global Array<Integer> id32;              //排序下标数组

   Global Array<Numeric> id;                //排序下标数组

   Global Numeric n;                        //买入股票的支数    

   Global Numeric i;                        //循环变量

   Numeric lots;                            //下单手数

Events

   OnInit()

   {    

       Range[0:DataCount-1]

       {

           AddDataFlag(Enum_Data_RolloverBackWard());    //设置后复权

       }

   }

   onBar(ArrayRef<Integer> indexs)

   {

       //读取相关指标

       Range[i = 0:DataCount - 1]

       {

          if(pershare[0][0]<>InvalidNumeric)

               cangc = pershare[0][0];

           if(eargo[0][0]<>InvalidNumeric)

               zhangdf = eargo[0][0];

           Commentary(\"仓差:\"+text(cangc));

           Commentary(\"涨幅:\"+text(zhangdf));

}

}


如以上代码,我在白天交易时间运行时,commentary显示的数据与实时行情是一直的。但在晚上21:00以后的交易时段,相关的仓差和涨幅的数据没有在bar上改变,仍然是白天收盘时的数据,请教是什么问题?

基础数据问题
关于数据中心,问几个问题
关于基础数据持续写入
一个关于基础数据使用的问题
官方文档中【添加和删除自定义基础数据】的demo有几个问题请教一下
数据中心怎么使用到TBQ代码中,有没有文字或者视频教程???
关于订阅基础数据参数优化的问题
tbpy读取基础数据权限问题
数据中心同步
基础数据回溯的时间取值问题

有具体的品种吗?

刚59分截图的,有夜盘的螺纹,看上去挺正常

data-href=

为了验证mashaobin的说法,我把测试代码稍微修改了一下,主要是为了大家讨论问题的时候,数据测试环境一致性,所以我提供的测试代码已经把数据源订阅都写好了,不用手动订阅。一开始测试的时候,很顺利,没有发现【mashaobin】的提到的问题,【基础数据】提供的2个系统指标【仓差百分比】和【涨幅百分比】与理论计算值都是一致的,没有问题,但是当我扩大测试范围后,发现如下问题:

(1)基础数据【涨幅百分比】的【最后3项】,也就是【60日涨幅%】【120日涨幅%】【年初至今涨幅%】的系统指标与【理论计算值】不一致。

(2)基础数据【仓差百分比】的【最后3项】,也就是【60日涨幅%】【120日涨幅%】【年初至今涨幅%】的系统指标,偶尔也会与【理论计算值】不一致。

(3)实盘时,通过基础数据获取的【涨幅百分比】【仓差百分比】这2个系统指标的值,永远是慢1个Tick,换句话说,不是根据实时Tick数据计算的值,而是上1个Tick数据计算得到的值。

另外【mashaobin】描述问题的时候,专门强调了【基础数据】提供的2个指标数据错误发生在夜盘,所以我在21:00夜盘也跑了一下测试代码,果然发现问题复现,具体原因我通过反向测算,发现TB系统指标的算法有Bug,夜盘21:00以后的开盘的Bar数据:【持仓量OpenInt】【收盘价Close】应该计入下一个交易日,换句话说TB在计算【涨幅百分比】和【仓差百分比】的时候,没有按照TrueDate计算,而是按照自然日计算得到。所以白天理论计算值与系统基础数据的值除了上面提到的问题外,大部分基本一致,但是夜盘就完全不一致,详见日志截图。

测试代码,如下:

Vars
	Array<Integer> DeltaDaysArr([1, 3, 5, 10, 20, 60, 120]);
	Dic<Array<Numeric>> DayPCP(TB_PUB_DAY_PCP); //系统指标 期货 (当日持仓量-前持仓量)/前持仓量*100% 仓差%:1日、3日、5日、10日、20日、60日、120日、年初至今
	Dic<Array<Numeric>> DayRISEPCT(TB_PUB_DAY_RISEPCT); //系统指标 证券期货 (当日收盘价-前收盘价)/前收盘价*100% 涨幅%:1日、3日、5日、10日、20日、60日、120日、年初至今
	
	Array<Numeric> DeltaPositionPercentArr;
	Array<Numeric> ClosePriceRisePercentArr;
	
	Global Numeric FisrtTradeDateOfYearOpenInt;
	Global Numeric FisrtTradeDateOfYearClosePrice;
	
Defs
	Bool isFisrtTradeDateOfYear(Numeric InputDate){
		Bool res;
		res = InputDate == NextTradingDay(YearFromDateTime(InputDate) * 10000 + 0101);
		Return res;
	}
	
Events
	OnInit(){
		 SubscribeBar(rb888.SHFE, 1d, 20230101, 0);
	}

	OnBar(ArrayRef<Integer> indexs){
		Integer i;
		
		If(BarStatus == 2) Print(================ + DateToString(Date) +   + TimeToString(CurrentTime) + =======================);
		Else Print(================ + DateToString(Date) + =======================);
		
		If(isFisrtTradeDateOfYear(Date)){
			FisrtTradeDateOfYearOpenInt = OpenInt[1];
			FisrtTradeDateOfYearClosePrice = Close[1];
			Print(DateToString(Date[1]) +  持仓量= + Text(OpenInt) +  收盘价= + Text(Close));
		}
		
		//理论计算值 仓差百分比、涨幅百分比
		ArrayClear(DeltaPositionPercentArr);
		ArrayClear(ClosePriceRisePercentArr);
		For i = 0 To GetArraySize(DeltaDaysArr) - 1{
			Integer tmpDays = DeltaDaysArr[i];
			//ArrayPushBack(DeltaPositionPercentArr, Round((OpenInt - OpenInt[tmpDays]) / OpenInt[tmpDays] * 100,2));
			ArrayPushBack(DeltaPositionPercentArr, (OpenInt - OpenInt[tmpDays]) / OpenInt[tmpDays] * 100);
			//ArrayPushBack(ClosePriceRisePercentArr, Round((Close - Close[tmpDays]) / Close[tmpDays] * 100,2));
			ArrayPushBack(ClosePriceRisePercentArr, (Close - Close[tmpDays]) / Close[tmpDays] * 100);
		}
		//ArrayPushBack(DeltaPositionPercentArr, Round((OpenInt - FisrtTradeDateOfYearOpenInt) / FisrtTradeDateOfYearOpenInt * 100,2));
		ArrayPushBack(DeltaPositionPercentArr, (OpenInt - FisrtTradeDateOfYearOpenInt) / FisrtTradeDateOfYearOpenInt * 100);
		//ArrayPushBack(ClosePriceRisePercentArr, Round((Close - FisrtTradeDateOfYearClosePrice) / FisrtTradeDateOfYearClosePrice * 100,2));
		ArrayPushBack(ClosePriceRisePercentArr, (Close - FisrtTradeDateOfYearClosePrice) / FisrtTradeDateOfYearClosePrice * 100);
		Print(理论计算仓差: + TextArray(DeltaPositionPercentArr));
		Print(基础数据仓差: + TextArray(DayPCP[0]));
		Print(理论计算涨幅: + TextArray(ClosePriceRisePercentArr));
		Print(基础数据涨幅: + TextArray(DayRISEPCT[0]));
	}

直接上日志打印图,有些是偶发,无法上全,自己用测试代码运行一下就有了,甚至可以将数据源订阅起始日期修改一下,时间再次拉长测试:

data-href=

data-href=

下图是2024年05月24日(周五)夜盘21:30执行的日志,所以按照TrueDate的规则Bar数据都是计入下一个交易日的,也就是下周一,所以Bar的Date是2024年05月27日,也是打印日志的日期,但是实盘日志的时间则选用的是机器时间CurrentTime,因为订阅的是1日线。

data-href=