全部 TBQuant功能 TBL语言 TB开户 问答专区 其他
跨周期引用如何在小周期实时显示大周期指标?
2022-07-03 19:06

跨周期比如5M显示日线的5日均线指标时,如果直接引用大周期本周期的均线指标,就相当于使用了未来函数(盘中直接取到了收盘时的计算值),但如果取前一天的指标数据,又不及时,效果如图:

但是,我用其他软件显示跨周期时,就是真实的盘中指标计算值(一天当中在动态变化):

tb的源代码如下:


Vars
    Numeric Lots;// 交易手数
    Series<Numeric> Ma;// 均线
    
Events
onBar(ArrayRef<Integer> indexs)
{
    // 日线显示5日均线
    Range[1:1]
    {
        Ma = AverageFC(Close,5);
        PlotNumeric("day-5日均线",Ma);
    }
    
    // 5M显示日线5日均线
    PlotNumeric("5M-5日均线",data1.Ma);
}

tb中,怎么写才能实现上面的跨周期的指标的实时计算值?

 

 

AITrading

不是太明白为何这样写?那如果是写日线的macd指标又如何写了?

2022-07-04 21:29
tblaocai
@AITrading

您好!这个问题就涉及对TB公式运行机制的理解了。我们知道历史K线数据和实时K线数据在跑策略时是不同的,历史K线的开高低收都已经固定,跑策略只是用这些数据运行一次策略就可以了,而实时K线,随着行情的变化,开高低收是一直在变化的。按理来说,这两种情况要分开处理,历史数据用历史回测的机制来运行公式,实时行情用实时交易的机制运行公式。但是TB的机制比较独特,它需要同时兼顾历史回测和实时交易。也就是说实时交易时,策略能够根据价格的实时变化产生交易信号,而当实时行情走完变成历史后,按照历史数据的机制再跑一遍策略,信号必须与实时跑策略产生的信号一模一样。也就是说,只凭历史K线的开高低收这几个数据,就能保证公式历史回测结果和实盘运行结果一样。这就是为什么我们要求策略不能有信号闪烁,因为信号一闪烁,历史回测跟实盘结果就肯定不一样了。

回到您的问题。在叠加了5分钟和日线两个数据源的情况,公式在不同数据源上还是独立运行的,两个数据源之间的数据交互是会通过时间对齐来建立对应关系的。但一个交易日,日线只有1根,而5分钟线有很多根,他们之间的对应关系是多对1的关系。1根日线对应不同的5分钟K线时,开高低收是不一样的,但这些中间状态的开高低收数据在日K线上是无法保存下来的,即便实时交易时根据这些中间数据产生过信号,一旦日线收盘后,随着这些中间数据的消失,最终的信号还是只能根据日线最后收盘的开高低收来产生,也就是说所有的5分钟对应的其实都是日线收盘的状态,所以这里就会有使用未来数据的问题。

而我给您修改的写法,就是把日线实时交易时对应每个5分钟的状态(具体就是您要的均线指标)记录在5分钟K线上,这样即使5分钟收盘成为历史了,这些数据是能够保存下来的,所以就可以使用而且不存在未来数据问题了。

当然,均线的实现相对容易一些,MACD会难一些。但只要顺着这个思路去实现,都是可以解决的。

2022-07-05 23:24
tblaocai

最后两句改成:

            // 5M显示日线5日均线
        Ma = (data1.MA[1]*5-data1.Close[5]+Close)/5;
        PlotNumeric("5M-5日均线",Ma);

2022-07-03 22:55
您未登录,请先 登录注册 后发表评论
顶部