关闭@1x
香港:2025-03-27 00:25:23
  • 紐約:2025-03-26 11:25:23
  • 倫敦:2025-03-26 16:25:23
  • 東京:2025-03-27 01:25:23
  • 悉尼:2025-03-27 02:25:23
  • 香港:2025-03-27 00:25:23
  • 新加坡:2025-03-27 00:25:23
首頁> 資訊> 最新 >正文

【0基礎學mql4EA編程2-3】數據結構 - 數組應用實例

William 2024-05-16 16:50:13 關注
從概念到實踐,全方位了解一維、二維數組在MQL4編程中的應用

文章來源:123财經導航

作者:William

數組的概念



數組是一種數據結構,用于存儲相同類型的多個元素。它是一種有序的集合,每個元素可以通過索引訪問。
以下是一些關于數組的重要概念:

  • 元素:數組由一系列元素組成。每個元素都有一個特定的位置,可以通過索引來唯一标識。元素可以是任何數據類型,如整數、實數、布爾值、字符串等。
  • 索引:數組中的每個元素都有一個索引(坐标),用于唯一标識該元素。索引通常從0開始,逐個遞增。通過索引,可以訪問和修改數組中的特定元素。
  • 大小:數組的大小是指數組中元素的數量。它決定了數組的容量和可用的索引範圍。大小可以在創建數組時指定,也可以在使用中通過數組操作函數指定。
  • 初始化:初始化是指在創建數組時爲數組的元素賦予初始值。可以在聲明數組時進行初始化,也可以在後續的代碼中賦值給數組的元素。
  • 訪問元素:通過使用數組的名稱和索引,可以訪問和操作數組中的元素。通過将索引放在方括号内,可以獲取或修改特定位置的元素。
  • 遍曆:遍曆是指訪問數組中的每個元素。可以使用循環結構(如for循環或while循環)來遍曆整個數組,以便處理每個元素。
  • 多維數組:多維數組是指具有兩個或多個維度的數組。它們可以用于表示表格、矩陣和更複雜的數據結構。多維數組可以通過多個索引來訪問和操作。

    數組是編程中常用的數據結構之一,它提供了一種有效的方式來組織和處理大量的相似數據。了解這些數組的概念和特性可以幫助您更好地理解和使用數組在編程中的重要性。

數組的分類與作用


在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循環)

  • for 循環:通過循環遍曆數組中的每個元素。
  • int i = 0:初始化循環變量 i,将其設置爲數組的起始索引。
  • i < ArraySize(symbol):循環條件,當 i 小于 symbol 數組的大小時,繼續執行循環體。
  • i++:每次循環結束後,遞增 i 的值。
  • 在循環體内部,執行以下操作:
    symbol[i]:訪問數組 symbol 中的第 i 個元素。
    StringSubstr(Symbol(), 6, 6):使用 StringSubstr 函數從當前貨币對的名稱中提取子字符串。第一個參數 Symbol() 返回當前貨币對的名稱,第二個參數 6 表示子字符串的起始位置,第三個參數 6 表示子字符串的長度。
    symbol[i] + StringSubstr(Symbol(), 6, 6):将數組 symbol 中的第 i 個元素與提取的後綴名進行拼接。
    symbol[i] = symbol[i] + StringSubstr(Symbol(), 6, 6):将拼接後的結果賦值給數組 symbol 中的第 i 個元素。

3、實踐
##一維數組:這次我們同樣使用OnTimer()來演示。

  • 第1步:清空并刷新 modeBid 數組,确保每次調用函數時都是最新的數據。
  • 第2步:調整 modeBid 數組的大小爲 symbol 數組的大小,以确保兩者的元素個數一緻。
  • 第3步:使用 for 循環遍曆 modeBid 數組,通過 symbol 數組中對應索引的貨币名稱獲取相應的買入價格,并将其存儲到 modeBid 數組中。
  • 第4步:将獲取到的數組元素輸出到圖表上,這裏我們也是使用同樣的循環遍曆手法,通過一系列圖形函數創建和設置元素的顯示屬性,以顯示貨币名稱和對應的買入價格。
  • 第5步:使用 Comment 函數在終端窗口中顯示單獨訪問數組元素的結果,這裏我設置顯示第三個元素的貨币名稱和對應的買入價格。
  • 輸出結果:

##二維數組:二維數組中的内容我們直接在當前函數中進行,添加以下代碼。

  • 第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中極少用到,了解概念即可

【免責聲明】123财經導航所發布的信息内容僅供交易投資者參考,并不構成投資建議“據此操作,風險自擔”。網站上部分信息内容及圖片來自于網絡/注冊作者/投稿人,版權歸原作者所有,如有侵權,請您與我們聯系關閉,郵箱:938123@qq.com。
hhhhhhh
热门评论
最新评论
还没有评论快来抢沙发吧!
第三方賬号登錄
第三方賬号登錄
第三方賬号登錄
  • *站點:
  • *網址:
  • 類型:
  • 聯系方式:
  • 簡介:

  • RRH123歡迎您的加入!如有問題請添加咨詢管理員【微信号:938123】
  • *類型:
  • *問題:
  • 圖片說明:
  • 聯系方式:

  • RRH123感謝您的反饋!如有問題請添加咨詢管理員【微信号:938123】