[外匯][程式交易]MQL4的新功能 (What's New in MQL4)
有在撰寫MT4交易程式的朋友請注意:在2014/2/3日,MetaQuotes公司針對新版的MetaEditor 在 MT4 V4.0 Build 600後做了重要的修改。
(更精準的說,應該是Build 555之後就做了修改)。
新版的MQL4編程語言還不完全是MQL5編程語言,但已相當接近。
編譯後的程式附檔名仍為EX4,不是EX5;
最重要的是:新版的MQL4編程語言已可使用OOP的C++語法來開發程式。
以下引用:MQL4的新功能 (What's New in MQL4)
MQL4的新功能
MQL4編程語言已經被徹底修改達到MQL5的水平 - 現在您可以用MQL4 / 5使用統一的MetaEditor開發環境,單一的風格,程序庫和調試工具,開發自動交易。
由於易學性和大量的多年使用MetaTrader 4客戶端生成的代碼,MQL4深受自動化系統開發者的歡迎。然而,該語言也有其主要優點所產生的一些缺點 - 一個簡單的編程語言不允許開發複雜的系統,阻礙了從高級語言調試庫的移植。因此,我們決定在最大可能數量的MQL5語言功能和特點下實施它完全保留 MQL4的功能。換句話說,所有強大的MQL5功能,包括OOP和本機代碼編譯器,也將在MQL4變得可用。
要做到這一點,我們已經開發了統一的編譯器,可以自動支持MQL4和MQL5語言。MetaEditor也將成為MetaTrader 4和MetaTrader 5兩個平台的統一的應用。因此,將有可能從任何版本編譯MQL4和MQL5。MQL5存儲也可用於工作。
MQL4應用保護上升到MQL5水平。新EX4/EX5文件提供了一個嚴格和徹底的修改保護。這意味著安全的EX4應用市場也提供給MetaTrader 4客戶。
此外,MQL4現在採用新圖形對象和新功能進行圖表工作。MQL5標準庫將被移植到MQL4為開發者提供了創造自己的圖形界面和交易庫的新可能性。現在,您可以在MetaTrader 4使用資源創建完全成熟的應用程序。
MQL4語言的變化
- 添加新char, short, long, uchar, ushort, uint, ulong和double(雙精度)數據類型。這將允許從其他類似C + +語言轉移代碼。各種類型的數據以不同的速率進行處理。整型數據是處理的最快的一個。一個特殊的協作處理器被用來處理雙精度數據。然而,由於浮點數據的內部表徵的複雜性,它被處理得比整型慢。類型轉換也被實施。
- 字符串現在以Unicode格式表示,雖然他們之前都是以ANSI格式(單字節的)表示。如果程序使用DLL並傳遞字符串變量給他們則應該被考慮。
- 預定義卷變量現在是ulong類型。用於訪問卷的時間序列也由ulong類型數組組成。建議在舊版MQL4程序中使用數據的顯式轉換將該類型轉至目標類型,以避免類型氾濫的錯誤。
- 允許對象接收自身引用的結構和類,對象指針, void類型和this關鍵字已被添加。支持所有面向對象的編程標準:
- OOP允許使用類來開發程序。這有利於調試和開發大型應用程序,以及通過繼承權提供重複多次使用先前生成的代碼的能力。然而,這並不意味著您不能像以前那樣以面向程序的風格生成您的MQL4代碼。如果您不需要新的功能,您可以如您過去一樣,開發您的程序。
- init(), deinit() 和 start() 的預定義函數一直保持著兼容性,但是,現在使用OnInit(), OnDeinit(), OnStart(), OnCalculate() 和 OnTick()來代替。此外,已經實施新的預定義OnTimer(), OnChartEvent() 和OnTester() 處理函數。在之前的MQL4中,預定義函數可以有任何參數和任何返回類型,並且它們可以通過自己的名字進行調用,而無需簽名。在新版MQL4中,所有預定義函數應嚴格符合他們的簽名。換句話說,他們應該精確地定義設置參數和返回類型。
- 現在,變量名稱不能包含特殊字符和標點,並且新版MQL4語言的關鍵字不能用作名稱。舊版MQL4程序可以使用新的編譯器重新編譯,以便跟隨編譯器信息時可以輕鬆地糾正所有這些錯誤。
- 該優先規則現在符合C語言的標準。如果您不確定,您可以在舊版MQL4應用中插入括號,以清楚地表明優先級別以便增加可靠性。
- 縮減的條件檢查現在用於邏輯運算,與舊版MQL4計算所有的表達式不同,該檢查是後來執行。假設檢查邏輯AND使用的兩個條件
if(condition1 && condition2) { // some block of operations } |
- 如果 condition1 表達式是 false,condition2 表達式的計算不能執行,因為 false && true 的結果等同於false。
- ArrayCopyRates() 也改變了自己的行為。代替虛擬複製到double[][6] 數組,它現在執行虛擬複製到MqlRates[]數組。複製到double[][6]數組仍然保持完整的兼容性,然而,該複製是真實的,不是虛擬的。
- 在文件操作中,同時打開的文件數現在可以達到64,而舊版的MQL4可能只有不到32。直到最近,文件可以始終以FILE_SHARE_READ或FILE_SHARE_WRITE模式打開。現在,所需的開放模式應該明確指定。
- 通過使用函數,局部數組的變量和內存釋放的作用域也有所改變。由於變化的數目足夠巨大,新#property strict屬性已被引進以提供與之前開發MQL4程序的方法的最大兼容性。當使用MQL嚮導創建新MQL4應用程序時,這個屬性會始終添加到模板。下表包含MQL4,無需使用strict的新版MQL4和指定strict編譯模式的新版MQL4之間的差異
#property strict |
編譯器之間的差異表
舊版MQL4編譯器 | 新版MQL4編譯器 | 含有#property strict的新版MQL4 |
---|---|---|
init(), start() 和deinit()接入點可能擁有任何參數和任何返回類型 | init(), start() 和deinit()一直保持完整的兼容性, 而新的OnInit(), OnStart(), OnCalculated, OnTick(), OnTimer(), OnChartEvent(), OnTester() 和OnDeinit()應嚴格符合它們的簽名 |
|
幾乎所有的變量名稱(除了保留字)都是可能的,其中包括特殊字符和標點 | 變量名不能包含特殊字符和標點。 保留字清單已經擴大。因此,如short, long, const等一樣的如此廣泛的字眼不能用作名稱 |
|
變量的作用域是從聲明(即使在嵌套模塊)到函數結束 | 變量的作用域是從聲明到模塊的結尾,其中變量被聲明 | |
通過零值隱式初始化所有變量(包括全局和局部變量) | 只有全局變量進行初始化。局部變量中只有字符串隱式初始化。 | |
退出函數時局部數組不釋放 | 退出函數時局部數組被釋放 | 退出{}模塊時局部數組被釋放 |
「越界數組」不會導致嚴重錯誤* | 同上,除了結構和類的數組,為此,這個錯誤是關鍵的一個 | 「越界數組」是造成程序停止的嚴重錯誤 |
無結構和類 | 結構和類都存在。實施其他數據類型 | |
字符串是單字節。 datetime是32位整數。 預定義卷變量是double類型 |
字符串是unicode字符串。 datetime是64位整數。 預定義卷變量是ulong類型 |
|
ArrayCopyRates() 執行虛擬複製到double[][6] 數組 | ArrayCopyRates() 執行虛擬拷貝到MqlRates[] 數組。複製到double[][6] 數組已經保持完整的兼容性。然而,複製是真實的,不是虛擬的 | |
即使他們有一個類型,該函數也可能無法返回值。為了實現這一點,在函數結束時編譯器自動插入return(0) | 任何類型的函數都應該返回一個值 | |
同時打開的文件數為32 | 同時打開的文件數為64 | |
該文件總是在共享使用模式**打開 | 應該使用FILE_SHARE_READ和/或FILE_SHARE_WRITE明確指定共享使用模式 |
* 請特別注意「越界數組」的錯誤 - 在圖表上啟動時許多舊版的自定義指標將在新編譯器的strict 模式下顯示此錯誤。建議查找原因並排除它。
** 在新版MQL4和MQL5中,FILE_SHARE_READ和FILE_SHARE_WRITE標誌是負責共享使用模式的文件。舊版MQL4中沒有這樣的文件。
相關文章:
-
[外匯][程式交易]新版MT4程式編譯後不能執行?(for MT4 Build 600 or Higher Versions)
-
[外匯][MT4]正解:MT4 的EA到底該放在那個目錄?
-
What's New in MQL4
關鍵字:MT4 Build 600, MQL4, MQL5, MT5, OOP, C++, “Major MQL4 IDE Update in MetaTrader4”
留言列表