程序1:
//------------------------------------------------------------------------
// 简称: gp1
// 名称:
// 类别: 策略应用
// 类型: 用户应用
// 输出: Void
//------------------------------------------------------------------------
Params
// 参数定义
Numeric numdate(1);
Vars
// 变量定义
Global Numeric i;
Global Numeric k;
Global Numeric n;
Global array<string> mysymbol;
Global Numeric CurrentBarIndex;
Global Array<Numeric> prevClose; // 昨日收盘价
Global Array<Numeric> currentfx;
Events
// 初始化事件函数
OnInit()
{
mysymbol=["002129.SZSE", "600732.SSE", "300438.SZSE","688256.SSE"];
//mysymbol=["SR605.CZCE","OI605.CZCE", "FG605.CZCE", "MA601.CZCE"];
Numeric date1=PreTradingDay(mysymbol[0], CurrentDate(), numdate);
for i =0 to GetArraySize(mysymbol)-1
{
SubscribeBar(mysymbol[i],"1m",date1);
}
for i =0 to GetArraySize(mysymbol)-1
{
SubscribeBar(mysymbol[i],"1d",date1);
}
n=GetArraySize(mysymbol);
}
OnBaropen(ArrayRef<Integer> indexs)
{
CurrentBarIndex = data[0].BarsSinceToday();
}
OnBar(ArrayRef<Integer> indexs)
{
if (Date>=CurrentDate)
{
for k = 0 to GetArraysize(indexs) - 1
{
i = indexs[k];
if (i < n)
{
print(DateTimeToString(date + CurrentTime) + "图层" + text(i) + data[i].SymbolName + "3正常运行" + text(data[i].close)+"bar时间"+TimeToString(data[i].time));
}
}
}
}
程序2:
只对订阅的股票进行了改动,其他位置未变:
mysymbol=["399317.SZSE","002129.SZSE", "600732.SSE", "300438.SZSE","688256.SSE"];
程序1输出:

程序2输出:

可以发现,指数第一个tick到来时间比较晚,9:25:13左右,股票第一个tick在9:25:07左右。
那问题是,为什么程序2只是增加订阅了1个指数,股票数据怎么在集合竞价不输出了呢?
是程序语法的问题吗?
如果图层0的数据没来,即使图层1的数据来的时候,所有的onbar内容不涉及图层0的部分也都不工作了?
Numeric date1=PreTradingDay(mysymbol[0], CurrentDate(), numdate);是不是这句问题
这个函数对指数是否无效?
从订阅的角度来讲,都订阅成功了,并且onInit只执行一次对不对,这样的话应该对后面没有影响,对吧?
你上次说的对齐的原因和老师说的多图层运行机制的原因,我大概明白了。
应该是这方面的原因。
但是还有一些关于指数的细节还没有搞明白
好吧,明天我再试试是不是你现在说的这个原因
if (Date>=CurrentDate)
{}目前从逻辑上来看,
上面这条语句隐含了data0.Date>=CurrentDate的条件,
所以,data0第一个tick数据没来的时候,if后面的程序没有执行。
data0.Date>=CurrentDate这句是有问题
指数的tick会晚3秒
个股是正常的传输
所以被屏蔽了
https://bbs.tbquant.net/thread/20250715134720931774
我之前策略也用到指数
所以测试过
延时是3秒钟
所以还重新做了算法修正
如果你需要用到指数
且必然会订阅个股
那就用Data1的Date作为判断
还有个问题一并提醒你一下
第一笔tick未必是集合竞价数据
有时候是标志是历史数据
所以要做个判断并抛弃掉
你说的“第一笔tick未必是集合竞价数据,有时候是标志是历史数据”
是下面这种情况吗?
“如果data0第一个tick来的时候,data1第一个tick还没来,此刻应用data1.close是引用的历史数据。”
好的!看起来应该是破案了!
你说的“第一笔tick未必是集合竞价数据,有时候是标志是历史数据”
是下面这种情况吗?
“如果data0第一个tick来的时候,data1第一个tick还没来,此刻引用data1.close是引用的历史数据。
不完全是这个意思
你说的,是我上个帖子告诉你的数据对齐范畴
有时候
因为个股基础数据有很多
集合竞价数据传过来之前
会有历史补充数据传过来触发onbar
需要加入诸如此类的校验
if(Data[x].QuoteStatus != Enum_QuoteStatus_Supplement && Data[x].QuoteStatus != Enum_QuoteStatus_History)
9:25:13 有时间就证明有集合竞价tick
至于你后面说的一堆东西,先理解多图层的公式运行机制
好的,多谢指点!