第五章:數(shù)組 第一節(jié):認(rèn)識(shí)數(shù)組 數(shù)組指的是具有一定長度的數(shù)據(jù)集合,,在MC中常用的數(shù)組包括一維數(shù)組和二維數(shù)組(太高維度實(shí)用性不大,,邏輯一樣,這里只舉例一維數(shù)組和二維數(shù)組),。所謂一維數(shù)組我們可以理解為一組數(shù)據(jù),,按照順序放置在一定的容器中,所謂二維數(shù)組我們可以理解為一個(gè)二維的表格,,如圖: 因此,,數(shù)組與我們前面認(rèn)識(shí)的bar數(shù)據(jù)最本質(zhì)的不同在于,他是一組數(shù)據(jù)集合,。另外我們還可以理解為,,一個(gè)bar數(shù)據(jù),或者一個(gè)K線的bar上面的值都是確定,、或者說是單一的數(shù)據(jù),。數(shù)組可以在一個(gè)單一的bar上面存儲(chǔ)我們想要的一組數(shù)據(jù),并且方便用于計(jì)算和統(tǒng)計(jì),。 第二節(jié):索引,、維度、元素 2.1 索引 如果我們已經(jīng)定義好了一個(gè)數(shù)組后,,想要查看數(shù)組中某一個(gè)/多個(gè)位置中的數(shù)值,、修改某一個(gè)/多個(gè)位置的數(shù)值,我們必須要采取索引的形式,。所謂索引就是對數(shù)組每一個(gè)位置進(jìn)行編號(hào),,就像班級點(diǎn)名一樣。一維數(shù)組的點(diǎn)名就是從左向右的定義方式,;但是二維數(shù)組的點(diǎn)名,,需要有兩個(gè)索引值進(jìn)行定位,如下圖: 如上圖一維數(shù)組,,如果想找到3個(gè)數(shù)值的位置,,它的編號(hào)就是2,以此類推,,要找到5的這個(gè)數(shù)值,,編號(hào)就是4。 如上圖二維數(shù)組,,如果想找到綠色高亮的5,,我們要從橫向索引找到1,豎向索引找到5,。 2.2 維度 維度是一個(gè)很好理解的概念,,這里略。 2.3 元素 前面都用里面的數(shù)值來說,,在數(shù)組當(dāng)中,,每一個(gè)的值我們統(tǒng)一換一個(gè)名詞,叫做元素,。有多少個(gè)元素就叫多少個(gè)元素的個(gè)數(shù),。在MC中,,元素的類型共有三種基本數(shù)據(jù)類型:數(shù)值型、布爾型,、字符串型,分別也是對應(yīng)前面提到的數(shù)據(jù)類型,,這是一致的,。 第三節(jié):定義靜態(tài)一維數(shù)組和靜態(tài)二維數(shù)組 前面的知識(shí)是解釋數(shù)組,下面是需要我們手動(dòng)創(chuàng)建數(shù)組,。 所謂創(chuàng)建靜態(tài)數(shù)組就是在聲明時(shí),,已經(jīng)規(guī)定好了數(shù)組的“尺寸”或者說“維度”。 # 示例1:創(chuàng)建一個(gè)一維數(shù)組 array:arr[4](0); cleardebug; print(array_getmaxindex(arr)); print(arr[0]); print(arr[1]); print(arr[2]); print(arr[4]); #//返回值: 4.00 # 說明:我們看到生命時(shí)采用的是array:/arrays:這樣的方式來聲明數(shù)組,。其中需要包括方括號(hào)和圓括號(hào)([] ()),,其中方括號(hào)里面需要填寫的就是數(shù)組的最大索引值(也就是允許的最大索引是什么),圓括號(hào)是默認(rèn)數(shù)組每個(gè)元素的初始值是什么,。這樣就創(chuàng)建了一個(gè)靜態(tài)的一維數(shù)組,。其中array_getmaxindex是獲取數(shù)組的最大索引函數(shù),后面會(huì)總結(jié)這些內(nèi)容,。這里特別說明的是:數(shù)組的最大索引是從0開始計(jì)數(shù)的,,而不是從1開始。 # 示例2:當(dāng)然我們還可以創(chuàng)建布爾型的一維數(shù)組和字符串的一維數(shù)組 array:arr[4](False); cleardebug; print(array_getmaxindex(arr)); print(arr[0]); print(arr[1]); print(arr[2]); print(arr[4]);//返回值: 4.00FALSE FALSE FALSE FALSE array:arr[4]('Hello World'); cleardebug; print(array_getmaxindex(arr)); print(arr[0]); print(arr[1]); print(arr[2]); print(arr[4]);//返回值: 4.00Hello World Hello World Hello World Hello World # 示例3:我們再次創(chuàng)建一個(gè)二維數(shù)組 array:arr[1,1](0); cleardebug;//print(array_getmaxindex(arr));print(arr[0,0]); print(arr[0,1]); print(arr[1,0]); print(arr[1,1]); # 說明:與一維數(shù)組不一樣的是,,二維數(shù)組在聲明時(shí)需要用逗號(hào)分隔,,分別定義橫向和豎向的最大索引值,。另外,數(shù)組的查找和聲明數(shù)組最大索引的方式一樣,,也是通過方括號(hào)進(jìn)行訪問和修改。 第四節(jié):修改值和快速賦值 4.1 修改值: 在初始化之后,,想要修改值,也是通過索引的方式進(jìn)行修改,。 # 示例1:修改0,1這個(gè)位置元素的值 array:arr[1,1](0);//cleardebug;//print(array_getmaxindex(arr));print(arr[0,0]); print(arr[0,1]); print(arr[1,0]); print(arr[1,1]); arr[0,1] = 100; print(arr[0,0]); print(arr[0,1]); print(arr[1,0]); print(arr[1,1]);//返回值 0.00 0.00 0.00 0.00 0.00 100.00 0.00 0.00 0.00 4.2 快速賦值 手動(dòng)敲值不太實(shí)際,如果我們像保存最近5個(gè)bar的close價(jià)格,??焖儋x值用的最多的方式就是用循環(huán)。 # 示例1:通過循環(huán)賦值 array:arr[4](0);for value1 = array_getmaxindex(arr) downto 0begin arr[array_getmaxindex(arr)-value1] = Close[value1]; end; print('========');for value2 = 0 to array_getmaxindex(arr) begin print(arr[value2]); end;//返回值:========5296.005278.005253.005274.005274.00 第五節(jié):數(shù)組的全局性 數(shù)組的運(yùn)算也是tick by tick(逐筆)的方式進(jìn)行的,。就是一個(gè)新的tick進(jìn)來時(shí),,數(shù)組會(huì)重新運(yùn)算一次,。說到全局性是MC對于數(shù)值的一個(gè)默認(rèn)設(shè)置。前面提到過完成bar的問題,,如果一個(gè)bar完成了,新的bar來到,,那么在上一個(gè)完成bar計(jì)算的數(shù)組,在新的這個(gè)bar數(shù)值是不是還存在,。比如像TBQuant(交易開拓者Quant版本)中存在全局變量和非全局變量這么一說(當(dāng)然數(shù)組也是一個(gè)變量),,也就是說,新的bar來到,,如果是非全局變量的話,,上一個(gè)bar的數(shù)組值會(huì)全部清空,重新計(jì)算,,也就是在新的bar里面是無法取到上一個(gè)bar已經(jīng)計(jì)算好的數(shù)組值,。因此在TBQuant在聲明數(shù)組時(shí),在前面需要加上global全局聲明的字段,。但是在MC中就不會(huì)存在這么一個(gè)問題,,因?yàn)閿?shù)組在MC中全部都是全局的。為了應(yīng)征這么一個(gè)問題,,我們用once語句,,一次初始化運(yùn)行計(jì)算一個(gè)數(shù)組,然后在動(dòng)態(tài)過程每一個(gè)bar和逐筆的狀態(tài)觀察,,這些數(shù)組中的數(shù)值是否還存在,。 # 示例: array:arr[4](0); once beginfor value1 = array_getmaxindex(arr) downto 0begin arr[array_getmaxindex(arr)-value1] = Close[value1]; end; end; print('========');for value2 = 0 to array_getmaxindex(arr) begin print('time:=',Time,'===',arr[value2]); end;//返回值:========time:=2200.00===5160.00time:=2200.00===5163.00time:=2200.00===5170.00time:=2200.00===5174.00time:=2200.00===5168.00========time:=2300.00===5160.00time:=2300.00===5163.00time:=2300.00===5170.00time:=2300.00===5174.00time:=2300.00===5168.00========time:=1000.00===5160.00time:=1000.00===5163.00time:=1000.00===5170.00time:=1000.00===5174.00......后面略 # 說明:通過這個(gè)實(shí)驗(yàn)表明,在加載圖表時(shí),,用once做一次初始化的操作,,只取需要開始的5個(gè)bar的收盤價(jià)存入數(shù)組,后面再不進(jìn)行修改,,此時(shí)逐筆和后面新的bar都會(huì)取到前面時(shí)刻的數(shù)組值,。也就是手在MC中數(shù)組是全局性的。這一點(diǎn)雖然對于初學(xué)者來說并不重要,,但是這里要特別說明一下,。 第六節(jié):動(dòng)態(tài)數(shù)組 第四節(jié)說到在聲明的時(shí)候指定數(shù)組的長度,也就是在方括號(hào)[]當(dāng)中定義數(shù)組的最大索引值,。其實(shí)也可以根據(jù)實(shí)際的生產(chǎn)需要,,動(dòng)態(tài)定義數(shù)組的大小。此時(shí)就會(huì)用到數(shù)組函數(shù)Array_SetMaxindex,(與Array_GetMaxindex對應(yīng)為獲取最大索引值)后面有兩個(gè)參數(shù),,分別是數(shù)組名稱,,和最大索引值,,但是可惜的是,在MC中,,這個(gè)函數(shù)只能默認(rèn)定義一維數(shù)組,,對于二維數(shù)組的操作無能為力。 如果需要定義動(dòng)態(tài)的數(shù)組,,此時(shí)在方括號(hào)中的最大索引值就無需填寫 # 示例1:定義動(dòng)態(tài)數(shù)組的最大索引值 array:arr[](0); array_setmaxindex(arr,4); print(array_getmaxindex(arr)); # 示例2:動(dòng)態(tài)調(diào)整數(shù)組的最大索引值,,這里設(shè)置兩個(gè)bar的時(shí)間如果不一致,對數(shù)組動(dòng)態(tài)調(diào)整最大索引值 array:arr[](0);var:value1(0); print('=======');if Time<>Time[1] then value1 = value1 + 1; array_setmaxindex(arr,value1); print(array_getmaxindex(arr)); //返回值: ======= .....略 問題:這里有一個(gè)提問,,如果按照示例2所示,,我們動(dòng)態(tài)調(diào)整數(shù)組的話,那其他的值會(huì)不會(huì)改變,?我們做下面這個(gè)實(shí)驗(yàn): # 示例3:對動(dòng)態(tài)數(shù)組進(jìn)行遞減定義最大索引的方式 array:arr[](0);var:value1(5); print('======='); once begin array_setmaxindex(arr,4); arr[0] = 1; arr[1] = 2; arr[2] = 3; arr[3] = 4; arr[4] = 5; end;if Time<>Time[1] then value1 = value1 - 1;if value1 > -1 then array_setmaxindex(arr,value1); print('array length = ',array_getmaxindex(arr));if array_getmaxindex(arr) <> 0 then begin for value2 = 0 to array_getmaxindex(arr) begin print(arr[value2]); end; end;//返回值:array length = 4.00 1.00 2.00 3.00 4.00 5.00=======array length = 3.00 1.00 2.00 3.00 4.00=======array length = 2.00 1.00 2.00 3.00=======array length = 1.00 1.00 2.00=======array length = 0.00 # 說明:我們驚奇的發(fā)現(xiàn),,雖然我們改變了數(shù)組的長度,但是之前的值還是存在的,,因此證明了:數(shù)組是具有全局性,,且數(shù)組當(dāng)中的元素也是具有全局性的!這一點(diǎn)是非常重要的,。 第七節(jié):數(shù)組的函數(shù) 說在前面:前面一直提到了函數(shù)這個(gè)概念,,所謂函數(shù)可以理解為不需要人為的去手工寫代碼,我們可以事先寫好組合起來,,或者M(jìn)C提供給我們的一些寫好的代碼,,我們可以直接使用,而不需要重復(fù)每次再寫的東西,,后面的章節(jié)會(huì)詳細(xì)的講解函數(shù)這個(gè)概念,。 數(shù)組的函數(shù)大多是動(dòng)態(tài)數(shù)組的函數(shù)。前面見過了兩個(gè)分別是Array_SetMaxindex和Array_GetMaxindex,。后面這兩個(gè)就不在舉例了,。 7.1 Array_Compare # 語法: Array_Compare(源數(shù)組,源索引,目標(biāo)數(shù)組,目標(biāo)索引,元素個(gè) 數(shù)) 參數(shù): 源數(shù)組——要比較的第一個(gè)數(shù)組 源索引——數(shù)值表達(dá)式,指定數(shù)組 1 的開始索引值 目標(biāo)數(shù)組——要比較的第二個(gè)數(shù)組 目標(biāo)索引——數(shù)值表達(dá)式,,指定數(shù)組 2 的開始索引值 元素個(gè)數(shù)——數(shù)值表達(dá)式,,要比較的元素個(gè)數(shù) 索引從 0 開始計(jì)數(shù) 返回:0——比較的每組元素完全相同;1——源數(shù)組的元素大于目標(biāo)數(shù)組,;-1——源數(shù)組的元素小于目標(biāo)數(shù)組,。 # 示例: 比較數(shù)組元素 Array1[3]和 Array2[2]的大小,以及 Array1[4] 和 Array2[3]的大?。?Array:Array1[4](0),Array2[6](0);for Value1=0 to 4 begin Array1[Value1]=Value1*2; end;for value2=0 to 6 begin Array2[value2]=value2*3; end; Value3=Array_Compare(Array1,3,Array2,2,2); 由上可知 Array1[3]= Array2[2]且 Array1[4]< Array2[3],,則 Value3=-1若 Array1 為{false, false, false, false, false, false, true, false}, Array2 為{false, false, false, false, false, false, true, false},則 Value3=0若 Array1 為{a,b,c,d,e,f,g,h},,Array2 為{a,b,c,d,e,f,g,h},,則 Value3=1 # 說明: 比較源數(shù)組和目標(biāo)數(shù)組中的指定起始位置及指定數(shù)量的元 素是否相同 源數(shù)組和目標(biāo)數(shù)組可以是相同或不同的一維數(shù)組。 若比較的數(shù)組為數(shù)值數(shù)組,,會(huì)比較每組元素的數(shù)值大小,。 若比較的數(shù)組為字符串?dāng)?shù)組,會(huì)比較每組元素的 ASCII 值的 大小,。 若比較的數(shù)組為布林?jǐn)?shù)組,,會(huì)比較每組元素的布林值是否相 同,若不相同時(shí),,真(true)大于假(false),。 7.2 Array_Copy # 語法: Array_Copy(源數(shù)組,來源索引,目標(biāo)數(shù)組,目標(biāo)索引,元素個(gè)數(shù)) 參數(shù) 源數(shù)組——要復(fù)制的源數(shù)組 源索引——數(shù)值表達(dá)式,指定源數(shù)組的索引值 目標(biāo)數(shù)組——要復(fù)制的目標(biāo)數(shù)組 目標(biāo)索引——數(shù)值表達(dá)式,,指定目標(biāo)數(shù)組的索引值 元素個(gè)數(shù)——數(shù)值表達(dá)式,要比較的元素個(gè)數(shù) # 示例: 復(fù)制 Array1 索引 4 開始的 2 個(gè)元素至 Array2 索引 6 開始的 2個(gè)元素位置: Array_Copy(Array1,4,Array2,6,2); 復(fù)制 Array1 索引 4 開始的 2 個(gè)元素至索引 6 開始的 2 個(gè)元 素位置: Array_Copy(Array1,4,Array1,6,2); # 說明: 復(fù)制源數(shù)組中的指定起始位置及數(shù)量的元素至目標(biāo)數(shù)組指 定的起始位置,。 源數(shù)組和目標(biāo)數(shù)組可以是相同或不同的一維數(shù)組,。 7.3 Array_GetType # 語法: 語法 Array_GetType(數(shù)組名稱) 參數(shù) 數(shù)組名稱——要查詢的數(shù)組名稱 返回值2——布林型數(shù)組3——字符串型數(shù)組7——數(shù)值型數(shù)組 # 示例: 查詢 Array1 的類型,并將結(jié)果存入變量 Value1: Array: Array1[10](false); Value1=Array_GetType(Array1); 則 Value1=2Array: Array1[10](“”); Value1=Array_GetType(Array1) 則 Value1=3Array: Array1[10](0); Value1=Array_ # 說明: 取得數(shù)組的類型,。 7.4 Array_SetValRange # 語法: Array_SetValRange(數(shù)組名稱, 起始索引,結(jié)束索引,數(shù)值) 參數(shù) 數(shù)組名稱——要賦值的數(shù)組名稱 起始索引——數(shù)值表達(dá)式,,指定數(shù)組賦值范圍的開始索引 值 結(jié)束索引——數(shù)值表達(dá)式,指定數(shù)組賦值范圍的結(jié)束索引 值 數(shù)值——數(shù)值表達(dá)式,、字符串表達(dá)式或布林表達(dá)式,,數(shù)組 元素要設(shè)定的值。數(shù)值的類型要和數(shù)組定義類型一致,。 # 示例: 重新賦值 Array1 索引 4 至索引 6 的元素: Array_SetValRange(Array1,4,6,0); 若數(shù)組為{1,2,3,4,5,6,7,8},,則賦值后數(shù)組為{1,2,3,4,0,0,0,8} Array_SetValRange(Array1,4,6,True); 若數(shù)組為{false, false, false, false, false, false, true, false},則 賦值后數(shù)組為{false, false, false, false, true, true, true, false} Array_SetValRange(Array1,4,6,”a”); 若數(shù)組為{a,b,c,d,e,f,g,h},,則賦值后數(shù)組為{a,b,c,d,a,a,a,h} # 說明: 同時(shí)為數(shù)組指定范圍的元素賦值 7.5 Array_Sort # 語法: Array_Sort(數(shù)組名稱, 起始索引, 結(jié)束索引, 排序方式) 參數(shù) 數(shù)組名稱——要排序的數(shù)組名稱 起始索引——數(shù)值表達(dá)式,,指定數(shù)組排序范圍的開始索引值 結(jié)束索引——數(shù)值表達(dá)式,指定數(shù)組排序范圍的結(jié)束索引值 排序方式——布林表達(dá)式,,指定數(shù)組的排序方式,,True 為 遞增,F(xiàn)alse 為遞減 # 示例: 重新排序 Array1 索引 4 至索引 6 的元素: Array_Sort(Array1,4,6,false),; 若數(shù)組為{1,2,3,4,5,6,7,8},,則賦值后數(shù)組為{1,2,3,4,7,6,5,8} 若數(shù)組為{false, false, false, false, false, false, true, false},則 賦值后數(shù)組為{false, false, false, false, true, false, false, false} 若數(shù)組為{a,b,c,d,e,f,g,h},,則賦值后數(shù)組為{a,b,c,d,g,f,e,h} # 說明: 重新排序數(shù)組中的指定范圍數(shù)值,,若數(shù)值數(shù)組依據(jù)數(shù)值大小排序,若為布爾數(shù)組,依據(jù)True=1,,F(xiàn)alse=0的大小排序,,若為字符串?dāng)?shù)組,依據(jù)ASCII碼的值進(jìn)行排序 7.6 Array_Sum # 語法: Array_Sum(數(shù)組名稱,起始索引,結(jié)束索引) 參數(shù) 數(shù)組名稱——要加總的數(shù)組名稱 起始索引——數(shù)值表達(dá)式,,指定數(shù)組加總范圍的開始索引值 結(jié)束索引——數(shù)值表達(dá)式,,指定數(shù)組加總范圍的結(jié)束索引值 # 示例: 加總 Array1 索引 4 至索引 6 的元素,并將結(jié)果存入變數(shù) Value1: Value1=Array_Sum(Array1,4,6); 若數(shù)組為{1,2,3,4,5,6,7,8},,則 Value1=18 # 說明: 返回?cái)?shù)值數(shù)組中之指定范圍額數(shù)值總和 7.7 Fill_Array # 語法: Fill_Array(數(shù)組名稱,數(shù)值) 參數(shù) 數(shù)組名稱——要設(shè)定值的數(shù)組名稱 數(shù)值——數(shù)值表達(dá)式,、字符串表達(dá)式或布林表達(dá)式,要指 派給數(shù)組元素的值,。數(shù)值的類型要和數(shù)組定義類型一致 # 示例: 將 Array1 中的每個(gè)元素設(shè)定為 True: Array: Array1[10](False); Fill_Array(Array1,True); # 說明: 將數(shù)組中的元素設(shè)定指定的值 7.8 Array_indexof # 語法: array_indexof(數(shù)組名,,元素值) # 示例: array:arr[2](0); var: var0(0), var1(0); arr[0] = 1; var0=array_indexof(arr,3); print('var0= ',var0); //返回值:2 # 說明: 返回一維數(shù)組中指定元素的索引值,若元素值不存在于數(shù)組中,,則返回-1 ================================================= 之前的文章感謝大家的轉(zhuǎn)載,,希望轉(zhuǎn)載時(shí)請注明出處,本人轉(zhuǎn)自其它網(wǎng)站的圖表一并感謝,,謝謝~,! https://www.cnblogs.com/noah0532/ |
|