陣列(Array)
陣列可以想像成是一個容器,容器內儲存多個相同型別的值,每一個值稱作元素(element),從第一個元素到最後一個元素會依序給予一個索引值(index),索引值從零開始遞增,第一個元素的索引值是0、第二個元素的索引值是1、第三個元素的索引值是2、…、第N個元素的索引值是N-1。
索引 | 0 | 1 | 2 | … | N-1 |
陣列 | 1st元素 | 2nd元素 | 3rd元素 | … | Nth元素 |
陣列跟變數一樣也分成宣告和使用兩個階段。
陣列分成靜態陣列和動態陣列(dynamic array),靜態陣列的大小在宣告後無法改變,動態陣列則可以透過函數Array_SetMaxIndex改變大小。
根據宣告的時候是否指定陣列的維度決定是靜態陣列還是動態陣列。如果有指定維度則為靜態陣列,如果沒有指定維度則為動態陣列。
宣告
宣告陣列的名稱、大小和維度,給予所有元素的初始值,同時定義他們的型別,型別可以是數值型別、字串型別或真假值型別。
Array:<IntraBarPersist>ArrayName1[D1,D2,D3,etc.](InitialValue1<,DataN>)
,<IntraBarPersist>ArrayName2[D1,D2,D3,etc.](InitialValue2<,DataN>)
...;
Array
: 表示宣告陣列。IntraBarPersist
-每有一筆交易成交,就重新計算陣列的元素值(update by tick)。如果沒有指定這個參數,預設每一根K棒的結束重新計算元素值(update by bar)。可省略的參數,見IntraBarPersist章節。ArrayName
– 陣列的名稱,名稱可以是字母、底線、底線、數字、句點( . )組成,名稱英文不分大小寫。名稱不可以是數字或句點( . )起頭。D
– 維度,指定靜態陣列的大小和維度,陣列的大小D
從0開始算起,靜態陣列可以是一維或是多維,指定多個維度(D1, D2, D3…)代表多維靜態陣列。
如果沒有指定維度,表示宣告動態陣列,動態陣列的初始大小是一,動態陣列的維度只會是一,使用函數Array_SetMaxIndex重新指定動態陣列的大小。InitialValue
– 全部元素的初始值,元素的初始值決定型別,型別可以是數值(Numerical)、字串(String)和真假值(TrueFalse)。DataN
– 指定陣列綁定的DataN。如果沒有指定這個參數,綁定預設的DataN。可省略參數,DataN 見章節。
保留字array等同於arrays。
使用
使用ArrayName[I1,I2,I3]
指定要使用陣列裡的哪一個元素。
ArrayName[I1,I2,I3]..
ArrayName
– 陣列名稱。I
– 索引值,I1
為一維索引值、I2
為二維索引值、I3
為三維索引值、以此類推。
Example
宣告Factor是大小為9且元素初始值為0的靜態陣列。
使用
迴圈,給予for
Factor
靜態陣列的第(index
+1)個元素的值為index
,第一個元素的值為0,第二個元素的值為1、…、第九個元素的值為8。
Array: Factor[8](0);
var: index(0);
for index=0 to 8 begin
Factor[index]=index;
end;
宣告Level是大小為6×7且元素初始值為0的二維靜態陣列。
使用
迴圈,給予for
Level
靜態陣列的第(d1_index
+1)x(d2_index
+1)個元素的值為
+d1_index
d2_index
,第1×1個元素的值為0,第1×2個元素的值為1、…、第6×7個元素的值為11。
Array:Level[5,6](0);
var: d1_index(0), d2_index(0);
for d1_index=0 to 5 begin
for d2_index=0 to 6 begin
Level[d1_index,d2_index]=d1_index+d2_index;
end;
end;
宣告Alpha是一個動態陣列,初始大小是1,初始值是0。
使用Array_SetMaxIndex將Alpha的大小改為9。
使用
迴圈,給予for
Alpha
動態陣列的第(index
+1)個元素的值為index
,第一個元素的值為0,第二個元素的值為1、…、第九個元素的值為8。
Array: Alpha[](0);
var: index(0);
Array_SetMaxIndex(Alpha,8);
for index=0 to 8 begin
Alpha[index]=index;
end;
常見的錯誤: 陣列界限。索引值錯誤。
陣列常見的錯誤是陣列界限。索引值錯誤: x
,當使用的索引值不存在陣列當中就會產生這個錯誤。x
– 整數,表示發生錯誤的索引值。
Example
宣告Factor是大小為9且元素初始值為0的靜態陣列。
使用
迴圈,依序使用索引值從for
0
到10
存取Factor
陣列。
但是由於Factor
陣列的索引值範圍是(0
~8
),當for
執行到索引值9
時,因為不在索引值範圍內,導致產生陣列界限。索引值錯誤:9
。
Array: Factor[8](0);
var: index(0);
for index=0 to 10 begin
Factor[index]=index;
end;
Example
另一個常導致陣列界限。索引值錯誤是宣告動態陣列後,沒有使用Array_SetMaxIndex設定動態陣列的大小。
宣告Alpha是一個動態陣列,初始大小是1,初始值是0。
使用
迴圈,依序使用索引值從for
0
到8
存取Alpha
陣列。
但是由於沒有使用Array_SetMaxIndex修改
動態陣列的大小,Alpha
動態陣列的索引值只有Alpha
0
,當for
執行到索引值1
時,因為不在索引值範圍內,導致產生陣列界限。索引值錯誤:1
。
Array: Alpha[](0);
var: index(0);
//沒有使用Array_SetMaxIndex設定動態陣列的大小,Alpha動態陣列的索引值只有0
for index=0 to 8 begin
Alpha[index]=index;
end;
Reference
https://www.multicharts.com/trading-software/index.php?title=Array
https://www.multicharts.com/trading-software/index.php?title=Array_SetMaxIndex