公式在计算时按照“Bar数据”的Bar数目,从左边第一个Bar依次执行到右边最后一个Bar,在单个Bar数据上的公式运算为从上到下完整执行公式中所有语句,即每次公式的运算都是从公式最上方的语句“参数的声明、变量的声明”开始直至公式的计算主体onbar{}(Begin至End)结束。
请问对于这种机制,意思是每根Bar(实时为每一个Tick)运行的代码,都包括了参数声明和变量声明是吗,也就是说如果变量声明存在对某个变量的初始化,那意味着在onbar{}中获取该变量的值时,其结果始终都是声明时刻的初始化的值,而并非前一根bar的遗留值,是吗?除非在变量后面写[1]才能获取到前一根bar的遗留值,唯独此法,是吗?
每根BAR执行一次就是通过OnBar来驱动的,OnInit只在策略启动时执行一次。
您还没有回答完整我的问题。1、paramer 和 vars 定义部分,是不是也是每根BAR会执行一遍?
2、如果Events部分中,除了有OnBar(),还有OnOrder(),OnTimer()这些函数是如何执行的?是不是要收到委托汇报以后才会执行OnOrder,到了固定的时间才会执行OnTimer()?
关于机制问题,我觉得抓住关键的点就可以,有些细节其实是不需要了解的。
回到您的第一个问题。Params和Vars是不是每根BAR执行,具体是在OnBar执行还是在OnBar之外执行,这个不重要。因为Params部分的东西,执行不执行,对您编写公式没影响,参数值读过来就是了。Vars部分您可能关心的,就是变量什么情况下会变回默认值,什么情况不变回,其他还有什么问题,我们也只要把问题本身的答案找到就可以了。而这些问题,根据不同变量类型的特性,做下测试,结果并不难得到。简单变量,每根BAR都会回到默认值,序列变量每根BAR都会从上一根BAR传递值,了解了这些,对编程应该基本够用了,复杂情况另说。
第二个问题,OnOrder()和OnTimer当然是满足了事件驱动的条件,才会执行。OnOrder是要收到委托单才会驱动,当然一笔委托,从发出委托待报,到从交易所返回变成已报,Order这个结构体里面的属性是会变化的,这个看看函数说明,做做测试就可以搞清楚。OnTimer()机制类似。
追问1:问题所描述的其实是行情驱动机制,即每一个新的bar进来(或者tick),都将执行一遍所有的代码。那假设代码中的Events部分,不光有OnBar(),还有OnInit(),OnOrder(),OnTimer()等事件驱动函数,那它们会如何的运行?另外,既然代码本身全部都会在每一根bar执行一遍,为何又还要有OnBar()这么一个事件类型?
追问2:TB使用说明中,对于事件驱动的基本类型中,OnInit()的基本解释说,只运行一次,那和前文所述的每根bar执行一次岂不是自相矛盾?还是说,TB会自动判断,每根bar执行一次的只有OnBar()