MetaTradeer 腳本轉換為NetTradeX Advisors | IFCM
IFC Markets - 外匯交易

MetaTradeer 腳本轉換為NetTradeX Advisors

引言

當前Meta Trader 4交易平臺擁有數量巨大的智慧交易腳本。 交易者希望將這些腳本應用於NetTradeX平臺,此前需要全部重新編寫腳本,非常耗時。 為了這一工作,我們創建了MQL4 和 NTL+相容的語言庫。 語言庫大大簡化了轉化NTL+語言的過程。 由於MetaTrader 和 NetTradex平臺的不同 (對應MQL4 和 NTL+語言),您需要在腳本中完成一些修改。 大部分的工作就是將MQL4語言庫提供給NetTradeX Advisors,但是程式師仍舊需要修改腳本來保證運行。 本文將介紹如何使用這一語言庫的功能和需要做的修改。

MQL4.ntl語言庫工作的基本原則

在進行實質性的工作前,您需要在MQL4語言中調試腳本。轉換為NTL+腳本需要哪些步驟?

第一步 – 開始,您需要在NetTradeX Advisors平臺的Navigator視窗中,在Scripts下建立新的腳本檔。該檔根據用途位於Advisors 或 Utilities文件夾中。 之後將整個MQL4的腳本複製到檔中。

第二步 - 連接MQL4語言庫。 對此需要在檔的開始添加 #include "Libraries\MQL4.ntl" 一行。 需要指出的是,MQL4語言庫的功能不需要執行檔,需要進行編輯。語言庫不是自動運行並完成輔助的工作。

第三步 – 嘗試編輯生成的腳本。對此在代碼編輯器中點擊按鈕Compile 或者點擊鍵盤的F7。編輯器會列出錯誤和警告項,我們需要一步一步的更正。 當前我們關心兩個部分:編輯器是否發現了語言庫,以及腳本中是否具有全部的特殊函數。

如果編輯器沒有發現語言庫檔,會出現"Failed to open script file"的資訊。這樣的情況下,需要確定MQL4.ntl檔中指令 #include的路徑和名字是否正確。

在MQL4語言中,3個預命令函數init(), start(), deinit()是特殊函數。 在NetTradeX Advisors平臺中需要定義這3個函數。 但是在幾個腳本中可能沒有init() 和 deinit()函數其中的1個或2個。 這種情況下編輯器會告知您"No matching signatures to 'init()'" 或者 "No matching signatures to 'deinit()'"。這是您需要添加函數init() 和 deinit(),返回單一的符號0;

int init()
{
	return 0;
}
int deinit()
{
	return 0;
}

如果沒有下面的資訊出現:"Failed to open script file" 和 "No matching signatures to 'init()'" / "No matching signatures to 'deinit()'",那麼可以認為第一步已經完成。當前可以進入解決本地問題。

最常見的是編輯器錯誤資訊,原因和消除錯誤方法

該部分介紹了在自動運行腳本時最常見的編輯器錯誤資訊,並且給出了具體的解決辦法。

No matching signatures to Print

這個錯誤是因為在NTL+語言中無法使用帶有參數的函數。 這種情況下需要修改函數,使得參數的數量與Print()函數確定的數相一致。函數Print()只能有一個參數輸出。 因此使用 Print(參數1 +參數2+參數3)來代替 Print(參數1, 參數2, 參數3)

Unexpected token '(unrecognized token)'

該錯誤出現的原因之一:通過MQL4語言庫的命令#include來嘗試連接。NTL+語言無法使用該語言庫,因此無法使用這些檔命令,需要將該命令行從程式中刪除。

'True'/'False' is not declared

NTL+語言中本地參數的開頭是小寫字母,因此將Ture替換為ture,False改為false。

No conversion from '_bars&' to 'int' available

MQL4語言中,變數Bars是確定當前圖表條的數量。 在NTL+語言中存在同名的Bars,因此在MQL4.ntl語言庫添加變數bars(帶有小寫字母b),使得返回的值是當前圖表中條的數量,就是說來代替Bars。

Must return a value

該錯誤是調用《return》時無返回值。 因此使用該操作符的函數,應聲明,區別於 void 的返回值。因此當出現該錯誤時需要要麼調整函數,或者給出return的值。

使用幻數(Magic number)

當前版本的NTL+語言不支援幻數的使用。 對於所有的已開立頭寸,幻數的返回值為零。在MQL4語言腳本中,建議關注特別是條件語句的幻數。 如果您不需要確定交易助手建立的頭寸,往往只需要刪除或者注釋掉函數OrderMagicNumber()。

使用靜態變數

在NTL+語言中不使用關鍵字«static»。如果需要保持函數之間的變數值,使用總體變數(無關鍵字static),並放置在函數外。如果在運行交易助手時打算修改參數,如果願意,可以添加extern

手數的定義

在當前版本中,每個工具的手的數量為100 000單位。因此,如果您使用的工具手數不是100000,而是其他的數量,需要單獨的修改相應的參數。

DLL檔的不同

在NetTradeX Advisors 和MetaTrader4平臺中,DLL檔的運行是不同的。在MQL4語言中需要在DLL模組中完整的描述函數,而在NTL+語言中則不需要。 取消指定。

#import "檔_或_模組_名字"
函數描述 function1;
    函數描述 function2;
    函數描述 functionN;
#import

只需要簡單的創建物件dll 任意標示符 ("檔_或_模組_名字");並且通過
標示符.Call("函數_名字", 函數的參數用逗號分開);

標示符.CallProc("函數_名字", 函數的參數用逗號分開);來調用您需要的函數。

檢查保留字

在MQL4和NTL+語言中,存在不同的保留字。 MQL4語言中可以使用的變數名或函數,在NTL+語言中沒有或是相反。例如,編輯器調用資訊Expected'(' 不使用括弧。 重要的原因之一是因為在程式碼中變數名與保留字名重複。因此在這樣的情況下,需要修改變數為其他名字。編輯中快速調用視窗Replace請按組合鍵Ctrl+H。

Float value truncated in implicit convertion to integer

該警告是在試圖給int分配float或是double類型的值時出現的。 對於運行腳本來說,修正錯誤不是必須,但是最好修改過來。 從double到int ,從float到int的轉換需要是明確的。 例如變數d類型是double,形式如下 int(d)。

不存在bool和int的相互自動轉換

在NTL+語言中,int i; bool b = true; i=b;類型無法自動轉換。並且會給出Can't implicitly convert from 'bool' to 'int'的錯誤資訊。 因此,當您需要轉換時,需要用到下列的幫助:

int Run()
{
	// convertion from bool to int;
	bool a=false;
	int b = a?1:0;
	
	// convertion from int to bool
	int c=1;
	bool d = c==0?false:true;
}
Can't implicitly convert from 'datetime' to 'int'

在NTL+語言中對datetime需要明確轉換為int。 按照下面的樣式 int i; datetime d; i=int(d);

顏色常量

在MQL4可以使用眾多的常量,來針對圖表的顏色物件。 這些常量在代碼中會代表16個基本顏色,例如White或Black。 唯一例外的是 – 在圖表顯示中使用這些顏色。 如果使用顏色,NTL+中沒有,那麼需要通過RGB來確定顏色,例如,對於顏色Tomato定義如下:color Tomato = 0xFF6347

陣列的使用

在MQL4和NTL+語言有不同的陣列。 在NTL+語言中,類型名稱[]的樣式僅針對陣列。 所有的陣列保存為array 類型 名稱; array 類型 名稱(大小) 。因此需要使用array "string" symb= {"EURUSD", "GBPUSD", "AUDCAD"}; 來代替string symb[3] = {"EURUSD", "GBPUSD", "AUDCAD"};。

不支援的函數

在NTL+語言中不支援幾種函數。這幾種函數需要刪除或者修改代碼的邏輯。在使用這些函數時,會輸出這樣的錯誤'The function is not supported' 或 'No matching signatures to function_name'。

不支援函數列表:

  • SendMail()
  • 函數組onArray
  • 函數FileOpenHistory, FileIsLineEnding
  • 函數組objects和物件性質
  • 針對MarketInfo函數下列狀態返回零值:
    • MODE_SWAPLONG
    • MODE_SWAPSHORT
    • MODE_STARTING
    • MODE_EXPIRATION
    • MODE_MINLOT
    • MODE_LOTSTEP
    • MODE_SWAPTYPE
    • MODE_PROFITCALCMODE
    • MODE_MARGINCALCMODE
    • MODE_MARGININIT
    • MODE_MARGINHEDGED
    • MODE_FREEZELEVEL
  • 操作符 goto
  • 自定義指標iCustom的計算函數
  • (Window functions), MessageBox 視窗的函數組
  • TerminalCompany(), TerminalName(), TerminalPath()
  • 參數#property

概述

在本文中,我們講述了MetaTrader平臺代碼轉換為NetTradeX代碼中遇到的困難。 這一過程大大簡化了MQL4.ntl語言庫。 語言庫的優勢 — 完整的開發代碼, 客戶可以自己複製和編輯。 我們也會不停往語言庫添加新的函數,並且修改現有函數,以便是的轉換更加方便快捷。

Close support
Call to Skype Call to QQ Call Back