作者:William
數組是一種數據結構,用于存儲相同類型的多個元素。它是一種有序的集合,每個元素可以通過索引訪問。
以下是一些關于數組的重要概念:
在MQL4中,數組可以存儲整數、實數、布爾值和字符串等不同類型的數據。使用中括号[ ]表示。括号内的數值可以表示當前數組的索引值或者容量,其中,數組可以用維度來表示類型的多樣性,包括1維、2維、多維數組,在EA編程中,1維是使用頻率最高的數組。其次是二維,另外在MQL4中,數組的維度最高支持4維,每一種維度的數組在使用上具有不同的方式和難度,應用場景也不同。本期我們主要講解一下1、2維數組。
數組分類
一維數組
一維數組是最簡單的數組形式,它由一系列按順序排列的元素組成。每個元素在數組中都有一個唯一的索引,通過索引可以訪問和操作數組中的元素,也可以稱爲線性數據結構。在數組中,每個位置的排序位置稱之爲“索引”,既每個位置的編号,索引位置從0開始計數(0也算一個單位)。在下列圖示中是一個具有9個元素單位的一維數組,排序從0到8開始,每個位置存放了同類型不同值的數據,組成了一個完整的數據結構(線性數據結構)。
二維數組:
二維數組的使用方式和一維有些類似,元素在數組中都有一個唯一的索引,訪問和操作同樣需要以索引位置來定位。但它是一種具有兩個維度的數組,由行和列組成的表格狀結構,也稱之爲矩陣數據結構。在日常的表格中,我們通常以第幾行第幾列來查找數據,而二維數組中也是同樣的方法。在下列圖示中是一個具有3行9列(x27)元素大小的二維數組,其中每一個位置的配列是按照[行][列]的格式來代表索引位置,組成了一個完整的矩陣數據結構。舉例此時我們要尋找第二行第七列的數據,那索引位置就是[1][6],值是25.1,比如此時我們聲明的是浮點類型的數組,用表達式:double cvalue=[1][6];就可以直接表示該位置的實際數值。
數組形态
下列兩種形态,嚴格意義上來說并不是真正意義上的形态,而是一種以使用習慣劃分的概念,無論是動态還是靜态,在MQL4中都可以使用ArrayResize()函數在爲後續的運行中爲其分配新的大小,在此之前,對默認數組大小調整隻是一種提前初始化的手段。但值得一提的是,養成這種習慣可以更好的對程序的運行效率做管控,也有利于代碼的可讀性與可維護性得到提升
簡單認識一下MQL4中的幾個常用數組操作函數:
1、定義數組
其中ibars爲靜态數組,在定義時我們直接設置成x5的大小,并給每一個元素賦值,這裏我們使用貨币名稱來演示。另外兩個數組爲動态數組,其值爲空。
2、初始化操作/使用前準備
由于初始化并不需要多次操作,這裏我們隻需要OnInit()函數中執行即可,該函數的含義請查閱第一期的教程。
初始化時,我們需要用到ArrayResize()函數,該函數的構造爲3個傳入參數,這裏我們隻使用兩個即可,第一個參數爲需要初始化的數組名稱,第二個爲要設置的大小。但此時我們暫時先設0,随後使用ArrayCopy()函數将已經定義好的ibars數組元素複制到symbol數組中來。
再使用for循環遍曆的方式,更改每一個元素,這裏因爲我們使用的是自定義的貨币名稱,爲了盡可能适配各個平台,我采用了一種特殊手法去做二次賦值,後續我會在“字符串函數”的章節中細說。這裏先順便複習一下for循環的基本概念:
(知識回顧:for循環)
3、實踐
##一維數組:這次我們同樣使用OnTimer()來演示。
##二維數組:二維數組中的内容我們直接在當前函數中進行,添加以下代碼。
第1步:定義一個二維數組double bidAskArray[ ][2] ;用于存儲BID和ASK價格兩種元素,因此第二維大小爲2。[ ][2] 表示數組的第一維大小不指定,将所有元素的初始值設置爲0。
第2步:ArrayResize(bidAskArray, ArraySize(symbol));ArrayResize 函數用于調整數組的大小。這裏将二維數組 bidAskArray 的行數(第一維)設置爲 symbol 數組的大小,以便存儲每個貨币對應的BID和ASK價格。
特别提示:
假如symbol數組的大小是5,由于bidAskArray是二維并且第二維度大小爲2,因此bidAskArray數組的大小總量即爲5*2=10,所以直接使用ArraySize()函數來遍曆是不科學的,因爲我們還需要用到symbol數組(X5),必然會造成數組越界的情況發生(error:array out of range in!)。這裏有多重解決辦法:
除此之外,ArrayRange()函數也能派上用場,直接指定用哪一個維度來遍曆,這裏選擇第一維,用0表示:ArrayRange(bidAskArray,0);
第3步:開始整活
for (int i = 0; i < ArrayRange(bidAskArray,0); i++){
bidAskArray[i][0] = MarketInfo(symbol[i], MODE_BID);
bidAskArray[i][1] = MarketInfo(symbol[i], MODE_ASK);
}
這段代碼使用循環遍曆 symbol 數組,并通過 MarketInfo 函數獲取每個貨币對應的BID和ASK價格,然後将這些價格分别存儲到二維數組 bidAskArray 的第一列和第二列中。
第五步:将獲取到的BID和ASK價格顯示在圖表上。通過循環遍曆 symbol 數組,生成每個貨币對應的唯一标識符 ,構建圖形輸出片段,最終,每個貨币對應的BID和ASK價格會以相應的格式顯示在圖表上,看效果:
當使用數組時,在MQL4中需要注意以下幾個方面:上述代碼片段可加群私信威廉獲取。
一維數組:
索引從0開始:MQL4中的一維數組索引從0開始,即第一個元素的索引爲0,第二個元素的索引爲1,以此類推。在訪問和操作數組元素時,要使用正确的索引值。
數組長度和容量:使用ArrayResize函數可以調整一維數組的長度和容量。在調整數組長度時,要确保在有效範圍内,避免數組越界錯誤。
初始化和賦值:在使用一維數組之前,通常需要對其進行初始化或賦值操作。可以使用循環或直接賦值語句來初始化一維數組。
進階用法:在MQL4中,一維數組是最常用的數組類型。如果需要表示更複雜的數據結構,可以使用一維數組的嵌套來模拟多維數組的效果。
二維數組:
定義和聲明:二維數組是由多個一維數組組成的數組結構。在MQL4中,可以使用類似type array_name[row_size][column_size]的語法來定義和聲明二維數組。
訪問和操作:二維數組的元素可以通過兩個索引進行訪問和操作,第一個索引表示行号,第二個索引表示列号。例如,array_name[row_index][column_index]。
初始化和賦值:可以使用嵌套的循環語句來初始化和賦值二維數組。也可以單獨賦值,最好是通過循環遍曆每個元素,并爲其指定初始值或賦予特定的值。
數組長度和容量:二維數組的長度和容量由行數和列數決定。在定義二維數組時,要确保指定的行數和列數與實際需求相符。
三維數組:
MQL4中極少用到,了解概念即可
删除后无法恢复
删除后无法恢复