MultiCharts | PowerLanguage語法教學 | CH7:陣列(Array)

陣列(Array)

陣列可以想像成是一個容器,容器內儲存多個相同型別的值,每一個值稱作元素(element),從第一個元素到最後一個元素會依序給予一個索引值(index),索引值從零開始遞增,第一個元素的索引值是0、第二個元素的索引值是1、第三個元素的索引值是2、…、第N個元素的索引值是N-1。

索引012N-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從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_SetMaxIndexAlpha的大小改為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迴圈,依序使用索引值從010存取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迴圈,依序使用索引值從08存取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

發佈留言