关闭@1x
香港:获取中
  • 紐約:2025-04-02 07:20:26
  • 倫敦:2025-04-02 12:20:26
  • 東京:2025-04-02 21:20:26
  • 悉尼:2025-04-02 22:20:26
  • 香港:2025-04-02 20:20:26
  • 新加坡:2025-04-02 20:20:26
首頁> 資訊> 最新 >正文

【0基礎學MQL4 EA編程2-5】自定義函數封裝與調用

William 2024-05-20 18:53:29 關注
學習自定義函數的封裝與調用

文章來源:123财經導航

作者:William

自定義函數


本章節主要是帶大家鞏固一些編程中的概念,以養成良好的編程習慣。
在MQL4中,自定義函數既自己定義的函數體,從返回類型上可以大概分爲帶返回值和不帶返回值;從調用類型上可以分爲帶傳入參數和不帶傳入參數。無返回值類型的函數以void 關鍵字定義,而其他帶返回值的可以是我們常見的int,double,bool,string,datetime這些,返回值也是根據需求來定義特定的數據類型,例如返回訂單數選擇int類型來定義函數,需要返回價格時選擇double類型來定義函數,以此類推,綜合起來可以分爲4類:

  • 無參數、無返回值:這種函數執行一些操作或完成一些任務,但不需要接收任何參數,并且不返回任何結果。例如,一個簡單的打印信息的函數可以屬于這個類别。
  • 有參數、無返回值:這種函數接收一個或多個參數,并執行一些操作或完成一些任務,但不返回任何結果。參數提供了函數執行所需的輸入。例如,一個函數計算兩個數之和并打印結果可以屬于這個類别。
  • 無參數、有返回值:不需要接收任何參數,但執行一些計算或邏輯操作,并返回一個結果。返回值可以是任何數據類型,如整數、浮點數、字符串等。例如,一個函數返回當前的時間戳可以屬于這個類别。
  • 有參數、有返回值:這種函數接收一個或多個參數,并執行一些計算或邏輯操作,并返回一個結果。它同時具備參數的輸入和結果的輸出。例如,一個函數計算兩個數之差并返回結果可以屬于這個類别。

自定義函數的用途和優點

自定義函數并非是一個完整EA編程時所需的必備編寫方式,但合理使用自定義函數,可以讓整個代碼邏輯非常清晰,具體優勢如下:

  • 簡化代碼結構:自定義函數可以将複雜的操作和計算封裝在一個函數中,從而簡化主要代碼的結構。這使得主要代碼更加簡潔、易讀,并且更容易理解和調試。
  • 提高代碼複用性:自定義函數可以在不同的上下文中重複使用。當你開發多個策略或指标時,可以編寫一次自定義函數,然後在不同的策略或指标中多次調用,避免重複編寫相同的代碼。
  • 提升代碼可維護性:通過使用自定義函數,可以将代碼邏輯分解爲多個獨立的函數,每個函數負責一個特定的任務。這種結構化的代碼設計使得代碼更易于閱讀、理解和修改,提高了代碼的可維護性。
  • 代碼重構和優化:自定義函數使得代碼重構和優化更加容易。通過将常用的代碼塊封裝爲函數,可以在需要的時候對函數進行修改、改進和優化,而不必修改所有調用該函數的代碼。

封裝自定義函數

這張圖是上一期課程中的練習内容,分别在OnInit()函數中初始化數組,在OnTimer()函數中執行獲取指定數據的邏輯,這樣的寫法是很多人的編程習慣。但你有沒有想過,一旦代碼超幾千行的時候,你怎麽辦?同一個作用域中存在多個複雜的邏輯代碼塊,在流程控制上是非常混亂的一件事情,稍微不注意就可能造成計算的數據發生錯誤,或者發生邏輯沖突等情況。

爲了解決這種棘手的問題,下列圖中,我把上一期的代碼塊分别封裝到兩個不同的函數中,通過直接在事件函數内調用該函數頭來執行相應的操作,這種方法和之前是等效的。并且一旦發生錯誤,可以對症下藥檢查代碼塊所屬的函數,實現代碼的網格化管理。同理你可以根據不同的功能實現來創建多個函數,在每一步執行哪一個,像管理流水線一樣去管理你的代碼。

以上函數中,都是void類型的函數,通常用于實現主邏輯快的模塊化,至于是否傳入參數,得根據實際情況而定。在實際應用中,還有很多場景可惜再細化,對于我而言,我要做就做到極緻,爲此我們來細化整個代碼的模塊化封裝過程,開始整活。
1、邏輯拆分
通過細化這段代碼,我們得到了五個邏輯區塊,包含3個主要邏輯函數,和兩個功能性封裝函數,每個區塊都有特殊的用處,其中包含的了文中開始所包含的幾種函數類型。

2、定義兩個主要的函數單獨來作爲初始化和獲取數據使用。

3、創建一個DarwObj()函數單獨用于圖形化輸出顯示,在這個函數中,我們先編寫一個用于創建圖形對象所需的循環體,循環次數使用貨币對數組的數量。

4、此時我們在創建圖形對象的過程中,當然少不了獨立的圖形對象函數,爲了這個圖形對象函數可以一次創建後一勞永逸的多次使用,我們也單獨進行封裝。函數體中我們預留了5個數據位置,用來傳入對應的數據參與計算,分别是:對象名稱,要顯示的内容,橫坐标、縱坐标,顯示顔色,函數類型沒有任何返回值(詳細的方式我們後面章節再細說)

5、再次回到剛剛的DarwObj()函數,在循環體内調用剛剛的圖形函數創建對象。這裏調用了3次,是因爲我們要顯示的内容分爲3組分别是:貨币名稱,ASK價,BID價格,其中每一組都包含了每個貨币的對應屬性,所以必須借助循環的方式來創建對象。

6、顯示判斷:在上面調用的圖形對象行數中,5個參數分别對應的功能如下圖,其中,我們又嵌套了一次調用函數setclr(symbol[i]),用于根據特殊需求顯示顔色。

因此我們創建了一個用于返回顯示顔色的函數,該函數包含一個字符串的參數傳入。
功能解析:傳入循環時的貨币名稱,如果貨币名稱是EURUSD,返回紅色作爲顯示顔色,否則(如果不是EURUSD)則返回綠色作爲顯示顔色。

到這裏我們的代碼全部重構完成如下所示,

在三個主要函數中,我們分别放入了對應的事件函數内,爲啥其餘兩個不放入?因爲其他兩個屬于功能性函數,隻在需要的時候調用它,在本段代碼中,剩餘了兩個函數隻有DarwObj()需要,所以這裏不放。解讀:初始化時調用一次ArrayInit()函數用于初始化數組,然後在OnTimer()函數中根據計時器間隔更新獲取數據,緊接着調用DarwObj()函數創建對象。

看效果:(顔色判斷已經根據函數判斷中的EURUSD做了區分顯示)

參數傳遞與返回概念

熟悉了剛剛的流程,我們在繼續鞏固一下參數傳遞與返回參數的概念,所謂的傳遞參數就是在調用函數的時候把函數調用後計算的過程需要的數值傳遞給函數體本身;返回則是函數把計算好的數值再返回給調用它的語句。
下圖中,函數2在内部變量add1調用了函數1,并按照約定格式傳入了兩個整型值作爲函數2中加法運算所需的值,然後通過運算後返回運算結果給函數2中的變量add1。

函數調用順序


函數創建的順序可以随意,但調用順序必須講究先來後到。這裏不要去糾結先有雞還是先有蛋的問題,你隻需要知道,你調用一樣東西得先确定存在的事實,比如你要調用計算好的訂單利潤,那你就得先計算出列潤數據,才到調用的環節,講究先來後到,或者是先檢查一遍是否存在再調用;再比如你要實現孵小雞的過程,就先得把雞蛋獲取到,這是一個在使用自定義函數時必須牢記的事情。

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

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

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