Chuyển đổi mã script từ MT4 sang NetTradeX Advisor | IFCM Việt Nam
IFC Markets Online CFD Broker

Chuyển đổi mã script từ MT4 sang NetTradeX Advisor

Mở đầu

Hiện tại trong phần mềm giao dịch MetaTrader 4 người ta đã tạo một lượng lớn các advisor và script. Trước đây, khi các trader muốn dùng những script đó trong NetTradeX, họ phải xử lý lại toàn bộ mã nguồn, điều này tốn rất nhiều thời gian. Để đơn giản hóa công việc đó, thư viện tương thích ngôn ngữ MQL4 và NTL+ được thành lập. Thư viện này cho phép thực hiện quá trình chuyển đổi các script sang ngôn ngữ NTL+ một cách dễ dàng hơn, để sau này có thể khởi động Advisors trong NetTradeX. MetaTrader và NetTradex (cũng như ngôn ngữ MQL4 và NTL+) có nhiều khác biệt, nên nhìn chung bạn sẽ phải thay đổi một số thứ trong các script đã được chuyển đổi. Phần lớn công việc này được thực hiện nhờ thư viện MQL4.ntl có trong NetTradeX Advisors, tuy nhiên, lập trình viên có thể vẫn phải chỉnh sửa lại script khi chạy nó. Bài viết này sẽ cho biết cách dùng những hàm trong thư viện trên và các thay đổi bổ sung cần thiết.

Những nguyên tắc hoạt động cơ bản của thư viện MQL4.ntl

Trước hết, bạn phải có một script hoàn hảo (không dính lỗi) bằng ngôn ngữ MQL4. Vậy, những bước nào cần thực hiện để chuyển code đó sang NTL+?

Bước đầu tiên, bạn phải tạo một file script mới trong cây thư mục Scripts của cửa sổ Navigator trong NetTradex. Bản thân file phải nằm trong thư mục Advisors hoặc Utilities, phụ thuộc vào mục đích của nó. Sau đó ta copy toàn bộ text trong script đó (đang ở ngôn ngữ MQL4).

Bước hai – kết nối thư viện MQL4.ntl. Bạn thêm dòng #include "Libraries\MQL4.ntl" vào đầu file. Phải chú ý rằng, không cần phải biên dịch thư viện MQL4.ntl và làm việc với các hàm từ thư viện này không cần file thực thi. Thư viện này không được dùng để khởi chạy tự động và thực thi các nhiệm vụ hỗ trợ.

Bước ba – thử biên dịch script đã tạo. Trong trình biên tập code bạn nhấn vào nút Compile hoặc nhấn phím F7. Nhiều khả năng là trình biên dịch sẽ đưa ra danh sách lỗi và cảnh báo mà chúng ta phải loại bỏ dần dần. Hiện tại chúng ta chỉ quan tâm 2 vấn đề chính: trình biên dịch có nhận thư viện và tất cả các hàm đặc biệt trong script của chúng ta hay không.

Nếu trình biên dịch không thể nhận file thư viện, sẽ có thông báo “Failed to open script file”. Trong trường hợp này cần chắc chắn rằng file MQL4.ntl thực sự nằm đúng theo đường dẫn được quy định bởi chỉ thị #include nói trên, và tên của nó phải được gọi đúng.

Trong ngôn ngữ MQL4 có các hàm đặc biệt là 3 hàm định danh trước: init(), start(), deinit(). Muốn chạy được chúng trong NetTradeX Advisors thì chúng phải được định nghĩa. Tuy nhiên, trong một số script có thể không có một hoặc cả hai hàm init() và deinit(). Trong trường hợp này trình biên dịch sẽ báo với bạn ‘no matching signatures to ‘init()’” hoặc “No matching signatures to ‘deinit()’”. Lúc đó bạn phải thêm hàm init() và deinit() với toán tử duy nhất return 0;

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

Bước đầu tiên có thể coi là hoàn thành nếu bạn không gặp phải thông báo "Failed to open script file" và "No matching signatures to 'init()'" / "No matching signatures to 'deinit()'". Bây giờ có thể xử lý các lỗi cục bộ của script.

Những thông báo lỗi thường gặp trong khi biên dịch, nguyên nhân và biện pháp khắc phục

Trong phần này bạn sẽ biết những thông báo lỗi thường gặp nhất trong quá trình biên dịch chuyển đổi script, những giải pháp thực tế để loại bỏ những xung đột trong code.

No matching signatures to Print

Lỗi này liên quan tới việc trong ngôn ngữ NTL+ không cho phép sử dụng hàm với số lượng tham số biến đổi. Trong trường hợp này bạn phải thay đổi hàm sao cho số lượng tham số gọi ra tương ứng số lượng trong định nghĩa hàm. Hàm Print() chỉ có 1 tham số đầu vào. Như vậy, thay vì viết Print(tham số 1, tham số 2, tham số 3), cần thực hiện nối chuỗi Print(tham số 1+ tham số 2+ tham số 3).

Unexpected token 'unrecognized token'

Một trong những nguyên nhân xuất hiện lỗi này là cố gắng kết nối các file thư viện ngôn ngữ MQL4 qua chỉ thị #include. Ngôn ngữ NTL+ không làm việc với những thư viện như thế, nên không thể sử dụng các file này và những dòng lệnh đó phải được xóa khỏi chương trình.

'True'/'False' is not declared

Tên các biến logic trong ngôn ngữ NTL+ bắt đầu bằng chữ cái viết thường, vì thế chỉ cần đổi True thành true và False thành false.

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

Biến Bars trong ngôn ngữ MQL4 được dùng để xác định số thanh (bar) trên biểu đồ hiện tại. Trong ngôn ngữ NTL+ có đối tượng cùng tên Bars, nên trong thư viện MQL.ntl có thêm vào biến bars (chữ b không viết hoa), trả về số thanh (bar) của biểu đồ hiện tại, đây là biến mà bạn cần dùng thay cho Bars.

Must return a value

Thông báo này xuất hiện khi gọi toán tử «return» mà không có giá trị trả về. Khi đó hàm có sử dụng toán tử này được khai báo với giá trị trả về khác với void . Khi có thông báo này, cần sửa lại hàm hoặc chỉ rõ giá trị cho toán tửreturn.

Sử dụng số magic (Magic number)

Sử dụng số magic không được hỗ trợ trong phiên bản ngôn ngữ NTL+ hiện tại. Đối với tất cả các vị trí mở giá trị của số magic được trả về bằng 0. Trong script trên ngôn ngữ MQL4 việc sử dụng các số magic trong các toán tử điều kiện được khuyến cáo chú ý đặc biệt. Thường chỉ cần xóa hoặc đánh chú thích cho hàm OrderMagicNumber() nếu bạn không cần nhận dạng vị trí tạo bởi advisor này.

Sử dụng các biến tĩnh

Trong ngôn ngữ NTL+ không sử dụng từ khóa «static». Trong trường hợp cần lưu giá trị các biến giữa các lần gọi hàm, cần làm các biến đó thành biến toàn cục (không dùng từ khóa static), đặt chúng ngoài các hàm. Nếu muốn, có thể thêm modifier extern, nếu cho rằng sẽ có sự thay đổi các thông số đó bởi người dùng khi chạy chương trình, hoặc trong quá trình làm việc của expert.

Xác định khối lượng lot

Trong phiên bản hiện tại khối lượng giao dịch 1 lot đối với bất kì dụng cụ nào bằng 100 000 đơn vị, thì thế nếu bạn muốn sử dụng dụng cụ với kích cỡ lot khác, bạn phải định nghĩa một biến riêng tương ứng và gán cho nó giá trị kích cỡ lot bắt buộc, nếu giá trị này khác 100 000.

Làm việc với các file DLL Различная работа с DLL файлами

Sự làm việc với các file DLL trong NetTradeX Advisors và MetaTrader 4 diễn ra khác nhau. Trong ngôn ngữ MQL4 cần mô tả đầy đủ hàm từ module DLL, còn trong ngôn ngữ NTL+ không cần mô tả như vậy. Thay vì khai báo

#import "ten_file_hoac_module"
    mô tả hàm function 1;
    mô tả hàm function 2;
    mô tả hàm function N;
#import

chỉ cần tạo đối tượng dll chi_thi_bat_ki ("ten_file_hoac_module"); và gọi hàm bạn cần qua
identifier.Call ("ten_ham", các thông số của hàm cách nhau bởi dấu “,”);
hoặc
identifier .CallProc ("ten_ham", các thông số của hàm cách nhau bởi dấu “,”);

Kiểm tra từ dành riêng của ngôn ngữ

Trong các ngôn ngữ MQL4 và NTL+ có những khác biệt về từ dành riêng. Các advisor trong ngôn ngữ MQL4 có thể sử dụng những tên biến hoặc hàm mà không được phép trong ngôn ngữ NTL+ và ngược lại. Trình biên dịch có thể đưa thông báo Expected '(' cho dòng mà trong đó sử dụng dấu ngoặc là không được phép. Một trong những nguyên nhân khả dĩ là sự trùng tên biến với từ dành riêng của ngôn ngữ. Trong trường hợp này cần đổi tên của biến trong toàn bộ code của chương trình. Để mở nhanh cửa sổ Replace trong trình biên tập có thể dùng tổ hợp phím Ctrl+H.

Float value truncated in implicit convertion to integer

Cảnh báo này xuất hiện khi cố gắng gán giá trị kiểu float hay double cho biến kiểu int. Không nhất thiết phải sửa sự xung đột khi chạy script, nhưng nên đổi kiểu giá trị double hoặc float thành int. Ví dụ, đối với biến d kiểu double, ta đổi nó thành dạng int(d).

Thiếu sự chuyển đổi tự động từ bool thành int và ngược lại

Chuyển đổi tự động kiểu int i; bool b = true; i=b; không thể thực hiện trong ngôn ngữ NTL+ . Khi đó sẽ hiện thông báo Can't implicitly convert from 'bool' to 'int'. Vậy nên khi bạn cần sự chuyển đổi như vậy, có thể dùng cấu trúc sau đây:

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'

Trong ngôn ngữ NTL+ yêu cầu thực hiện chuyển đổi kiểu đối tượng datetime thành int. Điều này sẽ được thực hiện như sau: int i; datetime d; i=int(d);

Hằng số màu Цветовые константы

Trong MQL4 có thể sử dụng nhiều hằng số để làm việc với màu của các đối tượng đồ họa cơ bản. Các hằng số này trong code là bất kì màu nào trong 16 màu cơ bản, ví dụ White hoặc Black. Ngoại lệ duy nhất là sử dụng màu trong các indicator đồ họa. Nếu màu được dùng mà ngôn ngữ NTL+ không nhận diện được thì cần định nghĩa màu theo RGB. Ví dụ định nghĩa màu Tomato: color Tomato = 0xFF6347

Làm việc với các mảng dữ liệu

Trong ngôn ngữ MQL4 và NTL+ có những khác biệt trong làm việc với các mảng dữ liệu. Trong NTL+ khai báo dạng type name[] chỉ dùng cho các mảng chỉ thị. Tất cả các mảng để lưu dữ liệu khác được khai báo kiểu array "тип" имя; или array "type" name (size) . Như vậy, thay vì string symb[3] = {"EURUSD", "GBPUSD", "AUDCAD"}; cần dùng array "string" symb= {"EURUSD", "GBPUSD", "AUDCAD"};

Các hàm không hỗ trợ

Một số hàm không được hỗ trợ trong ngôn ngữ NTL+. Những hàm này cần được loại bỏ hoặc thay đổi cách thực thi sao cho phù hợp với cấu trúc ngôn ngữ NTL+. Khi sử dụng những hàm này sẽ hiện thông báo 'The function is not supported' hoặc 'No matching signatures to function_name'.

Danh sách các hàm không hỗ trợ:

  • SendMail()
  • nhóm hàm onArray
  • các hàm FileOpenHistory, FileIsLineEnding
  • nhóm hàm objects và thuộc tính đối tượng
  • đối với các chế độ sau hàm MarketInfo trả về giá trị 0:
    • MODE_SWAPLONG
    • MODE_SWAPSHORT
    • MODE_STARTING
    • MODE_EXPIRATION
    • MODE_MINLOT
    • MODE_LOTSTEP
    • MODE_SWAPTYPE
    • MODE_PROFITCALCMODE
    • MODE_MARGINCALCMODE
    • MODE_MARGININIT
    • MODE_MARGINHEDGED
    • MODE_FREEZELEVEL
  • toán tử goto
  • hàm tính indicator người dùng iCustom
  • nhóm hàm để làm việc với cửa sổ (Window functions), MessageBox
  • TerminalCompany(), TerminalName(), TerminalPath()
  • Các thông số #property

Tóm lược

Trong bài viết này chúng tôi đã chỉ ra những khó khăn điển hình xuất hiện khi chuyển đổi script từ nền tảng MetaTrader sang NetTradeX. Quá trình này được đơn giản hóa đáng kể với sự trợ giúp của thư viện MQL4.ntl đi kèm trong phần mềm NetTradeX. Ưu thế của thư viện này là toàn bộ mã nguồn mở, lập trình viên có thể thay đổi hoặc bổ sung tùy ý. Chúng tôi về phần mình cũng không dừng lại với những thành quả đạt được, và sẽ tiếp tục chỉnh sửa và thêm vào thư viện những hàm mới để làm đơn giản hơn nữa quá trình chuyển đổi code.

Close support
Call to Skype Call to WhatsApp Call to telegram Call Back Call to messenger