信号脚本计算机制(第一部分)
[p=22, 2, center][font=inherit][size=17pt][b][font=宋体][color=#e372][font=inherit]信号脚本计算机制[/font][/color](第一部分)[/font][/b][/size][/font][/p][p=22, 2, left][font=inherit] (原创:Alex)[/font][/p][p=22, 2, left][font=宋体]这篇关于[color=#e372][font=inherit]信号脚本计算机制[/font][/color]的帖子,会系统阐述信号脚本的各种计算方式,每种计算方式的驱动机制不一样,通常的驱动因素是基于行情,而除了行情的驱动还有一些其它的驱动因素;每种驱动因素都会导致信号脚本执行计算,而计算过程中变量的存储和调用的机制又是如何进行的,另外,每种计算又是如何委托发单的,这两点是本文的重点;除了这两个重点之外,还需要阐述一下相关的知识点,如最大[/font][font=inherit]bar[/font][font=宋体]数量、回溯、[/font][font=inherit]bar[/font][font=宋体]的状态,以此来更深刻的理解上面提到的两个重点。[/font][/p][p=22, 2, left][font=宋体][size=10.5pt]尽管本文阐述的是信号脚本的计算机制,但是对于指标脚本,也可以进行类推理解,这里不再深入阐述;另外,本文是基于时间周期图表,并不涉及其它周期图表,也不涉及跨周期调用子图的阐述,因为这样会使整篇文章的主线模糊不容易理解;关于非时间周期图表,如[/size][/font][font=Calibri, sans-serif][size=10.5pt]tick[/size][/font][font=宋体][size=10.5pt]周期,大家可以根据这篇帖子进行类推理解,后续若有时间会写一篇关于非时间周期图表的帖子;由于跨周期调用子图的阐述涉及的知识点更多,而且需要以本文作为铺垫,所以跨周期调用子图的内容会安排在这篇帖子之后进行编写。[/size][/font][/p][p=22, 2, left][font=inherit][size=13pt][b][font=inherit]一、[/font][font=宋体]最大[/font][font=inherit]bar[/font][font=宋体]数量[/font][/b][/size][/font][/p][p=22, 2, left][attach]11787[/attach][/p][p=22, 2, center][font=宋体]图[/font][font=inherit]1. [/font][font=宋体]最大[/font][font=inherit]bar[/font][font=宋体]数量[/font][/p][p=22, 2, left][font=宋体] 如图[/font][font=inherit]1[/font][font=宋体]所示,策略的最大[/font][font=inherit]bar[/font][font=宋体]数量在策略属性中进行设置,默认为[/font][font=inherit]50[/font][font=宋体];信号脚本会从图表左边开始的第[/font][font=inherit]51[/font][font=宋体]根[/font][font=inherit]bar[/font][font=宋体]开始计算,依次向图表右边进行执行计算,这是策略(信号)基于[/font][font=inherit]bar[/font][font=宋体]的一个计算顺序,从左边向右边逐根[/font][font=inherit]bar[/font][font=宋体]执行计算。那么很明显的问题是,为什么要设置最大[/font][font=inherit]bar[/font][font=宋体]数量,这个有什么用?答案是用于回溯,因为信号基于当根[/font][font=inherit]bar[/font][font=宋体](假设是图表上第[/font][font=inherit]51[/font][font=宋体]根[/font][font=inherit]bar[/font][font=宋体])执行计算时,有时需要回溯当根[/font][font=inherit]bar[/font][font=宋体]前若干根[/font][font=inherit]bar[/font][font=宋体]上的信息进行计算判断(假设此时当根[/font][font=inherit]bar[/font][font=宋体]为图表上第[/font][font=inherit]51[/font][font=宋体]根[/font][font=inherit]bar[/font][font=宋体],即图中的[/font][font=inherit]21[/font][font=宋体]:[/font][font=inherit]51[/font][font=宋体]分钟的收盘时间线位置,而信号基于第[/font][font=inherit]51[/font][font=宋体]根[/font][font=inherit]bar[/font][font=宋体]进行计算时,需要调用图表上第[/font][font=inherit]49[/font][font=宋体]根[/font][font=inherit]bar[/font][font=宋体]上的收盘价信息,那么此时就需要进行回溯);退一步考虑,若最大[/font][font=inherit]bar[/font][font=宋体]数量设置为[/font][font=inherit]0[/font][font=宋体],而当根[/font][font=inherit]bar[/font][font=宋体]为图表上第[/font][font=inherit]1[/font][font=宋体]根[/font][font=inherit]bar[/font][font=宋体],并且信号基于当根[/font][font=inherit]bar[/font][font=宋体]的计算时需要调用前[/font][font=inherit]1[/font][font=宋体]根[/font][font=inherit]bar[/font][font=宋体]上的信息,例如收盘价信息,但是此时当根[/font][font=inherit]bar[/font][font=宋体]就是图表上第[/font][font=inherit]1[/font][font=宋体]根[/font][font=inherit]bar[/font][font=宋体],从而当根[/font][font=inherit]bar[/font][font=宋体]前面没有[/font][font=inherit]bar[/font][font=宋体]可用于回溯调用。这就是最大[/font][font=inherit]bar[/font][font=宋体]数量的用途所在。[/font][/p][p=22, 2, left][font=inherit]1. [/font][font=宋体]最大[/font][font=inherit]bar[/font][font=宋体]数量,相对编号和绝对编号[/font][/p][p=22, 2, left][font=宋体]下方当我们涉及到最大[/font][font=inherit]bar[/font][font=宋体]数量时,我们始终将策略属性中的最大[/font][font=inherit]bar[/font][font=宋体]数量设置成默认的[/font][font=inherit]50[/font][font=宋体],为方便叙述起见。引入了最大[/font][font=inherit]bar[/font][font=宋体]数量之后,就引入了两个概念,分别是[/font][font=inherit]bar[/font][font=宋体]的相对编号和绝对编号。[/font][font=inherit]Bar[/font][font=宋体]的编号是每根[/font][font=inherit]bar[/font][font=宋体]的一个位置,位置分为相对位置和绝对位置;[/font][font=inherit]bar[/font][font=宋体]的绝对编号就是绝对位置,和最大[/font][font=inherit]bar[/font][font=宋体]数量没有关系,它是基于图表中第[/font][font=inherit]1[/font][font=宋体]根[/font][font=inherit]bar[/font][font=宋体]依次进行编号的,即图表中第[/font][font=inherit]1[/font][font=宋体]根[/font][font=inherit]bar[/font][font=宋体]的绝对编号为[/font][font=inherit]1[/font][font=宋体],第[/font][font=inherit]51[/font][font=宋体]根[/font][font=inherit]bar[/font][font=宋体]的绝对编号为[/font][font=inherit]51[/font][font=宋体];[/font][font=inherit]bar[/font][font=宋体]的相对编号就是相对位置,它是基于图表中最大[/font][font=inherit]bar[/font][font=宋体]数量之后的[/font][font=inherit]bar[/font][font=宋体]依次进行编号的,一句话就是,[/font][font=inherit]bar[/font][font=宋体]的相对编号[/font][font=inherit]=bar[/font][font=宋体]的绝对编号—最大[/font][font=inherit]bar[/font][font=宋体]数量。[/font][/p][p=22, 2, left]
[font=宋体][size=10.5pt]关键字[/size][/font][font=Calibri, sans-serif][size=10.5pt]currentbar[/size][/font][font=宋体][size=10.5pt]返回的数值就是当根[/size][/font][font=Calibri, sans-serif][size=10.5pt]bar[/size][/font][font=宋体][size=10.5pt]的相对编号,关键字[/size][/font][font=Calibri, sans-serif][size=10.5pt]maxbarsback[/size][/font][font=宋体][size=10.5pt]反应的数值就是策略属性中设置的最大[/size][/font][font=Calibri, sans-serif][size=10.5pt]bar[/size][/font][font=宋体][size=10.5pt]数量;基于这两个关键字,当根[/size][/font][font=Calibri, sans-serif][size=10.5pt]bar[/size][/font][font=宋体][size=10.5pt]的绝对编号就等于两个关键字的返回值之和。[/size][/font][/p][p=22, 2, left][font=inherit]2. [/font][font=宋体]回溯[/font][/p][p=22, 2, left][attach]11786[/attach]
[/p][p=22, 2, center][font=宋体]图[/font][font=inherit]2. [/font][font=宋体]回溯[/font][/p][p=22, 2, left][font=宋体]如图[/font][font=inherit]2[/font][font=宋体]所示,我们以相对编号为[/font][font=inherit]1[/font][font=宋体]的[/font][font=inherit]bar[/font][font=宋体]为当根[/font][font=inherit]bar[/font][font=宋体]进行分析,也就图中收盘时间为[/font][font=inherit]21[/font][font=宋体]:[/font][font=inherit]51[/font][font=宋体]的时间线所在的位置为当前策略(信号)正在执行计算的位置,可以看出,当根[/font][font=inherit]bar[/font][font=宋体]的[/font][font=inherit]bar[/font][font=宋体]编号[/font][font=inherit]=51[/font][font=宋体],这个是它的绝对编号,图表显示出来的[/font][font=inherit]bar[/font][font=宋体]的编号都是绝对编号。基于当根[/font][font=inherit]bar[/font][font=宋体]进行计算时,需要调用前几根[/font][font=inherit]bar[/font][font=宋体]的信号,例如调用前几根[/font][font=inherit]bar[/font][font=宋体]上的收盘价进行分析,相应的代码如下:[/font][/p][p=22, 2, left][font=inherit]//[/font][font=宋体]信号代码[/font][/p][p=22, 2, left][font="]if[/font] [font="]currentbar[/font][font="]=[/font][b][font="]1[/font][/b] [font="]then[/font] [font="]begin[/font][/p][p=22, 2, left][font="]print[/font][font="]([/font][font="]"currentbar="[/font][font="],[/font][font="]currentbar[/font][font="],[/font][font="]",time[0]="[/font][font="],[/font][font="]time[/font][font="][[/font][b][font="]0[/font][/b][font="]],[/font][font="]",close[0]="[/font][font="],[/font][font="]close[/font][font="][[/font][b][font="]0[/font][/b][font="]]);[/font][/p][p=22, 2, left]
[font="]print[/font][font="]([/font][font="]"time[1]="[/font][font="],[/font][font="]time[/font][font="][[/font][b][font="]1[/font][/b][font="]],[/font][font="]",close[1]="[/font][font="],[/font][font="]close[/font][font="][[/font][b][font="]1[/font][/b][font="]]);[/font][/p][p=22, 2, left]
[font="]print[/font][font="]([/font][font="]"time[2]="[/font][font="],[/font][font="]time[/font][font="][[/font][b][font="]2[/font][/b][font="]],[/font][font="]",close[2]="[/font][font="],[/font][font="]close[/font][font="][[/font][b][font="]2[/font][/b][font="]]);[/font][/p][p=22, 2, left]
[font="]print[/font][font="]([/font][font="]"time[3]="[/font][font="],[/font][font="]time[/font][font="][[/font][b][font="]3[/font][/b][font="]],[/font][font="]",close[3]="[/font][font="],[/font][font="]close[/font][font="][[/font][b][font="]3[/font][/b][font="]]);[/font][/p][p=22, 2, left]
[font="]print[/font][font="]([/font][font="]"time[4]="[/font][font="],[/font][font="]time[/font][font="][[/font][b][font="]4[/font][/b][font="]],[/font][font="]",close[4]="[/font][font="],[/font][font="]close[/font][font="][[/font][b][font="]4[/font][/b][font="]]);[/font][/p][p=22, 2, left]
[font="]print[/font][font="]([/font][font="]"time[5]="[/font][font="],[/font][font="]time[/font][font="][[/font][b][font="]5[/font][/b][font="]],[/font][font="]",close[5]="[/font][font="],[/font][font="]close[/font][font="][[/font][b][font="]5[/font][/b][font="]]);[/font][/p][p=22, 2, left]
[font="]print[/font][font="]([/font][font="]"time[6]="[/font][font="],[/font][font="]time[/font][font="][[/font][b][font="]6[/font][/b][font="]],[/font][font="]",close[6]="[/font][font="],[/font][font="]close[/font][font="][[/font][b][font="]6[/font][/b][font="]]);[/font][/p][p=22, 2, left]
[font="]print[/font][font="]([/font][font="]"time[7]="[/font][font="],[/font][font="]time[/font][font="][[/font][b][font="]7[/font][/b][font="]],[/font][font="]",close[7]="[/font][font="],[/font][font="]close[/font][font="][[/font][b][font="]7[/font][/b][font="]]);[/font][/p][p=22, 2, left]
[font="]print[/font][font="]([/font][font="]"time[8]="[/font][font="],[/font][font="]time[/font][font="][[/font][b][font="]8[/font][/b][font="]],[/font][font="]",close[8]="[/font][font="],[/font][font="]close[/font][font="][[/font][b][font="]8[/font][/b][font="]]);[/font][/p][p=22, 2, left][font="]end[/font][font="];[/font][/p][p=22, 2, left][font=inherit]//[/font][font=宋体]输出[/font][/p][p=22, 2, left][font="]currentbar= 1.00,time[0]=2151.00,close[0]=3354.00[/font][/p][p=22, 2, left][font="]time[1]=2150.00,close[1]=3353.00[/font][/p][p=22, 2, left][font="]time[2]=2149.00,close[2]=3353.00[/font][/p][p=22, 2, left][font="]time[3]=2148.00,close[3]=3352.00[/font][/p][p=22, 2, left][font="]time[4]=2147.00,close[4]=3352.00[/font][/p][p=22, 2, left][font="]time[5]=2146.00,close[5]=3351.00[/font][/p][p=22, 2, left][font="]time[6]=2145.00,close[6]=3350.00[/font][/p][p=22, 2, left][font="]time[7]=2144.00,close[7]=3353.00[/font][/p][p=22, 2, left][font="]time[8]=2143.00,close[8]=3353.00[/font][/p][p=22, 2, left]
[font=宋体]在当根[/font][font=inherit]bar[/font][font=宋体]的位置调用当根[/font][font=inherit]bar[/font][font=宋体]的收盘价可以使用[/font][font=inherit]close[0][/font][font=宋体]或者[/font][font=inherit]close[/font][font=宋体]即可,对应到图[/font][font=inherit]2[/font][font=宋体]中的“[/font][font=inherit]0[/font][font=宋体]”标记;调用前第[/font][font=inherit]1[/font][font=宋体]根[/font][font=inherit]bar[/font][font=宋体]的收盘价可以使用[/font][font=inherit]close[1][/font][font=宋体]即可,对应到图[/font][font=inherit]2[/font][font=宋体]中的“[/font][font=inherit]1[/font][font=宋体]”标记;调用前第[/font][font=inherit]2[/font][font=宋体]根[/font][font=inherit]bar[/font][font=宋体]的收盘价可以使用[/font][font=inherit]close[2][/font][font=宋体]即可,对应到图[/font][font=inherit]2[/font][font=宋体]中的“[/font][font=inherit]2[/font][font=宋体]”标记;调用前第[/font][font=inherit]3[/font][font=宋体]根[/font][font=inherit]bar[/font][font=宋体]的收盘价可以使用[/font][font=inherit]close[3][/font][font=宋体]即可,对应到图[/font][font=inherit]2[/font][font=宋体]中的“[/font][font=inherit]3[/font][font=宋体]”标记,其它以此类推即可,但是最多只能回溯前第[/font][font=inherit]50[/font][font=宋体]根[/font][font=inherit]bar[/font][font=宋体]的收盘价,因为回溯的数量不能超过策略属性中的最大[/font][font=inherit]bar[/font][font=宋体]数值[/font][font=inherit]50[/font][font=宋体]。[/font][/p][p=22, 2, left][font=宋体]但是并不是所有的关键字都有回溯的功能,比如关键字[/font][font=inherit]currentbar[/font][font=宋体]就不能进行回溯,[/font][font=inherit]currentbar[1][/font][font=宋体]始终返回的数值等于[/font][font=inherit]currentbar[/font][font=宋体]返回的数值;关键字[/font][font=inherit]currentbar[/font][font=宋体]不能进行回溯,但是使用[/font][font=inherit]currentbar[2][/font][font=宋体]这种形式并不会报错,只是[/font][font=inherit]currentbar[2][/font][font=宋体]始终等于[/font][font=inherit]currentbar[/font][font=宋体],对于[/font][font=inherit]currentbar[3][/font][font=宋体]、[/font][font=inherit]currentbar[4][/font][font=宋体]也始终等于[/font][font=inherit]currentbar[/font][font=宋体]的返回值。其它不能回溯的关键字在这里不一一叙述,请参考关键字[/font][font=inherit]currentbar[/font][font=宋体]的使用情况;我们可以将其数值赋值给变量,然后通过变量的回溯功能来回溯前第[/font][font=inherit]N[/font][font=宋体]根[/font][font=inherit]bar[/font][font=宋体]上的[/font][font=inherit]currentbar[/font][font=宋体]的数值,代码如下:[/font][/p][p=22, 2, left][font=inherit]//[/font][font=宋体]信号代码:[/font][/p][p=22, 2, left][font="]value1[/font][font="]=[/font][font="]currentbar[/font][font="];[/font][/p][p=22, 2, left][font="]print[/font][font="]([/font][font="]"currentbar="[/font][font="],[/font][font="]currentbar[/font][font="],[/font][font="]",value1="[/font][font="],[/font][font="]value1[/font][font="],[/font][font="]",value1[1]="[/font][font="],[/font][font="]value1[/font][font="][[/font][b][font="]1[/font][/b][font="]]);[/font][/p][p=22, 2, left][font=inherit]//[/font][font=宋体]输出[/font][/p][p=22, 2, left][font="]currentbar= 1.00,value1= 1.00,value1[1]= 0.00[/font][/p][p=22, 2, left][font="]currentbar= 2.00,value1= 2.00,value1[1]= 1.00[/font][/p][p=22, 2, left][font="]currentbar= 3.00,value1= 3.00,value1[1]= 2.00[/font][/p][p=22, 2, left][font=inherit]3. symbol[/font][font=宋体]系列关键字[/font][/p][p=22, 2, left][font=inherit]symbol[/font][font=宋体]系列关键字有[/font][font=inherit]symbol_close[/font][font=宋体]、[/font][font=inherit]symbol_currentbar[/font][font=宋体]、[/font][font=inherit]symbol_length[/font][font=宋体]、[/font][font=inherit]symbol_time[/font][font=宋体]、[/font][font=inherit]symbol_date[/font][font=宋体]、[/font][font=inherit]symbol_downticks[/font][font=宋体]、[/font][font=inherit]symbol_high[/font][font=宋体]、[/font][font=inherit]symbol_low[/font][font=宋体]、[/font][font=inherit]symbol_open[/font][font=宋体]、[/font][font=inherit]symbol_openint[/font][font=宋体]、[/font][font=inherit]symbol_tickid[/font][font=宋体]、[/font][font=inherit]symbol_ticks[/font][font=宋体]、[/font][font=inherit]symbol_time[/font][font=宋体]、[/font][font=inherit]symbol_time_s[/font][font=宋体]、[/font][font=inherit]symbol_upticks[/font][font=宋体]、[/font][font=inherit]symbol_volume[/font][font=宋体],但是本文并不打算将[/font][font=inherit]symbol[/font][font=宋体]系列关键字全部进行阐述清楚,我们只选择如下[/font][font=inherit]4[/font][font=宋体]个进行阐述,其它的[/font][font=inherit]symbol[/font][font=宋体]类关键字以此类推即可;之所以阐述[/font][font=inherit]symbol[/font][font=宋体]系列关键字,是因为它们在使用上不受最大[/font][font=inherit]bar[/font][font=宋体]数量的限制,这点是关键的地方。[/font][/p][p=22, 2, center][font=宋体]表[/font][font=inherit]1. Symbol[/font][font=宋体]系列关键字[/font][/p][table=98%]
[tr][td=1,1,168][p=22, 2, center][font=inherit]Symbol[/font][font=宋体]关键字名称[/font][/p][/td][td=1,1,400][p=22, 2, center][font=宋体]简介[/font][/p][/td][/tr]
[tr][td=1,1,168][p=22, 2, center][font=inherit]Symbol_close[/font][/p][/td][td=1,1,400][p=22, 2, center][font=宋体]返回[/font][font=inherit]bar[/font][font=宋体]的收盘价[/font][/p][/td][/tr]
[tr][td=1,1,168][p=22, 2, center][font=inherit]Symbol_currentbar[/font][/p][/td][td=1,1,400][p=22, 2, center][font=宋体]返回[/font][font=inherit]bar[/font][font=宋体]的绝对编号[/font][/p][/td][/tr]
[/table]
[p=22, 2, left][font=宋体]情境一:[/font][/p][p=22, 2, left][font=inherit]//[/font][font=宋体]信号代码[/font][/p][p=22, 2, left][font="]if[/font] [font="]currentbar[/font][font="]=[/font][b][font="]1[/font][/b] [font="]then[/font][/p][p=22, 2, left]
[font="]close[/font][font="][[/font][b][font="]51[/font][/b][font="]];[/font][/p][p=22, 2, left][font=宋体]由于这段代码的存在,会弹出一个窗口报错提示“指标运算试图参考的[/font][font="]bar[/font][font=宋体]的数量([/font][font="]51[/font][font=宋体])比当前设置的“指标运算参考的最大[/font][font="]bar[/font][font=宋体]数量”多,这是因为最大[/font][font="]bar[/font][font=宋体]数量设置为[/font][font="]50[/font][font=宋体],而关键字[/font][font="]close[/font][font=宋体]调用了前第[/font][font="]51[/font][font=宋体]根[/font][font="]bar[/font][font=宋体]上的收盘价,回溯的数量已经超过了最大[/font][font="]bar[/font][font=宋体]数量[/font][font="]50[/font][font=宋体]的限制,这是不允许的。[/font][/p][p=22, 2, left][font=宋体]情境二:[/font][/p][p=22, 2, left][font=inherit]//[/font][font=宋体]信号代码[/font][/p][p=22, 2, left][font="]if[/font] [font="]currentbar[/font][font="]=[/font][b][font="]1[/font][/b] [font="]then[/font][/p][p=22, 2, left]
[font="]symbol_close[/font][font="][[/font][b][font="]51[/font][/b][font="]];[/font][/p][p=22, 2, left]
[font=宋体]这段代码的存在仍然会弹出一个与情境一相同的窗口报错提示,但是这里我们的解释与上面不一样;报错的原因是因为关键字[/font][font=inherit]symbol_close[/font][font=宋体]调用(回溯)不存在的[/font][font=inherit]bar[/font][font=宋体]上的收盘价信息而导致报错提示;因为相对编号为[/font][font=inherit]1[/font][font=宋体]的[/font][font=inherit]bar[/font][font=宋体]的前面最多只有[/font][font=inherit]50[/font][font=宋体]根[/font][font=inherit]bar[/font][font=宋体],所以最多只能调用(回溯)前第[/font][font=inherit]50[/font][font=宋体]根[/font][font=inherit]bar[/font][font=宋体]上的数据,这点与最大[/font][font=inherit]bar[/font][font=宋体]数量限制没有关系。[/font][/p][p=22, 2, left][font=宋体]情境三:[/font][/p][p=22, 2, left][font=inherit]//[/font][font=宋体]信号代码[/font][/p][p=22, 2, left][font="]if[/font] [font="]currentbar[/font][font="]=[/font][b][font="]10[/font][/b] [font="]then[/font][/p][p=22, 2, left]
[font="]close[/font][font="][[/font][b][font="]51[/font][/b][font="]];[/font][/p][p=22, 2, left][font=宋体]这段代码的存在会弹出一个与情境一相同的窗口报错提示,原因与情境一完全一样,是因为回溯的数量超过了最大[/font][font=inherit]bar[/font][font=宋体]数量[/font][font=inherit]50[/font][font=宋体]的限制。[/font][/p][p=22, 2, left][font=宋体]情境四:[/font][/p][p=22, 2, left][font=inherit]//[/font][font=宋体]信号代码[/font][/p][p=22, 2, left][font="]if[/font] [font="]currentbar[/font][font="]=[/font][b][font="]10[/font][/b] [font="]then[/font][/p][p=22, 2, left]
[font="]symbol_close[/font][font="][[/font][b][font="]51[/font][/b][font="]];[/font][/p][p=22, 2, left]
[font=宋体]这段代码的存在不会弹出窗口报错提示,原因是因为相对编号为[/font][font=inherit]10[/font][font=宋体]的[/font][font=inherit]bar[/font][font=宋体]的前面有[/font][font=inherit]59[/font][font=宋体]根[/font][font=inherit]bar[/font][font=宋体],这个数量大于当前回溯的数量[/font][font=inherit]51[/font][font=宋体],所以不会报错。[/font][/p][p=22, 2, left][font=宋体]通过这[/font][font=inherit]4[/font][font=宋体]个情境,我们已经将[/font][font=inherit]symbol_close[/font][font=宋体]与[/font][font=inherit]close[/font][font=宋体]的区别阐述清楚了,前者不受策略属性中的最大[/font][font=inherit]bar[/font][font=宋体]数量的限制,而后者会受最大[/font][font=inherit]bar[/font][font=宋体]数量的限制。对于其它的[/font][font=inherit]symbol[/font][font=宋体]类关键字,请参考[/font][font=inherit]symbol_close[/font][font=宋体]与[/font][font=inherit]close[/font][font=宋体]之间的区别。[/font][/p][p=22, 2, left][font=宋体]关键字[/font][font=inherit]Symbol_currentbar[/font][font=宋体]的返回值等于[/font][font=inherit]currentbar[/font][font=宋体]与[/font][font=inherit]maxbarsback[/font][font=宋体]的返回值之和,它表示的是当根[/font][font=inherit]bar[/font][font=宋体]的绝对编号,这是与[/font][font=inherit]currentbar[/font][font=宋体]的唯一区别;[/font][font=inherit]symbol_currentbar[/font][font=宋体]和[/font][font=inherit]currentbar[/font][font=宋体]这两个关键字都不能回溯。[/font][/p][p=22, 2, left][font=inherit][size=13pt][b][font=inherit]二、[/font][font=inherit]Bar[/font][font=宋体]的状态[/font][/b][/size][/font][/p][p=22, 2, left][font=宋体]每根[/font][font=inherit]bar[/font][font=宋体]都有自己的状态,因为有开始也有结束,开始了还没有结束,结束了还没有开始,总而言之每根[/font][font=inherit]bar[/font][font=宋体]只有[/font][font=inherit]4[/font][font=宋体]种状态,分别为开盘状态,收盘状态,[/font][font=inherit]bar[/font][font=宋体]内状态,[/font][font=inherit]bar[/font][font=宋体]外状态;[/font][font=inherit]bar[/font][font=宋体]内状态与[/font][font=inherit]bar[/font][font=宋体]外状态是相对于开盘状态和收盘状态而言的,所谓的[/font][font=inherit]bar[/font][font=宋体]内状态就是当根[/font][font=inherit]bar[/font][font=宋体]已经开盘了,但是当根[/font][font=inherit]bar[/font][font=宋体]还没有收盘,所谓的[/font][font=inherit]bar[/font][font=宋体]外状态就是当根[/font][font=inherit]bar[/font][font=宋体]已经收盘了,但是下一根[/font][font=inherit]bar[/font][font=宋体]还没有开盘,那么这段空间就是当根[/font][font=inherit]bar[/font][font=宋体]的[/font][font=inherit]bar[/font][font=宋体]外状态。那么什么是当根[/font][font=inherit]bar[/font][font=宋体]的开盘状态,什么又是当根[/font][font=inherit]bar[/font][font=宋体]的收盘状态?在回答这个问题之前,首先反问大家一个问题,就是对于时间周期的[/font][font=inherit]bar[/font][font=宋体](为方便叙述,下方未特殊说明,时间周期都是默认指[/font][font=inherit]1[/font][font=宋体]分钟周期)比如收盘时间为[/font][font=inherit]21[/font][font=宋体]:[/font][font=inherit]52[/font][font=宋体]的[/font][font=inherit]bar[/font][font=宋体],这一分钟的[/font][font=inherit]bar[/font][font=宋体]是由[/font][font=inherit]21[/font][font=宋体]:[/font][font=inherit]51[/font][font=宋体]:[/font][font=inherit]00[/font][font=宋体]到[/font][font=inherit]21[/font][font=宋体]:[/font][font=inherit]51[/font][font=宋体]:[/font][font=inherit]59[/font][font=宋体]这个时间段内的[/font][font=inherit]tick[/font][font=宋体]合成而来的,但是当接收到时间为[/font][font=inherit]21[/font][font=宋体]:[/font][font=inherit]51[/font][font=宋体]:[/font][font=inherit]59[/font][font=宋体]的一笔[/font][font=inherit]tick[/font][font=宋体]时,是否应该判断当根[/font][font=inherit]bar[/font][font=宋体]已经结束了呢?不应该,因为每一秒的[/font][font=inherit]tick[/font][font=宋体]不至一笔(内盘是一秒最多两笔,但是外盘不一定),所以最准确的办法应该是当接收到一笔时间超过[/font][font=inherit]21[/font][font=宋体]:[/font][font=inherit]51[/font][font=宋体]:[/font][font=inherit]59[/font][font=宋体]的[/font][font=inherit]tick[/font][font=宋体]时才能确定当根[/font][font=inherit]bar[/font][font=宋体]已经收盘结束了,这种情境是通过下一根[/font][font=inherit]bar[/font][font=宋体]的第一笔[/font][font=inherit]tick[/font][font=宋体]来确定的,因为下一根[/font][font=inherit]bar[/font][font=宋体]的第一笔[/font][font=inherit]tick[/font][font=宋体]的时间已经不在当根[/font][font=inherit]bar[/font][font=宋体]的时间范围内;另一种情境是,若[/font][font=inherit]21[/font][font=宋体]:[/font][font=inherit]51[/font][font=宋体]:[/font][font=inherit]59[/font][font=宋体]之后一直没有接收到下一根[/font][font=inherit]bar[/font][font=宋体]的第一笔[/font][font=inherit]tick[/font][font=宋体],应该怎么处理呢?这种情境就需要[/font][font=inherit]MC[/font][font=宋体]底层根据时间进行判断一下,[/font][font=inherit]MC[/font][font=宋体]底层的判断机制[/font][font=inherit]21[/font][font=宋体]:[/font][font=inherit]51[/font][font=宋体]:[/font][font=inherit]59[/font][font=宋体]秒之后[/font][font=inherit]5[/font][font=宋体]分钟之内没有收到下一根[/font][font=inherit]bar[/font][font=宋体]的第一笔[/font][font=inherit]tick[/font][font=宋体]也会判断当根[/font][font=inherit]bar[/font][font=宋体]收盘;对于[/font][font=inherit]bar[/font][font=宋体]的开盘状态,当接收到第一笔[/font][font=inherit]tick[/font][font=宋体]即判断当根[/font][font=inherit]bar[/font][font=宋体]开盘,例如接收到[/font][font=inherit]21[/font][font=宋体]:[/font][font=inherit]51[/font][font=宋体]:[/font][font=inherit]00[/font][font=宋体]到[/font][font=inherit]21[/font][font=宋体]:[/font][font=inherit]51[/font][font=宋体]:[/font][font=inherit]59[/font][font=宋体]这个时间范围内的第一笔[/font][font=inherit]tick[/font][font=宋体]时,即判断当根[/font][font=inherit]bar[/font][font=宋体](收盘时间为[/font][font=inherit]21[/font][font=宋体]:[/font][font=inherit]52[/font][font=宋体])开盘。(注意:每笔[/font][font=inherit]tick[/font][font=宋体]行情都会挟带时间信息,而[/font][font=inherit]MC[/font][font=宋体]是根据每笔[/font][font=inherit]tick[/font][font=宋体]的时间信息进行判断)[/font][/p][p=22, 2, left][font=宋体]基于[/font][font=inherit]bar[/font][font=宋体]的状态,对应有一个关键字来进行判断;关键字[/font][font=inherit]barstatus[/font][font=宋体]的返回值有[/font][font=inherit]4[/font][font=宋体]种,分别为[/font][font=inherit]0[/font][font=宋体]、[/font][font=inherit]1[/font][font=宋体]、[/font][font=inherit]2[/font][font=宋体]、[/font][font=inherit]-1[/font][font=宋体],分别代表当根[/font][font=inherit]bar[/font][font=宋体]的开盘状态、[/font][font=inherit]bar[/font][font=宋体]内状态、[/font][font=inherit]bar[/font][font=宋体]的收盘状态、[/font][font=inherit]bar[/font][font=宋体]外状态。[/font][/p][p=22, 2, left][font=宋体]之前写过一篇帖子“[/font][font=inherit]This bar[/font][font=宋体]和[/font][font=inherit]next bar[/font][font=宋体]的区别”,里面阐述了概念开盘[/font][font=inherit]tick[/font][font=宋体]、[/font][font=inherit]bar[/font][font=宋体]内[/font][font=inherit]tick[/font][font=宋体]、收盘[/font][font=inherit]tick[/font][font=宋体],开盘[/font][font=inherit]tick[/font][font=宋体]与这里的开盘状态是一致的,收盘[/font][font=inherit]tick[/font][font=宋体]与这里的收盘状态是一致的,[/font][font=inherit]bar[/font][font=宋体]内[/font][font=inherit]tick[/font][font=宋体]是这里的[/font][font=inherit]bar[/font][font=宋体]内状态有些区别,请区别进行理解。[/font][/p][p=22, 2, left][font=宋体]1. [/font][font=宋体]收盘[/font][font=inherit]tick[/font][/p][p=22, 2, left][font=宋体]我们前面说过,收盘[/font][font=inherit]tick[/font][font=宋体]与[/font][font=inherit]bar[/font][font=宋体]收盘状态是等价的,因为策略(信号)接收到收盘[/font][font=inherit]tick[/font][font=宋体]时,策略(信号)才会判断当根[/font][font=inherit]bar[/font][font=宋体]收盘(即[/font][font=inherit]bar[/font][font=宋体]收盘状态),而收盘[/font][font=inherit]tick[/font][font=宋体]是[/font][font=inherit]MC[/font][font=宋体]内部产生的,这种产生要区分两种情境:[/font][font=inherit]1. [/font][font=宋体]下一根[/font][font=inherit]bar[/font][font=宋体]的第一笔[/font][font=inherit]tick[/font][font=宋体](即下一根[/font][font=inherit]bar[/font][font=宋体]的开盘[/font][font=inherit]tick[/font][font=宋体])接收时,[/font][font=inherit]MC[/font][font=宋体]内部会产生当根[/font][font=inherit]bar[/font][font=宋体]的收盘[/font][font=inherit]tick[/font][font=宋体],判断当根[/font][font=inherit]bar[/font][font=宋体]收盘;[/font][font=inherit]2. [/font][font=宋体]五分钟内没有收到下一根[/font][font=inherit]bar[/font][font=宋体]的第一笔[/font][font=inherit]tick[/font][font=宋体]时,[/font][font=inherit]MC[/font][font=宋体]内部也会产生当根[/font][font=inherit]bar[/font][font=宋体]的收盘[/font][font=inherit]tick[/font][font=宋体],判断当根[/font][font=inherit]bar[/font][font=宋体]收盘。[/font][/p][p=22, 2, left][font=宋体]测试情境[/font][font=inherit]1[/font][font=宋体]:[/font][/p][p=22, 2, left][font=inherit]//[/font][font=宋体]信号代码:[/font][/p][p=22, 2, left][font="]print[/font][font="]([/font][font="]"time_s="[/font][font="],[/font][font="]time_s[/font][font="],[/font][font="]",barstatus="[/font][font="],[/font][font="]barstatus[/font][font="],[/font][font="]",currenttime_s="[/font][font="],[/font][font="]currenttime_s[/font][font="]);[/font][/p][p=22, 2, left][font="]//[/font][font=宋体]输出[/font][/p][p=22, 2, left][font="]time_s=215200.00,barstatus= 2.00,currenttime_s=215202.00[/font][/p][p=22, 2, left][font=宋体]测试情境[/font][font="]2[/font][font=宋体]:[/font][/p][p=22, 2, left][font=inherit]//[/font][font=宋体]信号代码:[/font][/p][p=22, 2, left][font="]print[/font][font="]([/font][font="]"time_s="[/font][font="],[/font][font="]time_s[/font][font="],[/font][font="]",barstatus="[/font][font="],[/font][font="]barstatus[/font][font="],[/font][font="]",currenttime_s="[/font][font="],[/font][font="]currenttime_s[/font][font="]);[/font][/p][p=22, 2, left][font="]//[/font][font=宋体]输出[/font][/p][p=22, 2, left][font="]time_s=215200.00,barstatus= 2.00,currenttime_s=215700.00[/font][/p][p=22, 2, left][font=宋体]将上面这段代码写入信号脚本(是否开启[/font][font=inherit]bar[/font][font=宋体]内模式都可以,[/font][font=inherit]bar[/font][font=宋体]内模式测试更清楚),然后将该信号插入到图表中(是否开启自动交易都可以);情境[/font][font=inherit]1[/font][font=宋体]是通常的情况,[/font][font=inherit]21[/font][font=宋体]:[/font][font=inherit]52[/font][font=宋体]:[/font][font=inherit]02[/font][font=宋体]时接收到下一根[/font][font=inherit]bar[/font][font=宋体]的第一笔[/font][font=inherit]tick[/font][font=宋体],然后策略(信号)判断当根[/font][font=inherit]bar[/font][font=宋体]收盘,基于当根[/font][font=inherit]bar[/font][font=宋体]进行计算;情境[/font][font=inherit]2[/font][font=宋体]是当[/font][font=inherit]5[/font][font=宋体]分钟内都没有接收到下一根[/font][font=inherit]bar[/font][font=宋体]的第一笔[/font][font=inherit]tick[/font][font=宋体]时,策略(信号)判断当根[/font][font=inherit]bar[/font][font=宋体]收盘,基于当根[/font][font=inherit]bar[/font][font=宋体]进行计算。对比一下[/font][font=inherit]time_s[/font][font=宋体]与[/font][font=inherit]currenttime_s[/font][font=宋体]的输出值进行对比。[/font][/p][p=22, 2, left][font=宋体]注意事项:[/font][/p][p=22, 2, left][font=Wingdings]l
[/font][font=宋体]情境[/font][font=inherit]2[/font][font=宋体]一般会出现在不活跃商品合约上,交易所收盘之后也会出现这种情境。[/font][/p][p=22, 2, left][font=Wingdings]l
[/font][font=宋体]内盘期货[/font][font=inherit]15[/font][font=宋体]:[/font][font=inherit]00[/font][font=宋体]之后收盘,正常情况下,会在[/font][font=inherit]15[/font][font=宋体]:[/font][font=inherit]05[/font][font=宋体]时判断当根[/font][font=inherit]bar[/font][font=宋体](即最后一根[/font][font=inherit]bar[/font][font=宋体])收盘,但是若在[/font][font=inherit]15[/font][font=宋体]:[/font][font=inherit]00[/font][font=宋体]之后对图表重新进行回补,那么策略(信号)也会判断最后一根[/font][font=inherit]bar[/font][font=宋体]收盘,对应的当然是[/font][font=inherit]barstatus[/font][font=宋体]返回[/font][font=inherit]2[/font][font=宋体]。重新回补可以对超过收盘时间没有收盘的[/font][font=inherit]bar [/font][font=宋体]执行收盘。[/font][/p][p=22, 2, left][font=inherit][size=13pt][b][font=inherit]三、[/font][font=宋体]变量的类型[/font][/b][/size][/font][/p][p=22, 2, left][font=宋体]1. [/font][font=宋体]变量[/font][/p][p=22, 2, left][font=宋体]信号中的变量除了[/font][font=inherit]value1~value99[/font][font=宋体](这[/font][font=inherit]99[/font][font=宋体]个变量都是时序类型的数值变量,从[/font][font=inherit]value1[/font][font=宋体]、[/font][font=inherit]value2[/font][font=宋体]、[/font][font=inherit]value3[/font][font=宋体],一直到[/font][font=inherit]value99[/font][font=宋体])和[/font][font=inherit]condition1~condition99[/font][font=宋体](这[/font][font=inherit]99[/font][font=宋体]个变量都是时序类型的布尔类型变量,从[/font][font=inherit]condition1[/font][font=宋体]、[/font][font=inherit]condition2[/font][font=宋体]、[/font][font=inherit]condition3[/font][font=宋体],一直到[/font][font=inherit]condition99[/font][font=宋体])这[/font][font=inherit]198[/font][font=宋体]个变量不需要声明之外,其它的变量都需要声明才可以在信号中使用,举例如下:[/font][/p][p=22, 2, left][font="]variable[/font][font="]:[/font] [font="]var0[/font][font="]([/font][b][font="]0[/font][/b][font="]),[/font] [font="]var1[/font][font="]([/font][font="]false[/font][font="]),[/font] [font="]var2[/font][font="]([/font][font="]""[/font][font="]);[/font][/p][p=22, 2, left][font=宋体]上面分别声明了三个变量[/font][font="]var0[/font][font=宋体]、[/font][font="]var1[/font][font=宋体]、[/font][font="]var2[/font][font=宋体],变量分为数值类型变量、布尔类型变量、字符串类型变量,这三个变量分别对应这三种类型,每个变量的类型是根据变量声明时括号中的初始值来判断的,而变量声明时需要指定初始值,如变量[/font][font="]var0[/font][font=宋体]的初始值是数值[/font][font="]0[/font][font=宋体],那么变量[/font][font="]var0[/font][font=宋体]就是数值类型变量,变量[/font][font="]var1[/font][font=宋体]的初始值是布尔类型,那么变量[/font][font="]var1[/font][font=宋体]就是布尔类型变量,变量[/font][font="]var2[/font][font=宋体]的初始值是字符串类型,那么变量[/font][font="]var3[/font][font=宋体]就是字符串类型变量。关于更详细的变量声明,可以看一下公式编译器中的关键字[/font][font="]variable[/font][font=宋体]的说明。[/font][/p][p=22, 2, left][font=inherit]MC[/font][font=宋体]的变量有两种类型,分别是时序类型和数值变量,两者的本质区别在于是否能回溯,这与它们的名称也是相符合的;通俗的讲,时序类型的变量就是在每根[/font][font=inherit]bar[/font][font=宋体]上都绑定一个值(即在内存中为每根[/font][font=inherit]bar[/font][font=宋体]上的时序变量都分配一块区域,用于存储每根[/font][font=inherit]bar[/font][font=宋体]上的变量值),然后后续回溯的时候可以方便调用,而数值类型的变量始终只会保存最新的一个数值(即在内存中只分配一块区域,该区域只存储最新的变量值);那么问题是,变量什么时候进行存储,这个点是关键需要理解的地方。另外,除了时序类型和数值类型两大类型的变量之外,还有一种复合类型的变量,也就是兼具时序类型变量和数值类型变量的特点,为不容易混淆,我们在后面再阐述。[/font][/p][p=22, 2, left][font=宋体]2. [/font][font=宋体]时序类型[/font][/p][p=22, 2, left][font=宋体]为方便讲解,这里使用的是[/font][font=inherit]bar[/font][font=宋体]内模式,从而信号会基于每笔[/font][font=inherit]tick[/font][font=宋体]执行计算一次,也就是说信号会在同一根[/font][font=inherit]bar[/font][font=宋体]上计算若干次。[/font][/p][p=22, 2, left][font=inherit]//[/font][font=宋体]信号代码[/font][/p][p=22, 2, left][font="][[/font][font="]IntrabarOrderGeneration[/font][font="]=[/font][font="]true[/font][font="]][/font][/p][p=22, 2, left][font="]variable[/font][font="]:[/font] [font="]var_seq[/font][font="]([/font][b][font="]0[/font][/b][font="]);[/font][/p][p=22, 2, left][font="]print[/font][font="]([/font][font="]"currentbar="[/font][font="],[/font][font="]currentbar[/font][font="],[/font][font="]", 3 "[/font][font="],[/font][font="]",var_seq="[/font][font="],[/font][font="]var_seq[/font][font="],[/font][font="]",var_seq[1]="[/font][font="],[/font][font="]var_seq[/font][font="][[/font][b][font="]1[/font][/b][font="]]);[/font][/p][p=22, 2, left][font="]var_seq[/font][font="]=[/font][font="]var_seq[/font][font="]+[/font][b][font="]1[/font][/b][font="];[/font][/p][p=22, 2, left][font="]print[/font][font="]([/font][font="]"currentbar="[/font][font="],[/font][font="]currentbar[/font][font="],[/font][font="]", 5 "[/font][font="],[/font][font="]",var_seq="[/font][font="],[/font][font="]var_seq[/font][font="]);[/font][/p][p=22, 2, left][font="]var_seq[/font][font="]=[/font][font="]var_seq[/font][font="]+[/font][b][font="]1[/font][/b][font="];[/font][/p][p=22, 2, left][font="]print[/font][font="]([/font][font="]"currentbar="[/font][font="],[/font][font="]currentbar[/font][font="],[/font][font="]", 7 "[/font][font="],[/font][font="]",var_seq="[/font][font="],[/font][font="]var_seq[/font][font="], [/font][font="]",barstatus="[/font][font="],[/font][font="]barstatus[/font][font="]);[/font][/p][p=22, 2, left][font=inherit]//[/font][font=宋体]部分输出[/font][/p][table=511]
[tr][td=1,1,511][p=22, 2, left][font=宋体][size=11pt]currentbar= 5.00, 3 ,var_seq= 8.00,var_seq[1]= 8.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,511][p=22, 2, left][font=宋体][size=11pt]currentbar= 5.00, 5 ,var_seq= 9.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,511][p=22, 2, left][font=宋体][size=11pt]currentbar= 5.00, 7 ,var_seq= 10.00,barstatus= 1.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,511][p=22, 2, left][font=宋体][size=11pt]currentbar= 5.00, 3 ,var_seq= 8.00,var_seq[1]= 8.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,511][p=22, 2, left][font=宋体][size=11pt]currentbar= 5.00, 5 ,var_seq= 9.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,511][p=22, 2, left][font=宋体][size=11pt]currentbar= 5.00, 7 ,var_seq= 10.00,barstatus= 2.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,511][p=22, 2, left][font=宋体][size=11pt]currentbar= 6.00, 3 ,var_seq= 10.00,var_seq[1]= 10.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,511][p=22, 2, left][font=宋体][size=11pt]currentbar= 6.00, 5 ,var_seq= 11.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,511][p=22, 2, left][font=宋体][size=11pt]currentbar= 6.00, 7 ,var_seq= 12.00,barstatus= 0.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,511][p=22, 2, left][font=宋体][size=11pt]currentbar= 6.00, 3 ,var_seq= 10.00,var_seq[1]= 10.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,511][p=22, 2, left][font=宋体][size=11pt]currentbar= 6.00, 5 ,var_seq= 11.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,511][p=22, 2, left][font=宋体][size=11pt]currentbar= 6.00, 7 ,var_seq= 12.00,barstatus= 1.00[/size][/font][/p][/td][/tr]
[/table][p=22, 2, left][font=宋体]除特别声明的变量之外,[/font][font=inherit]MC[/font][font=宋体]中默认的变量都是时序类型变量,如上面的变量[/font][font=inherit]var-_seq[/font][font=宋体],信号每次执行计算开始时都会为时序类型变量[/font][font=inherit]var_seq[/font][font=宋体]分配一个临时的内存区域,用于存储[/font][font=inherit]var_seq[/font][font=宋体]的最新的值,临时内存区域中初始存储的值是最新的值,也就是前一根[/font][font=inherit]bar[/font][font=宋体]上绑定的变量值,因为此时前一根[/font][font=inherit]bar[/font][font=宋体]上绑定的值是变量最新的值;当[/font][font=inherit]var_seq[/font][font=宋体]被调用时,[/font] [font=inherit]var_seq[/font][font=宋体]会调用临时存储的最新值,然后将变量[/font][font=inherit]var_seq[/font][font=宋体]最新的计算结果存储到临时内存区域中;当信号每次执行计算结束时,若当根[/font][font=inherit]bar[/font][font=宋体]是收盘状态(即[/font][font=inherit]barstatus=2[/font][font=宋体]),那么信号会将临时存储区域中的最新值绑定到当根[/font][font=inherit]bar[/font][font=宋体]上,若当根[/font][font=inherit]bar[/font][font=宋体]不是收盘状态,那么信号不对时序类型变量[/font][font=inherit]var_seq[/font][font=宋体]作绑定处理,之后将该临时内存区域释放掉,下次信号执行计算开始时会重新为时序类型变量[/font][font=inherit]var_seq[/font][font=宋体]分配一个新的临时的内存区域。总而言之,信号会在当根[/font][font=inherit]bar[/font][font=宋体]的收盘状态时将时序类型变量在临时存储区域中的最新值绑定到当根[/font][font=inherit]bar[/font][font=宋体]上,用于后续的变量回溯调用(回测调用的数量会受最大[/font][font=inherit]bar[/font][font=宋体]的数量限制),而这个临时的存储区域会在每次信号计算开始时重新分配。[/font][/p][p=22, 2, left][font=宋体]对于上面的测试情境,由于内容限制,我们只截取了[/font][font=inherit]4[/font][font=宋体]次计算的输出结果:[/font][/p][p=22, 2, left][font=Wingdings]l
[/font][font=宋体]第一次计算开始时分配一块临时内存区域,将前一根[/font][font=inherit]bar[/font][font=宋体]上绑定的最新的变量值存储到临时内存区域中;在第[/font][font=inherit]3[/font][font=宋体]行代码中调用变量[/font][font=inherit]var_seq[/font][font=宋体]的值时,会调用临时内存区域中的最新的值,即[/font][font=inherit]8[/font][font=宋体];第[/font][font=inherit]4[/font][font=宋体]行代码,执行语句“[/font][font="]var_seq[/font][font="]=[/font][font="]var_seq[/font][font="]+[/font][b][font="]1[/font][/b][font="];[/font][font=宋体]”,首先调用在等式右边调用变量[/font][font="]var_seq[/font][font=宋体]的值,这个值取临时内存区域中存储的最新的值,累加[/font][font="]1[/font][font=宋体]之后存储到临时内存区域;第[/font][font="]5[/font][font=宋体]行代码,调用变量[/font][font="]var_seq[/font][font=宋体]时,是取临时内存区域中存储的计算值,然后输出[/font][font="]9[/font][font=宋体];第[/font][font="]6[/font][font=宋体]行代码,[/font][font=宋体]执行语句“[/font][font="]var_seq[/font][font="]=[/font][font="]var_seq[/font][font="]+[/font][b][font="]1[/font][/b][font="];[/font][font=宋体]”,等式右边会调用临时内存区域中的计算值[/font][font="]9[/font][font=宋体],然后累加[/font][font="]1[/font][font=宋体]之后,再将[/font][font="]10[/font][font=宋体]存储到临时内存区域中;第[/font][font="]7[/font][font=宋体]行代码,调用临时内存区域中的值,然后输出,值为[/font][font="]10[/font][font=宋体];由于当根[/font][font="]bar[/font][font=宋体]的状态是[/font][font="]bar[/font][font=宋体]内状态(即[/font][font="]barstatus=1[/font][font=宋体]),所以信号不对临时内存区域中存储的计算值进行绑定处理,直接将临时内存区域释放。[/font][/p][p=22, 2, left][font=Wingdings]l
[/font][font=宋体]第二次计算开始时分配一块临时内存区域,临时内存区域的初始值存储的是前一根[/font][font=inherit]bar[/font][font=宋体]上绑定的变量值,即[/font][font=inherit]8[/font][font=宋体];在第[/font][font=inherit]3[/font][font=宋体]行代码中调用变量[/font][font=inherit]var_seq[/font][font=宋体]的值时,会调用临时内存区域中变量[/font][font=inherit]var_seq[/font][font=宋体]的值,即[/font][font=inherit]8[/font][font=宋体];第[/font][font=inherit]4[/font][font=宋体]行代码,执行语句“[/font][font="]var_seq[/font][font="]=[/font][font="]var_seq[/font][font="]+[/font][b][font="]1[/font][/b][font="];[/font][font=宋体]”,首先在等式右边调用变量[/font][font="]var_seq[/font][font=宋体]的值,这个值取临时内存区域中存储的最新的值,累加[/font][font="]1[/font][font=宋体]之后存储到临时内存区域,即[/font][font="]9[/font][font=宋体];第[/font][font="]5[/font][font=宋体]行代码,调用变量[/font][font="]var_seq[/font][font=宋体]的值时会调用临时内存区域中存储的值[/font][font="]9[/font][font=宋体],也就是调用最新的值,然后输出[/font][font="]9[/font][font=宋体];第[/font][font="]6[/font][font=宋体]行代码,执行语句[/font][font=宋体]“[/font][font="]var_seq[/font][font="]=[/font][font="]var_seq[/font][font="]+[/font][b][font="]1[/font][/b][font="];[/font][font=宋体]”,首先在等式右边调用变量[/font][font="]var_seq[/font][font=宋体]的值[/font][font="]9[/font][font=宋体],也就是调用临时内存区域中存储的最新的值[/font][font="]9[/font][font=宋体],然后累加[/font][font="]1[/font][font=宋体]之后存储到临时内存区域中,即将[/font][font="]10[/font][font=宋体]存储到临时内存区域中;第[/font][font="]7[/font][font=宋体]行代码,调用变量[/font][font="]var_seq[/font][font=宋体]的最新值,也就是调用临时内存区域中的最新值[/font][font="]10[/font][font=宋体],然后输出[/font][font="]10[/font][font=宋体];此时信号执行计算结束,由于此时当根[/font][font="]bar[/font][font=宋体]的状态是收盘状态(即[/font][font="]barstatus=2[/font][font=宋体]),那么信号会将临时内存区域中最新的值[/font][font="]10[/font][font=宋体]绑定到当根[/font][font="]bar[/font][font=宋体]上,那么在后面就可以调用这根[/font][font="]bar[/font][font=宋体]上绑定的变量[/font][font="]var_seq[/font][font=宋体]的值。[/font][/p][p=22, 2, left][font=Wingdings]l
[/font][font=宋体]第三次计算开始时分配一块临时内存区域,临时内存区域的初始存储的值是最新的值,而此时最新的值是前一根[/font][font=inherit]bar[/font][font=宋体]上绑定的值,即[/font][font=inherit]10[/font][font=宋体];第[/font][font=inherit]3[/font][font=宋体]行代码中,调用变量[/font][font=inherit]var_seq[/font][font=宋体]的最新的值,会调用临时内存区域中变量[/font][font=inherit]var_seq[/font][font=宋体]值,即[/font][font=inherit]10[/font][font=宋体],然后输出[/font][font=inherit]10[/font][font=宋体];第[/font][font=inherit]4[/font][font=宋体]行代码,执行语句“[/font][font="]var_seq[/font][font="]=[/font][font="]var_seq[/font][font="]+[/font][b][font="]1[/font][/b][font="];[/font][font=宋体]”,会调用临时内存区域中最新的值[/font][font="]10[/font][font=宋体],然后累加[/font][font="]1[/font][font=宋体]之后再将最新的值存储到临时内存区域中,即存储[/font][font="]11[/font][font=宋体];第[/font][font="]5[/font][font=宋体]行代码,调用临时内存区域中的最新值[/font][font="]11[/font][font=宋体],然后输出[/font][font="]11[/font][font=宋体];第[/font][font="]6[/font][font=宋体]行代码,执行语句[/font][font=宋体]“[/font][font="]var_seq[/font][font="]=[/font][font="]var_seq[/font][font="]+[/font][b][font="]1[/font][/b][font="];[/font][font=宋体]”,会调用临时内存区域中最新的值[/font][font="]11[/font][font=宋体],然后累加[/font][font="]1[/font][font=宋体]之后将最新的值[/font][font="]12[/font][font=宋体]存储到临时内存区域中;第[/font][font="]7[/font][font=宋体]行代码,调用临时内存区域中最新的值[/font][font="]12[/font][font=宋体],然后输出[/font][font="]12[/font][font=宋体];此时信号执行计算结束,由于此时当根[/font][font="]bar[/font][font=宋体]的状态是开盘状态(即[/font][font="]barstatus=0[/font][font=宋体]),那么策略(信号)不会将临时内存区域中的最新值[/font][font="]12[/font][font=宋体]绑定到当根[/font][font="]bar[/font][font=宋体]上,直接释放临时内存区域。[/font][/p][p=22, 2, left][font=Wingdings]l
[/font][font=宋体]第四次计算,可以参考上面的三次计算的原理,不再多述。[/font][/p][p=22, 2, left][font=宋体]3. [/font][font=宋体]数值类型[/font][/p][p=22, 2, left][font=宋体]前一节,我们说过,[/font][font=inherit]MC[/font][font=宋体]中默认的变量都是时序类型变量,也就是说数值类型变量需要特别声明,那么如何声明一个数值类型变量呢?[/font][font=inherit]MC[/font][font=宋体]有一个关键字[/font][font=inherit]recalcpersist[/font][font=宋体],用于声明数值类型变量,代码如下:[/font][/p][p=22, 2, left][font="]variable[/font][font="]:[/font] [font="]recalcpersist[/font] [font="]var_numeric[/font][font="]([/font][b][font="]0[/font][/b][font="]);[/font][/p][p=22, 2, left][font="]{[/font][font=宋体]在每个数值类型变量声明之前加上关键字[/font][font="]recalcpersist[/font][font=宋体],那么该变量就是数值类型变量,如上面的变量[/font][font="]var_numeric[/font][font=宋体]就是一个数值类型变量[/font][font="]}[/font][/p][p=22, 2, left][font=宋体]数值类型变量与时序类型变量有两个地方不同:[/font][font="]1. [/font][font=宋体]不会在每根[/font][font="]bar[/font][font=宋体]上绑定一个值用于回溯调用;[/font][font="]2. [/font][font=宋体]不会分配临时内存区域,而是会分配一个永久内存区域,这里的永久只是相对于临时而言的,“永久”也有它的生命周期。当将信号插入到图表中,就会为信号中的数值类型变量分配一块永久内存区域,当将信号从图表上删除该永久内存区域才会释放,当将信号重新插入到图表中去时,又要重新分配一块永久内存区域;当将信号重新编译时,信号会为数值类型变量重新分配一块永久内存区域,这里是重新分配,也就是之前存储的数值被释放了,不会保留到当前的内存区域中去;除了以上两种情况之外,对于其它情况,永久内存区域都一至不变,每次信号执行计算时,都会调用永久内存区域中存储的数值类型变量值,然后将最新的计算结果再存储到永久内存区域中去。(注意:将信号在图表上的状态由“开启”变成“关闭”不是将信号从图表上移除,所以这种情况永久内存区域没有释放)[/font][/p][p=22, 2, left][font="]//[/font][font=宋体]信号代码[/font][/p][p=22, 2, left][font="][[/font][font="]IntrabarOrderGeneration[/font][font="]=[/font][font="]true[/font][font="]][/font][/p][p=22, 2, left][font="]variable[/font][font="]:[/font] [font="]recalcpersist[/font] [font="]var_numeric[/font][font="]([/font][b][font="]0[/font][/b][font="]);[/font][/p][p=22, 2, left][font="]print[/font][font="]([/font][font="]"currentbar="[/font][font="],[/font][font="]currentbar[/font][font="],[/font][font="]", 3 "[/font][font="],[/font][font="]",var_numeric="[/font][font="],[/font][font="]var_numeric[/font][font="],[/font][font="]",var_numeric[1]="[/font][font="],[/font][font="]var_numeric[/font][font="][[/font][b][font="]1[/font][/b][font="]]);[/font][/p][p=22, 2, left][font="]var_numeric[/font][font="]=[/font][font="]var_numeric[/font][font="]+[/font][b][font="]1[/font][/b][font="];[/font][/p][p=22, 2, left][font="]print[/font][font="]([/font][font="]"currentbar="[/font][font="],[/font][font="]currentbar[/font][font="],[/font][font="]", 5 "[/font][font="],[/font][font="]",var_numeric="[/font][font="],[/font][font="]var_numeric[/font][font="]);[/font][/p][p=22, 2, left][font="]var_numeric[/font][font="]=[/font][font="]var_numeric[/font][font="]+[/font][b][font="]1[/font][/b][font="];[/font][/p][p=22, 2, left][font="]print[/font][font="]([/font][font="]"currentbar="[/font][font="],[/font][font="]currentbar[/font][font="],[/font][font="]", 7 "[/font][font="],[/font][font="]",var_numeric="[/font][font="],[/font][font="]var_numeric[/font][font="],[/font][font="]",barstatus="[/font][font="],[/font][font="]barstatus[/font][font="]);[/font][/p][p=22, 2, left][font=inherit]//[/font][font=宋体]部分输出[/font][/p][table=98%]
[tr][td=1,1,599][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 3 ,var_numeric= 0.00,var_numeric[1]= 0.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,599][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 5 ,var_numeric= 1.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,599][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 7 ,var_numeric= 2.00,barstatus= 0.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,599][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 3 ,var_numeric= 2.00,var_numeric[1]= 2.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,599][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 5 ,var_numeric= 3.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,599][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 7 ,var_numeric= 4.00,barstatus= 1.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,599][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 3 ,var_numeric= 4.00,var_numeric[1]= 4.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,599][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 5 ,var_numeric= 5.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,599][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 7 ,var_numeric= 6.00,barstatus= 1.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,599][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 3 ,var_numeric= 6.00,var_numeric[1]= 6.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,599][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 5 ,var_numeric= 7.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,599][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 7 ,var_numeric= 8.00,barstatus= 2.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,599][p=22, 2, left][font=宋体][size=11pt]currentbar= 2.00, 3 ,var_numeric= 8.00,var_numeric[1]= 8.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,599][p=22, 2, left][font=宋体][size=11pt]currentbar= 2.00, 5 ,var_numeric= 9.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,599][p=22, 2, left][font=宋体][size=11pt]currentbar= 2.00, 7 ,var_numeric= 10.00,barstatus= 0.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,599][p=22, 2, left][font=宋体][size=11pt]currentbar= 2.00, 3 ,var_numeric= 10.00,var_numeric[1]= 10.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,599][p=22, 2, left][font=宋体][size=11pt]currentbar= 2.00, 5 ,var_numeric= 11.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,599][p=22, 2, left][font=宋体][size=11pt]currentbar= 2.00, 7 ,var_numeric= 12.00,barstatus= 1.00[/size][/font][/p][/td][/tr]
[/table]
[p=22, 2, left][font=宋体]这部分的信号代码与上一节唯一不同的地方只是将时序类型变量替换成数值类型变量而已,其它地方没有变化,可以通过相互比较进行理解。由于内容的限制,这里也只是列举前[/font][font=inherit]6[/font][font=宋体]次计算的输出结果,通过结果进行详细的说明原理。[/font][/p][p=22, 2, left][font=Wingdings]l
[/font][font=宋体]信号为数值类型变量[/font][font=inherit]var_numeric[/font][font=宋体]分配了一块永久内存区域,第一次分配或者重新分配永久内存区域时,都会将类型类型变量的初始值(即声明变量时括号中的值,这里是[/font][font=inherit]0[/font][font=宋体])存储到永久内存区域中去,作为初始的最新值。[/font][/p][p=22, 2, left][font=Wingdings]l
[/font][font=宋体]第一次计算时,第[/font][font=inherit]3[/font][font=宋体]行代码中会调用变量[/font][font=inherit]var_numeric[/font][font=宋体]的变量值,而此时永久内存区域中存储的最新的值是数值类型变量的初始值[/font][font=inherit]0[/font][font=宋体],所以输出[/font][font=inherit]var_numeric[/font][font=宋体]的值为[/font][font=inherit]0[/font][font=宋体];第[/font][font=inherit]4[/font][font=宋体]行代码执行语句“[/font][font="]var_numeric[/font][font="]=[/font][font="]var_numeric[/font][font="]+[/font][b][font="]1[/font][/b][font="];[/font][font=宋体]”,等式右边会调用永久内存区域中的最新的值[/font][font="]0[/font][font=宋体],然后经过累加[/font][font="]1[/font][font=宋体]之后,将最新值[/font][font="]1[/font][font=宋体]存储到永久内存区域中;第[/font][font="]5[/font][font=宋体]行代码,调用永久内存区域中的最新值[/font][font="]1[/font][font=宋体],然后输出;第[/font][font="]6[/font][font=宋体]行代码执行语句“[/font][font="]var_numeric[/font][font="]=[/font][font="]var_numeric[/font][font="]+[/font][b][font="]1[/font][/b][font="];[/font][font=宋体]”,等式右边会调用永久内存区域的最新的值[/font][font="]1[/font][font=宋体],然后经过累加之后,将最新的值[/font][font="]2[/font][font=宋体]存储到永久内存区域中;第[/font][font="]7[/font][font=宋体]行代码,调用永久内存区域中的最新的值[/font][font="]2[/font][font=宋体],然后输出。[/font][/p][p=22, 2, left][font=Wingdings]l
[/font][font=宋体]第[/font][font=inherit]2[/font][font=宋体]次计算和第[/font][font=inherit]3[/font][font=宋体]次计算不再叙述,可以参考第[/font][font=inherit]1[/font][font=宋体]次计算的分析过程。第[/font][font=inherit]4[/font][font=宋体]次计算时,第[/font][font=inherit]3[/font][font=宋体]行代码会调用永久内存区域中的最新的值[/font][font=inherit]6[/font][font=宋体],然后输出[/font][font=inherit]6[/font][font=宋体];第[/font][font=inherit]4[/font][font=宋体]行代码执行语句“[/font][font="]var_numeric[/font][font="]=[/font][font="]var_numeric[/font][font="]+[/font][b][font="]1[/font][/b][font="];[/font][font=宋体]”,等式右边调用永久内存区域中的最新的值[/font][font="]6[/font][font=宋体],然后累加[/font][font="]1[/font][font=宋体]之后将最新值[/font][font="]7[/font][font=宋体]存储到永久内存区域中;第[/font][font="]5[/font][font=宋体]行代码会调用永久内存区域中的最新的值[/font][font="]7[/font][font=宋体],然后输出[/font][font="]7[/font][font=宋体];第[/font][font="]6[/font][font=宋体]行代码执行语句“[/font][font="]var_numeric[/font][font="]=[/font][font="]var_numeric[/font][font="]+[/font][b][font="]1[/font][/b][font="];[/font][font=宋体]”,等式右边调用永久内存区域中的最新的值[/font][font="]7[/font][font=宋体],然后累加[/font][font="]1[/font][font=宋体]之后将最新的计算结果[/font][font="]8[/font][font=宋体]存储到永久内存区域中去;第[/font][font="]7[/font][font=宋体]行代码调用永久内存区域中的最新的值[/font][font="]8[/font][font=宋体],然后输出。此时当根[/font][font="]bar[/font][font=宋体]的状态是收盘状态,但是信号并不会将永久内存区域中的最新的值绑定到当根[/font][font="]bar[/font][font=宋体]上,也就是说数值类型变量只会有一个存储区域用于存储最新的值,基于此,[/font][font="]var_numeric[1][/font][font=宋体]、[/font][font="]var_numeric[2][/font][font=宋体]、[/font][font="]var_numeric[N][/font][font=宋体]始终取的是永久内存区域中的最新的值,即始终等于[/font][font="]var_numeric[/font][font=宋体]的值。[/font][/p][p=22, 2, left][font=Wingdings]l
[/font][font=宋体]第[/font][font=inherit]5[/font][font=宋体]次计算和第[/font][font=inherit]6[/font][font=宋体]次计算不再过多叙述,请参考上面的分析过程。[/font][/p][p=22, 2, left][font=宋体][font="]4. [/font][/font][font=宋体]复合类型[/font][/p][p=22, 2, left][font=宋体]上面我们叙述了时序类型变量和数值类型变量两种类型,但是这里需要提一下,[/font][font="]MC[/font][font=宋体]有一种复合类型的变量,兼具了时序类型变量和数值类型变量的特性,这点会在下面的内容中详细阐述,那么它是如何进行声明的呢?因为前面说过,所有的变量默认都是时序类型变量,其它类型的变量,如数值类型变量和复合类型变量都需要在变量声明的时候特殊处理一下。复合类型变量声明的代码如下:[/font][/p][p=22, 2, left][font="]variable[/font][font="]:[/font] [font="]intrabarpersist[/font] [font="]var_intra[/font][font="]([/font][b][font="]0[/font][/b][font="]);[/font][/p][p=22, 2, left][font=inherit]{[/font][font=宋体]也就是在变量声明时,在变量的前面加上关键字[/font][font=inherit]intrabarpersist[/font][font=宋体],也许大家之前都认为,这个关键字只能用于[/font][font=inherit]bar[/font][font=宋体]内模式,但是其实不是,这个关键字的用法就是声明该变量是复合类型的变量[/font][font=inherit]}[/font][/p][p=22, 2, left][font=宋体]我们知道,当信号插入到图表上时,信号会从相对编号为[/font][font=inherit]1[/font][font=宋体]的[/font][font=inherit]bar[/font][font=宋体]上开始执行计算,然后基于相对编号为[/font][font=inherit]2[/font][font=宋体]的[/font][font=inherit]bar[/font][font=宋体]执行计算,以此类型一直向图表的右边的[/font][font=inherit]bar[/font][font=宋体]执行计算,这叫重新计算,所谓的重新计算就信号会从相对编号为[/font][font=inherit]1[/font][font=宋体]的[/font][font=inherit]bar[/font][font=宋体]上开始执行计算,然后一直向图表的右边的[/font][font=inherit]bar[/font][font=宋体]执行计算;而引发信号的重新计算的方式有很多,如对图表重新回补、重新插入信号到图表上、开启自动交易、重新编译、右键图表上选择“重新计算所有策略”、信号的状态由“关闭”转换为“开启”,这些都会引发信号基于图表的[/font][font=inherit]bar[/font][font=宋体]的重新计算。信号每次对图表进行重新计算时,初始时都会为复合类型变量在内存中分配一块内存区域,这块内存区域不是永久内存区域,也不是临时内存区域,它的生命周期只限于“重新计算”,也就是每次“重新计算”时,该内存区域都会重新分配,之前的内存区域中存储的值不会保留到最新的内存区域中,这就是复合类型变量在内存区域上与时序类型变量、数值类型变量不一样的地方;除了内存区域的不同,另一个地方就是,信号会在[/font][font=inherit]bar[/font][font=宋体]的收盘状态时将内存区域中的最新的值绑定到当根[/font][font=inherit]bar[/font][font=宋体]上,以便后续的回溯调用。[/font][/p][p=22, 2, left][font=宋体]通过上面对于时序类型变量及数值类型变量的叙述,复合类型变量的理解就变得简的多,所以这部分只是简单的案例解释,为方便对比,这里仍然以[/font][font=inherit]bar[/font][font=宋体]内模式为例。[/font][/p][p=22, 2, left][font=inherit]//[/font][font=宋体]信号代码[/font][/p][p=22, 2, left][font="][[/font][font="]IntrabarOrderGeneration[/font][font="]=[/font][font="]true[/font][font="]][/font][/p][p=22, 2, left][font="]variable[/font][font="]:[/font] [font="]intrabarpersist[/font] [font="]var_intra[/font][font="]([/font][b][font="]0[/font][/b][font="]);[/font][/p][p=22, 2, left][font="]print[/font][font="]([/font][font="]"currentbar="[/font][font="],[/font][font="]currentbar[/font][font="],[/font][font="]", 3 "[/font][font="],[/font][font="]",var_intra="[/font][font="],[/font][font="]var_intra[/font][font="],[/font][font="]",var_intra[1]="[/font][font="],[/font][font="]var_intra[/font][font="][[/font][b][font="]1[/font][/b][font="]]);[/font][/p][p=22, 2, left][font="]var_intra[/font][font="]=[/font][font="]var_intra[/font][font="]+[/font][b][font="]1[/font][/b][font="];[/font][/p][p=22, 2, left][font="]print[/font][font="]([/font][font="]"currentbar="[/font][font="],[/font][font="]currentbar[/font][font="],[/font][font="]", 5 "[/font][font="],[/font][font="]",var_intra="[/font][font="],[/font][font="]var_intra[/font][font="]);[/font][/p][p=22, 2, left][font="]var_intra[/font][font="]=[/font][font="]var_intra[/font][font="]+[/font][b][font="]1[/font][/b][font="];[/font][/p][p=22, 2, left][font="]print[/font][font="]([/font][font="]"currentbar="[/font][font="],[/font][font="]currentbar[/font][font="],[/font][font="]", 7 "[/font][font="],[/font][font="]",var_intra="[/font][font="],[/font][font="]var_intra[/font][font="],[/font][font="]",barstatus="[/font][font="],[/font][font="]barstatus[/font][font="]);[/font][/p][p=22, 2, left][font=inherit]//[/font][font=宋体]部分输出[/font][/p][table=98%]
[tr][td=1,1,564][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 3 ,var_intra= 0.00,var_intra[1]= 0.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,564][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 5 ,var_intra= 1.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,564][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 7 ,var_intra= 2.00,barstatus= 0.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,564][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 3 ,var_intra= 2.00,var_intra[1]= 0.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,564][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 5 ,var_intra= 3.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,564][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 7 ,var_intra= 4.00,barstatus= 1.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,564][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 3 ,var_intra= 4.00,var_intra[1]= 0.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,564][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 5 ,var_intra= 5.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,564][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 7 ,var_intra= 6.00,barstatus= 1.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,564][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 3 ,var_intra= 6.00,var_intra[1]= 0.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,564][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 5 ,var_intra= 7.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,564][p=22, 2, left][font=宋体][size=11pt]currentbar= 1.00, 7 ,var_intra= 8.00,barstatus= 2.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,564][p=22, 2, left][font=宋体][size=11pt]currentbar= 2.00, 3 ,var_intra= 8.00,var_intra[1]= 8.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,564][p=22, 2, left][font=宋体][size=11pt]currentbar= 2.00, 5 ,var_intra= 9.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,564][p=22, 2, left][font=宋体][size=11pt]currentbar= 2.00, 7 ,var_intra= 10.00,barstatus= 0.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,564][p=22, 2, left][font=宋体][size=11pt]currentbar= 2.00, 3 ,var_intra= 10.00,var_intra[1]= 8.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,564][p=22, 2, left][font=宋体][size=11pt]currentbar= 2.00, 5 ,var_intra= 11.00[/size][/font][/p][/td][/tr]
[tr][td=1,1,564][p=22, 2, left][font=宋体][size=11pt]currentbar= 2.00, 7 ,var_intra= 12.00,barstatus= 1.00[/size][/font][/p][/td][/tr]
[/table]
[p=22, 2, left][font=Wingdings]l
[/font][font=宋体]每次重新计算时,信号会为复合类型变量[/font][font=inherit]var_intra[/font][font=宋体]分别一块内存区域,该内存区域中会存储变量的初始值作为最新的值(即变量声明时,变量括号中的值,此时是[/font][font=inherit]0[/font][font=宋体])。[/font][/p][p=22, 2, left][font=Wingdings]l
[/font][font=宋体]第[/font][font=inherit]1[/font][font=宋体]次计算时,第[/font][font=inherit]3[/font][font=宋体]行代码会调用复合类型变量的最新的值,会取内存区域中的最新的值[/font][font=inherit]0[/font][font=宋体],然后输出;第[/font][font=inherit]4[/font][font=宋体]行代码,调用内存区域中的最新的值[/font][font=inherit]0[/font][font=宋体],然后累加[/font][font=inherit]1[/font][font=宋体]之后再存储到内存区域中;第[/font][font=inherit]5[/font][font=宋体]行代码,调用内存区域中的最新的值[/font][font=inherit]1[/font][font=宋体],然后输出;第[/font][font=inherit]6[/font][font=宋体]行,累累[/font][font=inherit]1[/font][font=宋体]之后,将[/font][font=inherit]2[/font][font=宋体]存储到内存区域中;第[/font][font=inherit]7[/font][font=宋体]行代码,会调用内存区域中最新的值[/font][font=inherit]2[/font][font=宋体],然后输出[/font][font=inherit]2[/font][font=宋体];信号执行计算结束,由于当根[/font][font=inherit]bar[/font][font=宋体]的状态是开盘[/font][font=inherit]bar[/font][font=宋体](即[/font][font=inherit]barstatus=0[/font][font=宋体]),而非收盘状态,所以信号不对复合类型变量执行绑定操作,也就是不将内存区域中最新的值[/font][font=inherit]2[/font][font=宋体]绑定到当根[/font][font=inherit]bar[/font][font=宋体]上。[/font][/p][p=22, 2, left][font=Wingdings]l
[/font][font=宋体]第[/font][font=inherit]2[/font][font=宋体]次计算和第[/font][font=inherit]3[/font][font=宋体]次计算,请参考上面的分析过程。[/font][/p][p=22, 2, left][font=Wingdings]l
[/font][font=宋体]第[/font][font=inherit]4[/font][font=宋体]次计算时,第[/font][font=inherit]7[/font][font=宋体]行代码,调用内存区域中最新的值[/font][font=inherit]8[/font][font=宋体],然后输出[/font][font=inherit]8[/font][font=宋体];信号执行计算结束,此时当根[/font][font=inherit]bar[/font][font=宋体]的状态是收盘状态(即[/font][font=inherit]barstatus=2[/font][font=宋体]),所以信号将内存区域中最新的值[/font][font=inherit]8[/font][font=宋体]绑定到当根[/font][font=inherit]bar[/font][font=宋体]上,以此后续可以回溯调用这根[/font][font=inherit]bar[/font][font=宋体]上的变量值。[/font][/p][p=22, 2, left][font=宋体][size=10.5pt]第[/size][/font][font=Calibri, sans-serif][size=10.5pt]6[/size][/font][font=宋体][size=10.5pt]次计算时,第[/size][/font][font=Calibri, sans-serif][size=10.5pt]3[/size][/font][font=宋体][size=10.5pt]行代码,调用了复合类型变量[/size][/font][font=Calibri, sans-serif][size=10.5pt]var_intra[/size][/font][font=宋体][size=10.5pt]的值和[/size][/font][font=Calibri, sans-serif][size=10.5pt]var_intra[1][/size][/font][font=宋体][size=10.5pt]的值,而[/size][/font][font=Calibri, sans-serif][size=10.5pt]var_intra[/size][/font][font=宋体][size=10.5pt]会取内存区域中最新的值,而[/size][/font][font=Calibri, sans-serif][size=10.5pt]var_intra[1][/size][/font][font=宋体][size=10.5pt]会取前一根[/size][/font][font=Calibri, sans-serif][size=10.5pt]bar[/size][/font][font=宋体][size=10.5pt]上绑定的值,即[/size][/font][font=Calibri, sans-serif][size=10.5pt]8[/size][/font][/p]
页:
[1]