电竞比分网-中国电竞赛事及体育赛事平台

分享

量化投資

 taozl 2022-09-23 發(fā)布于安徽

第十三章:變量類型

1. 變量

  信號(hào)中的變量除了value1~value99(這99個(gè)變量都是時(shí)序類型的數(shù)值變量,從value1、value2、value3,一直到value99)和condition1~condition99(這99個(gè)變量都是時(shí)序類型的布爾類型變量,從condition1、condition2、condition3,一直到condition99)這198個(gè)變量不需要聲明之外,其它的變量都需要聲明才可以在信號(hào)中使用,舉例如下:

variable: var0(0), var1(false), var2('');

  上面分別聲明了三個(gè)變量var0、var1、var2,變量分為數(shù)值類型變量、布爾類型變量、字符串類型變量,這三個(gè)變量分別對(duì)應(yīng)這三種類型,每個(gè)變量的類型是根據(jù)變量聲明時(shí)括號(hào)中的初始值來(lái)判斷的,而變量聲明時(shí)需要指定初始值,如變量var0的初始值是數(shù)值0,那么變量var0就是數(shù)值類型變量,變量var1的初始值是布爾類型,那么變量var1就是布爾類型變量,變量var2的初始值是字符串類型,那么變量var3就是字符串類型變量。關(guān)于更詳細(xì)的變量聲明,可以看一下公式編譯器中的關(guān)鍵字variable的說(shuō)明。

  MC的變量有兩種類型,分別是時(shí)序類型數(shù)值變量,兩者的本質(zhì)區(qū)別在于是否能回溯,這與它們的名稱也是相符合的;

  通俗的講,時(shí)序類型的變量就是在每根bar上都綁定一個(gè)值(即在內(nèi)存中為每根bar上的時(shí)序變量都分配一塊區(qū)域,用于存儲(chǔ)每根bar上的變量值),然后后續(xù)回溯的時(shí)候可以方便調(diào)用,而數(shù)值類型的變量始終只會(huì)保存最新的一個(gè)數(shù)值(即在內(nèi)存中只分配一塊區(qū)域,該區(qū)域只存儲(chǔ)最新的變量值);那么問(wèn)題是,變量什么時(shí)候進(jìn)行存儲(chǔ),這個(gè)點(diǎn)是關(guān)鍵需要理解的地方。另外,除了時(shí)序類型和數(shù)值類型兩大類型的變量之外,還有一種復(fù)合類型的變量,也就是兼具時(shí)序類型變量和數(shù)值類型變量的特點(diǎn),為不容易混淆,我們?cè)诤竺嬖訇U述。

2. 時(shí)序類型

  為方便講解,這里使用的是bar內(nèi)模式,從而信號(hào)會(huì)基于每筆tick執(zhí)行計(jì)算一次,也就是說(shuō)信號(hào)會(huì)在同一根bar上計(jì)算若干次。

復(fù)制代碼
//信號(hào)代碼
[IntrabarOrderGeneration=true]
variable: var_seq(0);
print('currentbar=',currentbar,', 3 ',',var_seq=',var_seq,',var_seq[1]=',var_seq[1]);
var_seq=var_seq+1;
print('currentbar=',currentbar,', 5 ',',var_seq=',var_seq);
var_seq=var_seq+1;
print('currentbar=',currentbar,', 7 ',',var_seq=',var_seq, ',barstatus=',barstatus);
復(fù)制代碼

  部分輸出:

復(fù)制代碼
currentbar=   5.00, 3 ,var_seq=   8.00,var_seq[1]=   8.00
currentbar=   5.00, 5 ,var_seq=   9.00
currentbar=   5.00, 7 ,var_seq=  10.00,barstatus=   1.00

currentbar=   5.00, 3 ,var_seq=   8.00,var_seq[1]=   8.00 currentbar=   5.00, 5 ,var_seq=   9.00 currentbar=   5.00, 7 ,var_seq=  10.00,barstatus=   2.00

currentbar=   6.00, 3 ,var_seq=  10.00,var_seq[1]=  10.00 currentbar=   6.00, 5 ,var_seq=  11.00 currentbar=   6.00, 7 ,var_seq=  12.00,barstatus=   0.00

currentbar=   6.00, 3 ,var_seq=  10.00,var_seq[1]=  10.00 currentbar=   6.00, 5 ,var_seq=  11.00 currentbar=   6.00, 7 ,var_seq=  12.00,barstatus=   1.00
復(fù)制代碼

  除特別聲明的變量之外,MC中默認(rèn)的變量都是時(shí)序類型變量,如上面的變量var_seq,信號(hào)每次執(zhí)行計(jì)算開(kāi)始時(shí)都會(huì)為時(shí)序類型變量var_seq分配一個(gè)臨時(shí)的內(nèi)存區(qū)域,用于存儲(chǔ)var_seq的最新的值,臨時(shí)內(nèi)存區(qū)域中初始存儲(chǔ)的值是最新的值,也就是前一根bar上綁定的變量值,因?yàn)榇藭r(shí)前一根bar上綁定的值是變量最新的值;當(dāng)var_seq被調(diào)用時(shí), var_seq會(huì)調(diào)用臨時(shí)存儲(chǔ)的最新值,然后將變量var_seq最新的計(jì)算結(jié)果存儲(chǔ)到臨時(shí)內(nèi)存區(qū)域中;當(dāng)信號(hào)每次執(zhí)行計(jì)算結(jié)束時(shí),若當(dāng)根bar是收盤狀態(tài)(即barstatus=2),那么信號(hào)會(huì)將臨時(shí)存儲(chǔ)區(qū)域中的最新值綁定到當(dāng)根bar上,若當(dāng)根bar不是收盤狀態(tài),那么信號(hào)不對(duì)時(shí)序類型變量var_seq作綁定處理,之后將該臨時(shí)內(nèi)存區(qū)域釋放掉,下次信號(hào)執(zhí)行計(jì)算開(kāi)始時(shí)會(huì)重新為時(shí)序類型變量var_seq分配一個(gè)新的臨時(shí)的內(nèi)存區(qū)域??偠灾?,信號(hào)會(huì)在當(dāng)根bar的收盤狀態(tài)時(shí)將時(shí)序類型變量在臨時(shí)存儲(chǔ)區(qū)域中的最新值綁定到當(dāng)根bar上,用于后續(xù)的變量回溯調(diào)用(回測(cè)調(diào)用的數(shù)量會(huì)受最大bar的數(shù)量限制),而這個(gè)臨時(shí)的存儲(chǔ)區(qū)域會(huì)在每次信號(hào)計(jì)算開(kāi)始時(shí)重新分配。

  對(duì)于上面的測(cè)試情境,由于內(nèi)容限制,我們只截取了4次計(jì)算的輸出結(jié)果:

l  第一次計(jì)算開(kāi)始時(shí)分配一塊臨時(shí)內(nèi)存區(qū)域,將前一根bar上綁定的最新的變量值存儲(chǔ)到臨時(shí)內(nèi)存區(qū)域中;在第3行代碼中調(diào)用變量var_seq的值時(shí),會(huì)調(diào)用臨時(shí)內(nèi)存區(qū)域中的最新的值,即8;第4行代碼,執(zhí)行語(yǔ)句“var_seq=var_seq+1;”,首先調(diào)用在等式右邊調(diào)用變量var_seq的值,這個(gè)值取臨時(shí)內(nèi)存區(qū)域中存儲(chǔ)的最新的值,累加1之后存儲(chǔ)到臨時(shí)內(nèi)存區(qū)域;第5行代碼,調(diào)用變量var_seq時(shí),是取臨時(shí)內(nèi)存區(qū)域中存儲(chǔ)的計(jì)算值,然后輸出9;第6行代碼,執(zhí)行語(yǔ)句“var_seq=var_seq+1;”,等式右邊會(huì)調(diào)用臨時(shí)內(nèi)存區(qū)域中的計(jì)算值9,然后累加1之后,再將10存儲(chǔ)到臨時(shí)內(nèi)存區(qū)域中;第7行代碼,調(diào)用臨時(shí)內(nèi)存區(qū)域中的值,然后輸出,值為10;由于當(dāng)根bar的狀態(tài)是bar內(nèi)狀態(tài)(即barstatus=1),所以信號(hào)不對(duì)臨時(shí)內(nèi)存區(qū)域中存儲(chǔ)的計(jì)算值進(jìn)行綁定處理,直接將臨時(shí)內(nèi)存區(qū)域釋放。

l  第二次計(jì)算開(kāi)始時(shí)分配一塊臨時(shí)內(nèi)存區(qū)域,臨時(shí)內(nèi)存區(qū)域的初始值存儲(chǔ)的是前一根bar上綁定的變量值,即8;在第3行代碼中調(diào)用變量var_seq的值時(shí),會(huì)調(diào)用臨時(shí)內(nèi)存區(qū)域中變量var_seq的值,即8;第4行代碼,執(zhí)行語(yǔ)句“var_seq=var_seq+1;”,首先在等式右邊調(diào)用變量var_seq的值,這個(gè)值取臨時(shí)內(nèi)存區(qū)域中存儲(chǔ)的最新的值,累加1之后存儲(chǔ)到臨時(shí)內(nèi)存區(qū)域,即9;第5行代碼,調(diào)用變量var_seq的值時(shí)會(huì)調(diào)用臨時(shí)內(nèi)存區(qū)域中存儲(chǔ)的值9,也就是調(diào)用最新的值,然后輸出9;第6行代碼,執(zhí)行語(yǔ)句“var_seq=var_seq+1;”,首先在等式右邊調(diào)用變量var_seq的值9,也就是調(diào)用臨時(shí)內(nèi)存區(qū)域中存儲(chǔ)的最新的值9,然后累加1之后存儲(chǔ)到臨時(shí)內(nèi)存區(qū)域中,即將10存儲(chǔ)到臨時(shí)內(nèi)存區(qū)域中;第7行代碼,調(diào)用變量var_seq的最新值,也就是調(diào)用臨時(shí)內(nèi)存區(qū)域中的最新值10,然后輸出10;此時(shí)信號(hào)執(zhí)行計(jì)算結(jié)束,由于此時(shí)當(dāng)根bar的狀態(tài)是收盤狀態(tài)即barstatus=2),那么信號(hào)會(huì)將臨時(shí)內(nèi)存區(qū)域中最新的值10綁定到當(dāng)根bar上,那么在后面就可以調(diào)用這根bar上綁定的變量var_seq的值。

l  第三次計(jì)算開(kāi)始時(shí)分配一塊臨時(shí)內(nèi)存區(qū)域,臨時(shí)內(nèi)存區(qū)域的初始存儲(chǔ)的值是最新的值,而此時(shí)最新的值是前一根bar上綁定的值,即10;第3行代碼中,調(diào)用變量var_seq的最新的值,會(huì)調(diào)用臨時(shí)內(nèi)存區(qū)域中變量var_seq值,即10,然后輸出10;第4行代碼,執(zhí)行語(yǔ)句“var_seq=var_seq+1;”,會(huì)調(diào)用臨時(shí)內(nèi)存區(qū)域中最新的值10,然后累加1之后再將最新的值存儲(chǔ)到臨時(shí)內(nèi)存區(qū)域中,即存儲(chǔ)11;第5行代碼,調(diào)用臨時(shí)內(nèi)存區(qū)域中的最新值11,然后輸出11;第6行代碼,執(zhí)行語(yǔ)句“var_seq=var_seq+1;”,會(huì)調(diào)用臨時(shí)內(nèi)存區(qū)域中最新的值11,然后累加1之后將最新的值12存儲(chǔ)到臨時(shí)內(nèi)存區(qū)域中;第7行代碼,調(diào)用臨時(shí)內(nèi)存區(qū)域中最新的值12,然后輸出12;此時(shí)信號(hào)執(zhí)行計(jì)算結(jié)束,由于此時(shí)當(dāng)根bar的狀態(tài)是開(kāi)盤狀態(tài)(即barstatus=0),那么策略(信號(hào))不會(huì)將臨時(shí)內(nèi)存區(qū)域中的最新值12綁定到當(dāng)根bar上,直接釋放臨時(shí)內(nèi)存區(qū)域。

l  第四次計(jì)算,可以參考上面的三次計(jì)算的原理,不再多述。

【備注】序列變量新值的綁定是在barstatu=2時(shí)進(jìn)行綁定,在bar內(nèi)狀態(tài)下不進(jìn)行綁定。會(huì)重新覆蓋計(jì)算。

3. 數(shù)值類型

  前一節(jié),我們說(shuō)過(guò),MC中默認(rèn)的變量都是時(shí)序類型變量,也就是說(shuō)數(shù)值類型變量需要特別聲明,那么如何聲明一個(gè)數(shù)值類型變量呢?MC有一個(gè)關(guān)鍵字recalcpersist,用于聲明數(shù)值類型變量,代碼如下:

variable: recalcpersist var_numeric(0);

  {在每個(gè)數(shù)值類型變量聲明之前加上關(guān)鍵字recalcpersist,那么該變量就是數(shù)值類型變量,如上面的變量var_numeric就是一個(gè)數(shù)值類型變量}

  數(shù)值類型變量與時(shí)序類型變量有兩個(gè)地方不同

  1. 不會(huì)在每根bar上綁定一個(gè)值用于回溯調(diào)用

  2. 不會(huì)分配臨時(shí)內(nèi)存區(qū)域,而是會(huì)分配一個(gè)永久內(nèi)存區(qū)域,這里的永久只是相對(duì)于臨時(shí)而言的,“永久”也有它的生命周期。

  當(dāng)將信號(hào)插入到圖表中,就會(huì)為信號(hào)中的數(shù)值類型變量分配一塊永久內(nèi)存區(qū)域,當(dāng)將信號(hào)從圖表上刪除該永久內(nèi)存區(qū)域才會(huì)釋放,當(dāng)將信號(hào)重新插入到圖表中去時(shí),又要重新分配一塊永久內(nèi)存區(qū)域;當(dāng)將信號(hào)重新編譯時(shí),信號(hào)會(huì)為數(shù)值類型變量重新分配一塊永久內(nèi)存區(qū)域,這里是重新分配,也就是之前存儲(chǔ)的數(shù)值被釋放了,不會(huì)保留到當(dāng)前的內(nèi)存區(qū)域中去;

  除了以上兩種情況之外,對(duì)于其它情況,永久內(nèi)存區(qū)域都一至不變,每次信號(hào)執(zhí)行計(jì)算時(shí),都會(huì)調(diào)用永久內(nèi)存區(qū)域中存儲(chǔ)的數(shù)值類型變量值,然后將最新的計(jì)算結(jié)果再存儲(chǔ)到永久內(nèi)存區(qū)域中去。(注意:將信號(hào)在圖表上的狀態(tài)由“開(kāi)啟”變成“關(guān)閉”不是將信號(hào)從圖表上移除,所以這種情況永久內(nèi)存區(qū)域沒(méi)有釋放

復(fù)制代碼
//信號(hào)代碼
[IntrabarOrderGeneration=true]
variable: recalcpersist var_numeric(0);
print('currentbar=',currentbar,', 3 ',',var_numeric=',var_numeric,',var_numeric[1]=',var_numeric[1]);
var_numeric=var_numeric+1;
print('currentbar=',currentbar,', 5 ',',var_numeric=',var_numeric);
var_numeric=var_numeric+1;
print('currentbar=',currentbar,', 7 ',',var_numeric=',var_numeric, ',barstatus=',barstatus);
復(fù)制代碼

//部分輸出

復(fù)制代碼
currentbar=   1.00, 3 ,var_numeric=   0.00,var_numeric[1]=   0.00
currentbar=   1.00, 5 ,var_numeric=   1.00
currentbar=   1.00, 7 ,var_numeric=   2.00,barstatus=   0.00

currentbar=   1.00, 3 ,var_numeric=   2.00,var_numeric[1]=   2.00 currentbar=   1.00, 5 ,var_numeric=   3.00 currentbar=   1.00, 7 ,var_numeric=   4.00,barstatus=   1.00

currentbar=   1.00, 3 ,var_numeric=   4.00,var_numeric[1]=   4.00 currentbar=   1.00, 5 ,var_numeric=   5.00 currentbar=   1.00, 7 ,var_numeric=   6.00,barstatus=   1.00

currentbar=   1.00, 3 ,var_numeric=   6.00,var_numeric[1]=   6.00 currentbar=   1.00, 5 ,var_numeric=   7.00 currentbar=   1.00, 7 ,var_numeric=   8.00,barstatus=   2.00

currentbar=   2.00, 3 ,var_numeric=   8.00,var_numeric[1]=   8.00 currentbar=   2.00, 5 ,var_numeric=   9.00 currentbar=   2.00, 7 ,var_numeric=  10.00,barstatus=   0.00

currentbar=   2.00, 3 ,var_numeric=  10.00,var_numeric[1]=  10.00 currentbar=   2.00, 5 ,var_numeric=  11.00 currentbar=   2.00, 7 ,var_numeric=  12.00,barstatus=   1.00
復(fù)制代碼

  這部分的信號(hào)代碼與上一節(jié)唯一不同的地方只是將時(shí)序類型變量替換成數(shù)值類型變量而已,其它地方?jīng)]有變化,可以通過(guò)相互比較進(jìn)行理解。由于內(nèi)容的限制,這里也只是列舉前6次計(jì)算的輸出結(jié)果,通過(guò)結(jié)果進(jìn)行詳細(xì)的說(shuō)明原理。

  信號(hào)為數(shù)值類型變量var_numeric分配了一塊永久內(nèi)存區(qū)域,第一次分配或者重新分配永久內(nèi)存區(qū)域時(shí),都會(huì)將類型類型變量的初始值(即聲明變量時(shí)括號(hào)中的值,這里是0)存儲(chǔ)到永久內(nèi)存區(qū)域中去,作為初始的最新值。

l  第一次計(jì)算時(shí),第3行代碼中會(huì)調(diào)用變量var_numeric的變量值,而此時(shí)永久內(nèi)存區(qū)域中存儲(chǔ)的最新的值是數(shù)值類型變量的初始值0,所以輸出var_numeric的值為0;第4行代碼執(zhí)行語(yǔ)句“var_numeric=var_numeric+1;”,等式右邊會(huì)調(diào)用永久內(nèi)存區(qū)域中的最新的值0,然后經(jīng)過(guò)累加1之后,將最新值1存儲(chǔ)到永久內(nèi)存區(qū)域中;第5行代碼,調(diào)用永久內(nèi)存區(qū)域中的最新值1,然后輸出;第6行代碼執(zhí)行語(yǔ)句“var_numeric=var_numeric+1;”,等式右邊會(huì)調(diào)用永久內(nèi)存區(qū)域的最新的值1,然后經(jīng)過(guò)累加之后,將最新的值2存儲(chǔ)到永久內(nèi)存區(qū)域中;第7行代碼,調(diào)用永久內(nèi)存區(qū)域中的最新的值2,然后輸出。

l  第2次計(jì)算和第3次計(jì)算不再敘述,可以參考第1次計(jì)算的分析過(guò)程。第4次計(jì)算時(shí),第3行代碼會(huì)調(diào)用永久內(nèi)存區(qū)域中的最新的值6,然后輸出6;第4行代碼執(zhí)行語(yǔ)句“var_numeric=var_numeric+1;”,等式右邊調(diào)用永久內(nèi)存區(qū)域中的最新的值6,然后累加1之后將最新值7存儲(chǔ)到永久內(nèi)存區(qū)域中;第5行代碼會(huì)調(diào)用永久內(nèi)存區(qū)域中的最新的值7,然后輸出7;第6行代碼執(zhí)行語(yǔ)句“var_numeric=var_numeric+1;”,等式右邊調(diào)用永久內(nèi)存區(qū)域中的最新的值7,然后累加1之后將最新的計(jì)算結(jié)果8存儲(chǔ)到永久內(nèi)存區(qū)域中去;第7行代碼調(diào)用永久內(nèi)存區(qū)域中的最新的值8,然后輸出。此時(shí)當(dāng)根bar的狀態(tài)是收盤狀態(tài),但是信號(hào)并不會(huì)將永久內(nèi)存區(qū)域中的最新的值綁定到當(dāng)根bar上,也就是說(shuō)數(shù)值類型變量只會(huì)有一個(gè)存儲(chǔ)區(qū)域用于存儲(chǔ)最新的值,基于此,var_numeric[1]、var_numeric[2]、var_numeric[N]始終取的是永久內(nèi)存區(qū)域中的最新的值,即始終等于var_numeric的值。

l  第5次計(jì)算和第6次計(jì)算不再過(guò)多敘述,請(qǐng)參考上面的分析過(guò)程。

【備注1】數(shù)值類型與bar無(wú)關(guān),因此每次數(shù)值計(jì)算都是按照+1的計(jì)算方式,因?yàn)闆](méi)有回溯,所以回溯值返回的每次都相等。

【備注2】

  從這兩個(gè)例子當(dāng)中可以看出,數(shù)值類型與時(shí)序類型最重要的兩個(gè)不同點(diǎn):

  不同點(diǎn)1:數(shù)值類型與bar無(wú)關(guān),每次bar更新時(shí),數(shù)值類型的運(yùn)算不受影響

  不同點(diǎn)2:時(shí)序類型在bar更新時(shí),其時(shí)序類型的數(shù)值發(fā)生變化,而在bar內(nèi)(也就是bar未更新時(shí)),其時(shí)序數(shù)值不發(fā)生變化

  不同點(diǎn)3:數(shù)值類型無(wú)法回溯,回溯也無(wú)效值值相等;時(shí)序類型可以回溯,是按照bar更新時(shí)進(jìn)行回溯,bar內(nèi)值相等(記住時(shí)序數(shù)值與bar有關(guān),而對(duì)bar內(nèi)無(wú)關(guān),它是一個(gè)bar一個(gè)bar的綁定,而不是每個(gè)tick進(jìn)行綁定)

4. 復(fù)合類型

  上面我們敘述了時(shí)序類型變量和數(shù)值類型變量?jī)煞N類型,但是這里需要提一下,MC有一種復(fù)合類型的變量,兼具了時(shí)序類型變量和數(shù)值類型變量的特性,這點(diǎn)會(huì)在下面的內(nèi)容中詳細(xì)闡述,那么它是如何進(jìn)行聲明的呢?因?yàn)榍懊嬲f(shuō)過(guò),所有的變量默認(rèn)都是時(shí)序類型變量,其它類型的變量,如數(shù)值類型變量和復(fù)合類型變量都需要在變量聲明的時(shí)候特殊處理一下。復(fù)合類型變量聲明的代碼如下:

variable: intrabarpersist var_intra(0);

  {也就是在變量聲明時(shí),在變量的前面加上關(guān)鍵字intrabarpersist,也許大家之前都認(rèn)為,這個(gè)關(guān)鍵字只能用于bar內(nèi)模式,但是其實(shí)不是,這個(gè)關(guān)鍵字的用法就是聲明該變量是復(fù)合類型的變量,不開(kāi)啟bar內(nèi)模式也是可以用的}

  我們知道,當(dāng)信號(hào)插入到圖表上時(shí),信號(hào)會(huì)從相對(duì)編號(hào)為1的bar上開(kāi)始執(zhí)行計(jì)算,然后基于相對(duì)編號(hào)為2的bar執(zhí)行計(jì)算,以此類型一直向圖表的右邊的bar執(zhí)行計(jì)算,這叫重新計(jì)算,所謂的重新計(jì)算就信號(hào)會(huì)從相對(duì)編號(hào)為1的bar上開(kāi)始執(zhí)行計(jì)算,然后一直向圖表的右邊的bar執(zhí)行計(jì)算;而引發(fā)信號(hào)的重新計(jì)算的方式有很多,如對(duì)圖表重新回補(bǔ)、重新插入信號(hào)到圖表上、開(kāi)啟自動(dòng)交易、重新編譯、右鍵圖表上選擇“重新計(jì)算所有策略”、信號(hào)的狀態(tài)由“關(guān)閉”轉(zhuǎn)換為“開(kāi)啟”,這些都會(huì)引發(fā)信號(hào)基于圖表的bar的重新計(jì)算。信號(hào)每次對(duì)圖表進(jìn)行重新計(jì)算時(shí),初始時(shí)都會(huì)為復(fù)合類型變量在內(nèi)存中分配一塊內(nèi)存區(qū)域,這塊內(nèi)存區(qū)域不是永久內(nèi)存區(qū)域,也不是臨時(shí)內(nèi)存區(qū)域,它的生命周期只限于“重新計(jì)算”,也就是每次“重新計(jì)算”時(shí),該內(nèi)存區(qū)域都會(huì)重新分配,之前的內(nèi)存區(qū)域中存儲(chǔ)的值不會(huì)保留到最新的內(nèi)存區(qū)域中,這就是復(fù)合類型變量在內(nèi)存區(qū)域上與時(shí)序類型變量、數(shù)值類型變量不一樣的地方;除了內(nèi)存區(qū)域的不同,另一個(gè)地方就是,信號(hào)會(huì)在bar的收盤狀態(tài)時(shí)將內(nèi)存區(qū)域中的最新的值綁定到當(dāng)根bar上,以便后續(xù)的回溯調(diào)用。

  通過(guò)上面對(duì)于時(shí)序類型變量及數(shù)值類型變量的敘述,復(fù)合類型變量的理解就變得簡(jiǎn)的多,所以這部分只是簡(jiǎn)單的案例解釋,為方便對(duì)比,這里仍然以bar內(nèi)模式為例。

復(fù)制代碼
//信號(hào)代碼
[IntrabarOrderGeneration=true]
variable: intrabarpersist var_intra(0);
print('currentbar=',currentbar,', 3 ',',var_intra=',var_intra,',var_intra[1]=',var_intra[1]);
var_intra=var_intra+1;
print('currentbar=',currentbar,', 5 ',',var_intra=',var_intra);
var_intra=var_intra+1;
print('currentbar=',currentbar,', 7 ',',var_intra=',var_intra, ',barstatus=',barstatus);
復(fù)制代碼

//部分輸出

復(fù)制代碼
currentbar=   1.00, 3 ,var_intra=   0.00,var_intra[1]=   0.00
currentbar=   1.00, 5 ,var_intra=   1.00
currentbar=   1.00, 7 ,var_intra=   2.00,barstatus=   0.00

currentbar=   1.00, 3 ,var_intra=   2.00,var_intra[1]=   0.00 currentbar=   1.00, 5 ,var_intra=   3.00 currentbar=   1.00, 7 ,var_intra=   4.00,barstatus=   1.00

currentbar=   1.00, 3 ,var_intra=   4.00,var_intra[1]=   0.00 currentbar=   1.00, 5 ,var_intra=   5.00 currentbar=   1.00, 7 ,var_intra=   6.00,barstatus=   1.00

currentbar=   1.00, 3 ,var_intra=   6.00,var_intra[1]=   0.00 currentbar=   1.00, 5 ,var_intra=   7.00 currentbar=   1.00, 7 ,var_intra=   8.00,barstatus=   2.00

currentbar=   2.00, 3 ,var_intra=   8.00,var_intra[1]=   8.00 currentbar=   2.00, 5 ,var_intra=   9.00 currentbar=   2.00, 7 ,var_intra=  10.00,barstatus=   0.00

currentbar=   2.00, 3 ,var_intra=  10.00,var_intra[1]=   8.00 currentbar=   2.00, 5 ,var_intra=  11.00 currentbar=   2.00, 7 ,var_intra=  12.00,barstatus=   1.00
復(fù)制代碼

  每次重新計(jì)算時(shí),信號(hào)會(huì)為復(fù)合類型變量var_intra分別一塊內(nèi)存區(qū)域,該內(nèi)存區(qū)域中會(huì)存儲(chǔ)變量的初始值作為最新的值(即變量聲明時(shí),變量括號(hào)中的值,此時(shí)是0)。

l  第1次計(jì)算時(shí),第3行代碼會(huì)調(diào)用復(fù)合類型變量的最新的值,會(huì)取內(nèi)存區(qū)域中的最新的值0,然后輸出;第4行代碼,調(diào)用內(nèi)存區(qū)域中的最新的值0,然后累加1之后再存儲(chǔ)到內(nèi)存區(qū)域中;第5行代碼,調(diào)用內(nèi)存區(qū)域中的最新的值1,然后輸出;第6行,累累1之后,將2存儲(chǔ)到內(nèi)存區(qū)域中;第7行代碼,會(huì)調(diào)用內(nèi)存區(qū)域中最新的值2,然后輸出2;信號(hào)執(zhí)行計(jì)算結(jié)束,由于當(dāng)根bar的狀態(tài)是開(kāi)盤bar(即barstatus=0),而非收盤狀態(tài),所以信號(hào)不對(duì)復(fù)合類型變量執(zhí)行綁定操作,也就是不將內(nèi)存區(qū)域中最新的值2綁定到當(dāng)根bar上。

l  第2次計(jì)算和第3次計(jì)算,請(qǐng)參考上面的分析過(guò)程。

l  第4次計(jì)算時(shí),第7行代碼,調(diào)用內(nèi)存區(qū)域中最新的值8,然后輸出8;信號(hào)執(zhí)行計(jì)算結(jié)束,此時(shí)當(dāng)根bar的狀態(tài)是收盤狀態(tài)(即barstatus=2),所以信號(hào)將內(nèi)存區(qū)域中最新的值8綁定到當(dāng)根bar上,以此后續(xù)可以回溯調(diào)用這根bar上的變量值。

第6次計(jì)算時(shí),第3行代碼,調(diào)用了復(fù)合類型變量var_intra的值和var_intra[1]的值,而var_intra會(huì)取內(nèi)存區(qū)域中最新的值,而var_intra[1]會(huì)取前一根bar上綁定的值,即8

【總結(jié)】:復(fù)合類型是兼有數(shù)值類型和時(shí)序類型的特性。

  在bar內(nèi)狀態(tài)下:

  數(shù)據(jù)類型      bar內(nèi)回溯          bar內(nèi)計(jì)算            關(guān)鍵字

  時(shí)序類型      barStatus=2時(shí)更新      生命周期限于1tick變動(dòng)      無(wú)(默認(rèn))

  數(shù)值類型      無(wú)                  生命周期限于關(guān)閉圖表        recalcpersist

  復(fù)合類型      可以回溯前bar上綁定的值   生命周期限于關(guān)閉圖表        intrabarpersist

  在bar內(nèi)條件下一般采用的是復(fù)合類型:

    比如我們bar進(jìn)行計(jì)數(shù)操作var = var + 1;每次計(jì)算var進(jìn)行累加操作。此時(shí)var就是累加的值

    比如我們?nèi)ar[1],表示回溯前一個(gè)bar上綁定的值。

    var就是操作值,加括號(hào)var[1]表示回溯前值。

=================================================

之前的文章感謝大家的轉(zhuǎn)載,希望轉(zhuǎn)載時(shí)請(qǐng)注明出處,本人轉(zhuǎn)自其它網(wǎng)站的圖表一并感謝,謝謝~!

https://www.cnblogs.com/noah0532/

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多