close

[外匯][程式交易]MQL4的新功能 (What's New in MQL4)

有在撰寫MT4交易程式的朋友請注意:在2014/2/3日,MetaQuotes公司針對新版的MetaEditor 在 MT4 V4.0 Build 600後做了重要的修改。

(更精準的說,應該是Build 555之後就做了修改)。

新版的MQL4編程語言還不完全是MQL5編程語言,但已相當接近。

編譯後的程式附檔名仍為EX4,不是EX5;

最重要的是:新版的MQL4編程語言已可使用OOPC++語法來開發程式。

以下引用:MQL4的新功能 (What's New in MQL4)

 


MQL4的新功能

MQL4編程語言已經被徹底修改達到MQL5的水平 - 現在您可以用MQL4 / 5使用統一的MetaEditor開發環境,單一的風格,程序庫和調試工具,開發自動交易。

由於易學性和大量的多年使用MetaTrader 4客戶端生成的代碼,MQL4深受自動化系統開發者的歡迎。然而,該語言也有其主要優點所產生的一些缺點 - 一個簡單的編程語言不允許開發複雜的系統,阻礙了從高級語言調試庫的移植。因此,我們決定在最大可能數量的MQL5語言功能和特點下實施它完全保留 MQL4的功能。換句話說,所有強大的MQL5功能,包括OOP和本機代碼編譯器,也將在MQL4變得可用。

要做到這一點,我們已經開發了統一的編譯器,可以自動支持MQL4MQL5語言。MetaEditor也將成為MetaTrader 4MetaTrader 5兩個平台的統一的應用。因此,將有可能從任何版本編譯MQL4MQL5MQL5存儲也可用於工作。

MQL4應用保護上升到MQL5水平。新EX4/EX5文件提供了一個嚴格和徹底的修改保護。這意味著安全的EX4應用市場也提供給MetaTrader 4客戶。

此外,MQL4現在採用新圖形對象和新功能進行圖表工作。MQL5標準庫將被移植到MQL4為開發者提供了創造自己的圖形界面和交易庫的新可能性。現在,您可以在MetaTrader 4使用資源創建完全成熟的應用程序。

MQL4語言的變化

  • 添加新char, short, long, uchar, ushort, uint, ulongdouble(雙精度)數據類型。這將允許從其他類似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 表達式是 falsecondition2 表達式的計算不能執行,因為 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 Build 600, MQL4, MQL5, MT5, OOP, C++, “Major MQL4 IDE Update in MetaTrader4


 


arrow
arrow
    全站熱搜

    freeforever 發表在 痞客邦 留言(3) 人氣()