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上改变,仍然是白天收盘时的数据,请教是什么问题?
有具体的品种吗?
刚59分截图的,有夜盘的螺纹,看上去挺正常
为了验证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]));
}
直接上日志打印图,有些是偶发,无法上全,自己用测试代码运行一下就有了,甚至可以将数据源订阅起始日期修改一下,时间再次拉长测试:
下图是2024年05月24日(周五)夜盘21:30执行的日志,所以按照TrueDate的规则Bar数据都是计入下一个交易日的,也就是下周一,所以Bar的Date是2024年05月27日,也是打印日志的日期,但是实盘日志的时间则选用的是机器时间CurrentTime,因为订阅的是1日线。