Ngôn ngữ MetaQuotes 4 và 5 là công cụ phát triển ứng dụng cho MetaTrader Client Terminal dựa trên các nền tảng thuộc dòng MetaTrader thế hệ thứ tư và thứ năm. Các ngôn ngữ này cung cấp cho người dùng công cụ để phát triển chiến lược giao dịch tự động phía khách hàng
Bài viết bao hàm các chủ đề sau:
- MQL4 và MQL5 là gì?
- Tính năng của ngôn ngữ lập trình MQL4 và MQL5
- Loại dữ liệu và cú pháp của ngôn ngữ MQL4 và MQL5
- Sự khác biệt giữa mã code MQL4 và MQL5
- Lập trình chỉ báo MQL4: Cách viết Expert Advisor bằng MQL4 hoặc MQL5
- Ưu và nhược điểm của ngôn ngữ MQL4 và MQL5
- Chuyển đổi MQL4 sang MQL5
- Hỏi đáp về MQL4 và MQL5
Đây là bài hướng dẫn chi tiết về lập trình MetaTrader MQL4 và MQL5. Sau khi đọc bài viết này, bạn sẽ hiểu MQL là gì, sự khác biệt giữa hai phiên bản ngôn ngữ lập trình mới nhất và cách làm việc với chúng. Tại đây bạn sẽ tìm thấy hướng dẫn chi tiết kèm theo hình ảnh về cách viết một EA. Cùng bắt đầu nào!
MQL4 và MQL5 là gì?
Ngôn ngữ MQL4 và MQL5 có nhiều điểm tương đồng. Do đó, chúng ta sẽ bàn riêng về các điểm khác biệt sau, còn hiện tại chúng ta sẽ thống nhất gọi chung cả hai là MQL và không xác định phiên bản.
MQL là ngôn ngữ lập trình được tích hợp sẵn trên nền tảng MetaTrader. Môi trường phát triển MetaQuotes Language Editor cho phép bạn viết robot giao dịch, chỉ báo hoặc các ứng dụng khác của riêng mình bằng MQL, cũng như biên dịch và gỡ lỗi cho chúng. Môi trường này được cung cấp kèm theo MetaTrader Client Terminal cùng với tất cả thông tin tham khảo.
Nếu bạn đã từng ít nhất một lần đầu tư vào tài sản nào đó, mua đô la để gửi ngân hàng chẳng hạn, thì bạn sẽ hiểu rằng việc đầu tư đòi hỏi sự kiểm soát không ngừng nghỉ. Tôi tin là bạn đã nhiều lần tự hỏi những câu hỏi như:
- Có nên thoát lệnh giao dịch khi giá đang ở đỉnh không?
- Làm thế nào để xác định được giá của một tài sản có tiếp tục tăng không hay thị trường sẽ quay đầu?
- Phải chăng đây là tín hiệu giả và không cần phải chấp nhận rủi ro và vội vàng mở một vị thế?
Bạn cần phải theo kịp thị trường và đưa ra quyết định giao dịch kịp thời cả ngày lẫn đêm trong những phiên tích cực nhất. Khi giao dịch nhiều tài sản cùng một lúc, nhịp độ công việc sẽ càng dồn dập hơn.
MQL cho phép bạn triển khai bất kỳ chiến lược hoặc thuật toán giao dịch nào dưới dạng một chương trình máy tính. Sau khi được khởi động, chương trình này liên tục chạy trên một máy trạm trong MetaTrader Client Terminal. Ngoài ra, bộ sản phẩm bao gồm một số robot giao dịch, chỉ báo và script từ nhà phát triển nền tảng dưới dạng code nguồn, tạo điều kiện thuận lợi cho việc phát triển ngôn ngữ và các kỹ thuật vốn có. Ngoài ra MQL được cung cấp kèm theo thông tin tham khảo chi tiết trực tuyến và ngoại tuyến. Có một cộng đồng lớn những người dùng ngôn ngữ này.
Giả sử bạn nghĩ ra một chỉ báo thú vị hoặc một thuật toán giao dịch thông minh để sử dụng trong giao dịch hoặc có thể bạn muốn phân tích thị trường bằng cách sử dụng mạng thần kinh? Không giới hạn. Với MQL, bạn có thể triển khai bất kỳ ý tưởng nào dưới dạng chỉ báo, expert hoặc ứng dụng khác, biên dịch, gỡ lỗi, kiểm tra dữ liệu lịch sử trong trình thử nghiệm chiến lược - bạn có thể làm tất cả mà không phải chịu rủi ro tài chính và sử dụng nó một cách tích cực trong giao dịch.
Tóm lại, MQL cho phép viết các tiện ích để theo dõi trạng thái của tài khoản giao dịch, tính toán các chỉ báo và mức, nhận tín hiệu giao dịch và xác định điểm vào và thoát thị trường. Các công cụ ngôn ngữ cho phép robot giao dịch hoặc chỉ báo tổ chức trao đổi thông tin với máy chủ từ xa bằng giao thức TCP, bao gồm mã hóa TLS hoặc giao thức HTTP. Có thể gửi dữ liệu qua FTP cũng như thông báo đẩy đến máy khách di động MetaTrader hoặc tới email của người dùng. Một chương trình được viết tốt và gỡ lỗi sẽ hoạt động cho đến khi bạn quyết định thực hiện thay đổi hoặc thay thế hoàn toàn nó bằng một chương trình khác. Bạn chỉ cần đảm nhận việc kiểm soát chung.
Điểm lại lịch sử của Ngôn ngữ MQL4 và MQL5
MQL ra đời là kết quả của sự phát triển tiến hóa của nền tảng MetaTrader. Đây là một công cụ để quản lý tự động các tài khoản giao dịch trong MetaTrader. Tôi sẽ không đi sâu vào chi tiết mà chỉ nhắc lại ngắn gọn.
- MetaQuotes đã phát hành Ngôn ngữ MetaQuotes cùng với nền tảng MetaTrader, trước đây là ứng dụng FXCharts. MQL đã phát triển lên phiên bản thứ hai cùng với bản cập nhật MetaTrader 3. Trong phiên bản này, MetaQuotes đã triển khai API, được cung cấp cho khách hàng như một lớp bổ sung giữa MetaTrader Client và MetaTrader Server.
- Thế hệ thứ tư của nền tảng được phát hành vào ngày 1 tháng 7 năm 2005. MQL4 được phát hành kèm theo. Ngôn ngữ lúc này đã không còn khả năng tương thích ngược với phiên bản trước. MetaQuotes cũng ngừng hỗ trợ API terminal khách hàng, nhưng đã mở rộng khả năng của ngôn ngữ và cho phép tích hợp các thư viện DLL tùy chỉnh vào ứng dụng MQL. API chỉ còn có sẵn cho các nhà môi giới ở cấp máy chủ, quản trị và quản lý.
Vào tháng 6 năm 2010, sau nhiều bản phát hành, MetaTrader 5 đã được ra mắt. MetaQuotes đã thiết kế lại logic giao dịch, loại bỏ hầu hết các hạn chế do cấu trúc nội bộ của nền tảng. Nhưng cho đến nay MT5 vẫn không thể cạnh tranh với thế hệ thứ tư xét về mức độ phổ biến.
Vào tháng 2 năm 2014, MQL4 đã được cập nhật cùng với bản dựng 600 của terminal khách hàng MT4. MetaQuotes đã cải tiến MQL4, đưa vào hầu hết các tính năng từ MQL5, đồng thời tăng tốc MQL4 lên cấp độ của MQL5.
Tính năng của ngôn ngữ lập trình MQL4 và MQL5
MQL được sử dụng để tạo ra các chiến lược giao dịch tự động. Code MQL được diễn giải sơ bộ thành code C++, sau đó được biên dịch thành code thực thi hoạt động bên trong terminal dưới dạng thư viện động nội bộ. Nếu chúng ta vẽ một đường song song với đường chính, thì sẽ tương tự như việc đưa thư viện DLL vào trong code thực thi của chương trình chính. Cách tiếp cận này giúp dễ dàng phát triển một ngưỡng thấp để tham gia vào lĩnh vực giao dịch tự động. Ngôn ngữ này phổ biến trong giới giao dịch, bất chấp phạm vi chuyên môn hóa hẹp và sự phụ thuộc vào nền tảng.
MetaQuotes chăm sóc người dùng bằng cách cung cấp thông tin trợ giúp chi tiết cho tất cả các ứng dụng của họ. Tài liệu tham khảo về lập trình MQL4 và MQL5 được cung cấp cùng với MetaEditor bằng nhiều ngôn ngữ dưới dạng tệp HTM. Do đó, bạn luôn có được hướng dẫn chi tiết kèm theo code ví dụ để triển khai hành vi mong muốn.
Một cộng đồng lớn các nhà giao dịch và lập trình viên đã hình thành xung quanh MQL. Có các công cụ để lập trình viên và nhà giao dịch giao tiếp với nhau. Một lớp ứng dụng tạo sẵn đã được tạo ra để đơn giản hóa quy trình giao dịch. Chợ trực tuyến để trao đổi các ứng dụng trả phí hoặc miễn phí có sẵn tại mql5.com. Terminal giao dịch tích hợp kho ứng dụng, codebase, các bài viết và tín hiệu từ các nhà giao dịch khác. Kho ứng dụng cung cấp hàng trăm giải pháp trả phí và miễn phí như chỉ báo, advisor, script và đủ loại tiện ích. Mua một chương trình tạo sẵn sẽ dễ dàng hơn là cố gắng phát minh ra thứ đã có sẵn rồi.
Nếu bạn quyết định tự học MQL để tạo ứng dụng của riêng mình, hãy đọc bài viết này để tìm hiểu về những vấn đề thường gặp khi mới bắt đầu đi theo hướng này. Bài viết chỉ giới thiệu kiến thức cơ bản nhập môn và không dành cho độc giả nâng cao.
Các nhà phát triển hỗ trợ cung cấp thông tin cho cộng đồng MQL bằng cách thường xuyên xuất bản các bài viết hướng dẫn về nhiều chủ đề khác nhau trong thế giới giao dịch. Tác giả của các bài viết khảo sát các kỹ thuật lập trình mới, trong đó có khởi tạo mạng thần kinh, phân tích và giải pháp cho các vấn đề và các hạn chế của ngôn ngữ, phân tích và thử nghiệm các chiến lược giao dịch, tìm kiếm và triển khai các thuật toán mới.
Trình hướng dẫn của MQL cung cấp 8 tùy chọn cho MQL4 và 10 tùy chọn cho MQL5. Dưới đây là ảnh chụp màn hình của trình hướng dẫn tệp cho cả hai phiên bản ngôn ngữ.
Cùng xem xét những tùy chọn phổ biến nhất:
- Expert Advisor/Trading robot (Robot giao dịch);
- Indicator (Chỉ báo);
- Script;
- Include (.mqh).
Sau khi biên dịch, các ứng dụng này ở dạng code thực thi sẽ được lưu trong thư mục thích hợp của MetaTrader Client Terminal (File -> Open Data Folder): Expert, Indicators, Script, v.v. Sau đó, sau khi được khởi tạo trên biểu đồ, chúng sẽ được khởi chạy để đáp ứng với các sự kiện tạo bởi MetaTrader Client Terminal trong khi hoạt động. Sự kiện là tác nhân khởi chạy chương trình tùy chỉnh và cho phép bạn theo dõi quá trình khởi tạo và hủy khởi tạo, nhận báo giá mới, sự kiện tùy chỉnh trên biểu đồ, v.v.
Ngoài ra, bạn hiện đã có thể tạo ứng dụng bằng Python. Theo đó, các công cụ lập trình Python có sẵn trong terminal giao dịch.
Các trình xử lý sự kiện sau đây được mô tả trong Tài liệu tham khảo của MQL4.
Trong MQL5, số lượng trình xử lý đã tăng lên so với MQL4. Danh sách hiện tại như sau:
Sau này, danh sách sự kiện đã được mở rộng. Hiện tại, danh sách như sau:
Robot giao dịch hay Expert Advisor
Trong cộng đồng các nhà giao dịch, nó còn được gọi là Expert. Expert Advisor được đính kèm vào biểu đồ trong MetaTrader Client Terminal và hoạt động liên tục với điều kiện là terminal giao dịch đang chạy và duy trì kết nối với máy chủ giao dịch. EA được sử dụng để triển khai toàn bộ chiến lược giao dịch bất kỳ, kiểm soát trạng thái tài khoản, thực hiện các hoạt động giao dịch trong một số điều kiện nhất định và quản lý các đối tượng đồ họa. Mỗi lần nhận được tick mới cho một công cụ, robot giao dịch sẽ mở lệnh giao dịch. Expert Advisor cũng có thể được khởi chạy để đáp ứng một số sự kiện khác: OnTimer, OnChartEvent, OnTesterTimer, v.v.
EA được sử dụng để tạo giao diện người dùng. Robot, cũng như chỉ báo, có quyền truy cập vào các đối tượng đồ họa.
Dưới đây là code của một robot giao dịch đơn giản. Sau mỗi tick mới trên biểu đồ của mã tài sản (symbol) mà EA đang hoạt động, EA sẽ kiểm tra lệnh thị trường. Nếu đã có lệnh mở trên một symbol nào đó, EA sẽ đợi lệnh đó đóng. Nếu không có lệnh, EA sẽ mở một lệnh ngược hướng với lệnh trước đó. Các tham số EA là: khối lượng, mức cắt lỗ và mức chốt lời do người dùng đặt. Trong lần chạy đầu tiên, EA sẽ mở một vị thế mua trên một loại tiền tệ. Sau khi vị thế đó đóng, EA sẽ mở tiếp một lệnh bán, rồi sau đó mở một lệnh mua, v.v. Trong trường hợp không mở được lệnh, EA sẽ ghi một thông báo lỗi vào nhật ký và tạm nghỉ 60 giây, sau đó mở lại lệnh. EA không kiểm tra độ chính xác của các tham số do người dùng nhập, do đó, hãy theo dõi kỹ. Dưới đây là một số vấn đề tiềm ẩn có thể nhận ra ngay:
- Không kiểm tra được khả năng giao dịch tổng thể. Tính năng này có thể bị tắt bởi người dùng trong terminal hoặc chỉ tắt đối với advisor này. Máy chủ giao dịch cũng có thể đặt ra các hạn chế đối với giao dịch tự động.
- Khối lượng có thể nhỏ hơn mức tối thiểu hoặc lớn hơn mức tối đa và có thể không phù hợp nếu máy chủ giới hạn bước khối lượng. Ví dụ: người dùng nhập 0,23 lot trong khi máy chủ có bước thay đổi tối thiểu là 0,05 lot. Do vậy EA không mở được lệnh và hàm OrderSend sẽ trả về lỗi.
- Không kiểm tra được tính chính xác của mức dừng cho lệnh giao dịch. Mức này có thể không phù hợp với giá trị tối thiểu/tối đa cho phép hoặc không phù hợp với giới hạn do các mức đóng băng đặt ra.
Code đơn giản nhất có thể dùng làm mẫu để triển khai các giải pháp ở quy mô lớn hơn.
Mã này biên dịch và chạy trong MetaQuotes Language Editor 5 bản dựng 2375 vào ngày 31 tháng 3 năm 2020.
Chỉ báo
Chỉ báo được sử dụng để hiển thị thông tin về dữ liệu giá được chuyển đổi theo một cách nào đó. Tất cả các loại chỉ báo dao động, đường xu hướng, fractal đều là chỉ báo. Chỉ báo có quyền truy cập vào các công cụ đồ họa. MQL4 có 6 chỉ báo, trong khi MQL5 có đến 18 chỉ báo. Ví dụ: Đường trung bình động hiển thị một số giá trị giá trung bình và/hoặc làm mượt cho một period giá trong quá khứ và gián tiếp cho biết hướng giá tương lai của một công cụ. Đường này luôn hoạt động trên biểu đồ. Chỉ báo được cập nhật và tính toán lại khi nhận được một tick trên biểu đồ của công cụ mà chỉ báo đang hoạt động hoặc khi nhận được sự kiện từ người dùng.
Có một hoặc một số bộ đệm được liên kết với chỉ báo bất kỳ bên trong MetaTrader Client Terminal, dữ liệu số sẽ được lưu trong đó. MQL4 cung cấp 32 bộ đệm cho một chỉ báo, trong khi MQL5 có tới 512 bộ đệm.
Dưới đây là ví dụ về code nguồn của chỉ báo Bears, được cung cấp bởi các nhà phát triển nền tảng cùng với MetaTrader4.
Script
Các nhà phát triển sử dụng script để tạo ra các thuật toán không yêu cầu xử lý dữ liệu thời gian thực. Ví dụ: tải xuống dữ liệu thống kê hoặc xuất thông tin gỡ lỗi. Script được thực thi ngay khi được sự kiện OnStart đính kèm vào biểu đồ bất kỳ. Đây là việc duy nhất mà script có thể xử lý.
Hình dưới đây là mã script để đóng tất cả các lệnh thị trường trên tài khoản. Script sẽ xử lý tất cả các lệnh, bất kể lệnh được khởi chạy trên biểu đồ của symbol nào. Trong trường hợp này, các lệnh chờ sẽ bị bỏ qua.
Kết quả của việc chạy script này sẽ là đầu ra sau đây trong nhật ký MetaTrader:
Nếu muốn script này xử lý các lệnh chờ riêng biệt trong MQL4 thì quy trình sẽ phức tạp hơn. Đầu tiên, hãy tạo một Thuộc tính để script có thể hiển thị một cửa sổ dữ liệu đầu vào. Tiếp theo, thêm một Enum chứa 3 tùy chọn để đóng lệnh bằng một script: chỉ lệnh thị trường, chỉ lệnh chờ hoặc tất cả các lệnh đang mở trên tài khoản. Sau đó, thêm một mảng để lưu trữ ticket lệnh chờ và điền tương ứng trong vòng lặp For đầu tiên. Lúc này nó vẫn sẽ xử lý tùy chọn đóng lệnh do người dùng chọn.
Kết quả là, chúng ta có một script như bên dưới, không chỉ đóng tất cả các lệnh mà còn tính đến lựa chọn của người dùng.
Include files (.mqh) library
Như tên gọi, Include (.mqh) được sử dụng để chèn các loại chương trình khác vào MetaTrader Client Terminal. Nhà phát triển có kinh nghiệm sẽ có một bộ công cụ riêng để sử dụng lại nhiều lần trong nhiều ứng dụng khác nhau.
Trong MetaQuotes Language Editor, bạn chỉ cần chỉ định đường dẫn đến tệp tiêu đề (header file) cần chèn liên quan đến vị trí của tệp đích. Khi biên dịch chương trình, MetaEditor sẽ tìm tệp này và chèn mã từ tệp đó thay vì chỉ thị #include. Lúc này tất cả mã trong thư viện sẽ khả dụng trong ứng dụng.
Tương tự, các lập trình viên C và C++ sử dụng lại mã bằng cách chèn các tệp tiêu đề vào trong các dự án của họ và liên kết với các tệp nhị phân.
Ví dụ dưới đây trình bày cách diễn giải đơn giản nhất cho một mảng động hay còn gọi là std::vector từ thư viện C++ chuẩn. Mã này biên dịch và hoạt động với phiên bản MetaEditor 5.00 bản dựng 2375 ngày 31 tháng 3 năm 2020.
Loại dữ liệu và cú pháp của ngôn ngữ MQL4 và MQL5
Các loại dữ liệu và cú pháp của ngôn ngữ được kế thừa từ C++. Trước khi biên dịch, mã MQL được xử lý trước và được diễn giải thành mã C++ tương ứng, do đó, các cấu trúc hợp lệ trong bản tiền nhiệm rất có thể sẽ được biên dịch và hoạt động trong MQL. Lập trình viên biết ngôn ngữ C, C++ hoặc C# có thể dễ dàng học được cách viết mã code MQL.
Loại dữ liệu
MQL có các loại dữ liệu cơ bản sau:
- Giá trị boolean;
- Số thực chính xác đơn và kép;
- Số nguyên chính xác đơn và kép, có dấu và không dấu;
- Char để lưu trữ dữ liệu ký tự;
- Kiểu liệt kê Enum, nhưng không hỗ trợ enum class;
- Cấu trúc, lớp (class) và mẫu lớp.
Đồng thời, có hỗ trợ thêm về màu sắc, chuỗi và ngày giờ như các loại tích hợp sẵn để giúp đơn giản hóa công việc của nhà phát triển. Cách làm việc với các loại này được tổ chức theo kiểu ngôn ngữ C bằng cách sử dụng các hàm global. Hành vi của một chuỗi MQL về cơ bản khác với họ std::string của các mẫu C++03. Đừng nhầm lẫn.
Cú pháp của ngôn ngữ MetaQuotes
MQL có cú pháp tương tự như C++. MQL kế thừa ngữ nghĩa từ bản tiền nhiệm là tiêu chuẩn C++03 với một số thay đổi nhỏ. Hiện tại, MQL tuân thủ tiêu chuẩn C++03 xét về tính năng.
Sự khác biệt chính giữa MQL và C++ là ngữ nghĩa khác nhau của con trỏ. Trong C++, con trỏ là một địa chỉ ảo của dữ liệu. Trong MQL, con trỏ là một descriptor, tương tự như descriptor theo chuẩn POSIX, một mã định danh dạng số, một loại vỏ bọc bên trên một con trỏ thô, mà nhờ đó các đối tượng được tạo trong bộ nhớ động và được liên kết với mã định danh này tồn tại. Toán tử mũi tên “->” không được hỗ trợ cho con trỏ MQL, dereferencing (lấy giá trị biến con trỏ trỏ tới) được thực hiện bằng cách sử dụng toán tử dấu chấm “.”. Descriptor cũng giống như con trỏ, phải bị xóa sau khi chương trình kết thúc. Tuy nhiên, nếu bạn quên hủy đối tượng mà trình xử lý này đề cập đến thì thời gian chạy sẽ thực hiện việc đó cho bạn khi chương trình được khủy khởi tạo.
Ngôn ngữ MQL không có khái niệm biến tạm thời và chuyển động dữ liệu. MQL truyền tham chiếu và truyền giá trị các biến theo cách khác với C++. Đối tượng phức tạp hoặc lớp tùy chỉnh sẽ được truyền tham chiếu cho hàm cho dù bạn có sử dụng toán tử Ampersand hay không.
Có một số hạn chế đối với bản tiền nhiệm. Bạn không thể viết các hàm và mẫu với số lượng đối số thay đổi. Tuy nhiên, điều đáng chú ý là một số hàm tích hợp sẵn như iCustom (chúng ta sẽ phân tích ở phần sau của bài viết này), printf, StringFormat, PrintFormat có số lượng đối số thay đổi. Đây là một nghịch lý!
Làm việc với dữ liệu và tham chiếu đối tượng trong MQL khác với C++ ở một số khía cạnh, nhưng những khác biệt này dễ dàng bị loại bỏ bằng cách sử dụng các thông báo từ trình biên dịch. Chữ ký của hàm tạo sao chép và toán tử gán sao chép khác nhau do sự khác nhau về ngữ nghĩa truyền tham chiếu các biến. Ngoài ra, không có move semantics để di chuyển các biến và các instance của đối tượng trong MQL.
Sự khác biệt giữa mã code MQL4 và MQL5
Sự khác biệt giữa ngôn ngữ MQL thế hệ thứ tư và thứ năm xuất phất từ sự khác biệt giữa hai nền tảng MetaTrader4 và MetaTrader5. Cần lưu ý rằng kể từ khi phát hành MT4 bản dựng 600, chỉ có phiên bản thứ năm của MetaQuotes Language Editor được sử dụng để viết và biên dịch các chương trình trong MQL4 và MQL5. Đặc biệt, các ngôn ngữ hoạt động khác nhau với các hoạt động giao dịch, vì nền tảng thứ năm có nhiều chế độ giao dịch hơn và các khái niệm lệnh, giao dịch và vị thế được tách riêng.
Để gửi yêu cầu thì chỉ có thể sử dụng hàm OrderSend, điều này trái ngược với phiên bản thứ tư, trong đó cho phép sử dụng các chức năng riêng biệt để sửa đổi hoặc xóa lệnh.
| MQL4 | MQL5 | |
| Khung thời gian | 9 (M1, M5, M15, M30, H1, H4, D, W, MN) | 21 (M1, M2, M3, M4, M5, M6, M10, M12, M15, M20, M30, H1, H2, H3, H4, H6, H8, H12, D1, W1, MN1) |
| Kiểu vẽ | 6 DRAW_NONE DRAW_LINE DRAW_SECTION DRAW_HISTOGRAM DRAW_ARROW DRAW_ZIGZAG With build 600, the number has become consistent with the fifth version | 18 DRAW_NONE DRAW_LINE DRAW_SECTION DRAW_HISTOGRAM DRAW_HISTOGRAM2 DRAW_ARROW DRAW_ZIGZAG DRAW_FILLING DRAW_BARS DRAW_CANDLES DRAW_COLOR_LINE DRAW_COLOR_SECTION DRAW_COLOR_HISTOGRAM DRAW_COLOR_HISTOGRAM2 DRAW_COLOR_ARROW DRAW_COLOR_ZIGZAG DRAW_COLOR_BARS DRAW_COLOR_CANDLE |
| Mô hình khởi chạy theo sự kiện | OnInit OnStart OnDeinit OnTick OnCalculate OnTimer OnChartEvent OnTester
| OnInit OnStart OnDeinit OnTick OnCalculate OnTimer OnTrade OnTradeTransaction OnBookEvent OnChartEvent OnTester OnTesterInit OnTesterDeinit OnTesterPass |
| Giao dịch | OrderSend OrderModify OrderDelete Hành vi được chỉ định bởi một tập hợp các tham số riêng biệt cho từng chức năng. Điều này làm phức tạp thêm việc viết và gỡ lỗi chương trình. | OrderSend Một chức năng dùng cho mọi hoạt động. Hành vi bắt buộc được chỉ định trong cấu trúc MqlTradeRequest. Phản hồi được trả về cấu trúc MqlTradeResult. Việc thiết kế hành vi, kiểm tra kết quả và gỡ lỗi chương trình sẽ trở nên dễ dàng hơn. |
| Bộ đệm dữ liệu chỉ báo | 32 | 512 |
| Chỉ báo tích hợp | Số lượng: 30 | Số lượng: 38 Các chỉ báo được tạo bằng cách sử dụng trình xử lý. Số lượng sao chép và mức tiêu thụ bộ nhớ được giảm bớt. |
| Chế độ giao dịch | Hedging | Netting Hedging Stock |
| Công cụ đồ họa OpenCL và DirectX | Không | Có |
| Thế hệ robot giao dịch | Không | Có. Đồng thời, bạn có thể chỉ định các mô-đun tín hiệu tùy chỉnh. |
Vậy là có một số điểm khác biệt. Sau cập nhật trong bản dựng 600, MQL4 chỉ khác MQL5 ở tên nền tảng. Blog LiteFinance có một bài viết so sánh MetaTrader 4 và MetaTrader 5, bạn nên đọc bài viết nếu muốn tìm hiểu sâu hơn về chủ đề này.
Lập trình chỉ báo MQL4: Cách viết Expert Advisor bằng MQL4 hoặc MQL5
Trước khi bắt đầu viết EA, cần hiểu rằng bạn phải có một chiến lược giao dịch. Chỉ khi đó, bạn mới có thể bắt đầu hiện thực hóa ý tưởng dưới dạng một thuật toán chính thức. Code chỉ cung cấp các công cụ ngôn ngữ để thực hiện một ý tưởng nhất định.
Vì vậy, điều đầu tiên bạn cần là một chiến lược giao dịch hiệu quả. Vấn đề phát triển một chiến lược giao dịch hiệu quả nằm ngoài phạm vi của bài viết, vì vậy tối sẽ lấy một ví dụ đơn giản. Giả sử trong các period có mức độ hoạt động thấp của công cụ “trong vùng giá đi ngang”, bạn có thể mở lệnh ngược hướng với các mức giới hạn nhỏ. Điều này sẽ cho phép bạn tận dụng các chuyển động thị trường đi ngang nhỏ để kiếm lợi nhuận.
Chúng ta sẽ viết một Expert Advisor để tự động hóa việc mở lệnh thủ công và kiểm soát các giới hạn lệnh, sau đó khởi chạy EA trên tài khoản giao dịch trong các period mà giá đi ngang.
Lúc đầu, quy trình sẽ như nhau trong cả hai phiên bản ngôn ngữ. Để viết chương trình bằng MQL, bạn cần cài đặt MetaTrader Client Terminal, gói sản phẩm đã bao gồm MetaEditor. Lúc này bạn có thể khởi chạy MetaEditor trực tiếp từ thư mục làm việc của terminal hoặc thông qua menu chính trong terminal giao dịch: Công cụ (Tools) và sau đó trong MetaQuotes Language Editor (F4). Trong cửa sổ MetaEditor ở menu chính, nhấp vào Tệp -> Mới (File -> New). Cũng có thể nhấp vào Mới (New) trong menu đồ họa.
Cách tạo robot giao dịch MQL4
Trong Trình hướng dẫn của ứng dụng tạo EA MQL4, chọn Expert Advisor (template) và nhấp vào Tiếp theo (Next).
Tiếp theo, nhập các tham số để cung cấp cho người dùng giao diện tương tác với chương trình rồi xác nhận bằng cách nhấp vào OK. Ở đây chúng ta thêm:
- Công cụ giao dịch
- Lựa chọn hướng cho giao dịch đầu tiên mà robot sẽ mở. Tạm thời, đây là kiểu số nguyên, nhưng sau này chúng ta sẽ sửa code để chỉ chọn Mua hoặc Bán.
MetaEditor sẽ tự động chèn trình xử lý sự kiện OnTick vào code. Bạn tự chọn phần còn lại. Như bạn có thể thấy, chúng ta cũng có quyền truy cập vào OnTimer, cho phép gọi mọi lúc với tần suất được đặt cho bộ hẹn giờ, và OnChartEvent được gọi để phản hồi hành động của người dùng với biểu đồ. Ở đây bạn có thể thấy MQL5 có nhiều trình xử lý hơn.
Tiếp tục và chọn các trình xử lý sự kiện ở chế độ thử nghiệm. MQL5 cho phép chọn nhiều sự kiện hơn trong chế độ trình thử nghiệm và theo đó, có nhiều trình xử lý sự kiện hơn.
Trong hai bước trước, tôi đã để trống tất cả các tùy chọn. Tất cả logic của chúng ta sẽ được thực thi với hàm OnTick. Hàm này được gọi mỗi khi có tick mới cho một symbol.
Sau khi nhấp vào nút Kết thúc (Finish ), MetaEditor sẽ tạo một mẫu cho Expert Advisor với tên và tham số được chỉ định. Các trình xử lý sự kiện đã chọn cũng sẽ được chèn vào code. Tôi sẽ không đi sâu vào chi tiết của từng trình xử lý. Mọi thông tin cần thiết đều có trong hướng dẫn tham khảo.
Code này có thể đã được biên dịch và chạy trong terminal giao dịch. Nhưng sẽ không có gì xảy ra. Chúng ta có các biến đầu vào chưa sử dụng. Hàm OnInit luôn thông báo cho terminal về khởi tạo thành công, trong khi OnTick và OnDeinit không chứa bất kỳ hướng dẫn nào.
Cùng bắt đầu viết code nhé.
Đầu tiên, hãy dọn dẹp một chút. Loại bỏ các khoảng trắng thừa và rút ngắn nhận xét xuống còn một dòng. Sau đó, chúng ta định nghĩa enum TradeCmd (dòng 11-14) để chỉ định hướng cho giao dịch đầu tiên theo cách tự nhiên chứ không phải là một con số. Sau đó, thay đổi kiểu đầu vào của biến FirstTradeDirection từ int thành TradeCmd (20). Bước tiếp theo là tạo biến static global Direction với kiểu TradeCmd xét hướng của giao dịch trước đó và mở giao dịch tiếp theo ngược hướng.
Lúc đầu, tôi đã quên thêm các biến cho khối lượng giao dịch, mức cắt lỗ và chốt lời trong trình hướng dẫn. Giờ chúng ta sẽ thêm chúng với từ khóa đầu vào và với các cài đặt bên ngoài còn lại.
Hãy chuyển sang hàm OnTick. Chúng ta sẽ phân tích tính khả dụng của các giao dịch mở. Để làm điều này, chúng ta lặp lại tất cả các giao dịch đang mở bằng cách sử dụng một chu kỳ đơn trong phạm vi [0, TotalTrades). Chúng ta kiểm tra lần lượt xem symbol của giao dịch đã chọn có khớp với symbol được chỉ định trong InputSymbol hay không. Nếu có ít nhất một giao dịch như vậy thì không cần phải làm gì cả. Và chúng ta thoát khỏi hàm OnTick trước hạn với Return (dòng 29-35). Hãy chờ lần khởi chạy tiếp theo.
Nếu không, bạn cần phải mở một giao dịch. Hãy tham khảo hướng dẫn sử dụng MQL4 để sử dụng đúng hàm OrderSend và gửi yêu cầu đến máy chủ giao dịch. Khai báo có dạng như sau:
Hãy xem xét các tham số theo thứ tự:
- Symbol. Chúng ta đã có tham số này, nhưng sẽ không kiểm tra tính chính xác và chỉ dựa vào đầu vào chính xác từ người dùng.
- CMD. Đối với tham số này, chúng ta sử dụng biến global static Direction.
- Volume (Khối lượng). Do người dùng chỉ định. Bạn cần phải kiểm tra giá trị đã nhập cho các giới hạn: tối thiểu, bước thay đổi khối lượng tối đa và tối thiểu.
- Price (Giá). Giá Ask nếu là mua, giá Bid nếu là bán.
- Slippage (Độ trượt). Trong trường hợp này, tham số này không quan trọng. Đặt tham số này thành 2 pips.
- Stoploss. Tham số này phụ thuộc vào hướng của giao dịch. Giá trị phải thấp hơn giá mở cửa nếu mua và lớn hơn giá mở cửa nếu bán.
- Takeprofit. Giống như stop loss, tham số này phụ thuộc vào hướng của giao dịch.
Chúng ta chưa cần quan tâm đến 4 tham số có giá trị mặc định còn lại. Do đó, để mở một giao dịch, chúng ta có: InputVolume (khối lượng), Direction (hướng của giao dịch), InputSymbol (mã tài sản), đặt độ trượt thành 1 điểm. Những gì chúng ta cần tính toán tùy thuộc vào Direction: price (giá mở cửa), sl (cắt lỗ) và tp (chốt lời). Nếu chúng ta mua, thì price là Ask, Cắt lỗ thấp hơn giá hiện tại, Chốt lời cao hơn, ngược lại nếu chúng ta bán thì price là Bid, Cắt lỗ cao hơn giá hiện tại và Chốt lời thấp hơn. Chúng ta cũng cần 2 biến bổ sung. Một biến là để chuyển đổi mức giới hạn từ điểm thành điểm giá trị danh nghĩa, tức là giá trị tối thiểu mà báo giá của một symbol có thể thay đổi. Biến thứ hai là để chuẩn hóa các giá trị là số thực, cũng là số các chữ số có ý nghĩa trong phần thập phân của báo giá.
Chuyển đổi mã sau sang MQL.
Chúng ta trực tiếp mở một giao dịch. Chúng ta đặt lại biến hệ thống _LastError bằng hàm tích hợp ResetLastError. Sau đó gửi yêu cầu bằng OrderSend và ghi kết quả vào biến kết quả. Có hai lựa chọn để phát triển các sự kiện:
- Giao dịch đã được mở thành công nếu kết quả chứa giá trị lớn hơn 0, ticker của giao dịch. Vì vậy, cần thay đổi giá trị Direction để mở giao dịch theo hướng ngược lại vào lần sau.
- Nếu kết quả chứa giá trị âm, thì giao dịch chưa được mở. Bạn cần kiểm tra lỗi trước đó bằng GetLastError, phân tích và xử lý: thử lại, nghỉ một lúc, xuất thông tin gỡ lỗi vào nhật ký, v.v. Để đơn giản, tôi sẽ xuất giá trị của lỗi trước đó vào nhật ký.
Cùng xem lỗi này.
Chúng ta đã viết vài chục dòng code và robot giao dịch đã sẵn sàng. Tôi thừa nhận là nó chưa hữu ích lắm, nhưng đây có thể là một ví dụ tuyệt vời cho thấy viết code không đòi hỏi quá nhiều kiến thức và nỗ lực.
Đây là danh sách đầy đủ nếu bạn cần.
Chúng ta biên dịch code và khởi chạy Expert Advisor trong terminal giao dịch.
Cách tạo EA trong MQL5
Ở đây MQL5 có một ưu điểm rõ ràng so với MQL4. Bạn có thể tạo robot giao dịch trong phiên bản thứ năm chỉ sau một vài cú nhấp chuột mà không thực sự viết một dòng code nào.
Trong MetaEditor, nhấp vào New và chọn Expert Advisor (generate) trong trình hướng dẫn của ứng dụng.
Đặt tên cho Expert Advisor này là MQL5_Generated_Robot. Không bắt buộc chỉ định tác giả và trang web hoặc hồ sơ của tác giả. Thêm các tham số của advisor nếu cần: symbol và khung thời gian giao dịch. Nhấp đúp để kích hoạt tham số, nhấp vào tên hoặc giá trị của biến để thay đổi các giá trị mặc định được đề xuất. Bạn có thể đặt bất kỳ symbol nào tùy ý. Tôi đã chọn symbol trên biểu đồ hiện tại để EA hoạt động. Tôi đặt khung thời gian ở M15 để tăng khả năng xuất hiện tín hiệu giao dịch.
Tiếp theo, chúng ta cần chọn một tín hiệu và cài đặt của nó. Tại đây, bạn có thể ứng biến và thử kết hợp các tín hiệu do nhà phát triển đề xuất theo nhiều cách. Những tín hiệu này sẽ tạo ra các sự kiện để Expert thực hiện giao dịch.
Bạn có thể thêm các tín hiệu tùy chỉnh vào phần này, bao gồm cả các tín hiệu từ trình giám sát trên mql5.com. Các tùy chọn sau được cung cấp trong nền tảng theo mặc định:
Tôi đã chọn "Trading at the intersection of two averages" (Giao dịch tại điểm giao nhau của hai đường trung bình) và đặt period thành 21 và 55. Không nên chọn period quá ngắn nếu muốn giảm tín hiệu giả. Giữ nguyên symbol hiện tại. Ví dụ: chúng ta sẽ giao dịch EURJPY và nhận tín hiệu từ các đường trung bình áp dụng cho dữ liệu giá của cặp EURJPY. Chọn một symbol khác ở đây nếu chiến lược của bạn giao dịch công cụ phụ thuộc vào hành vi của một công cụ khác. Tôi cũng đặt khung thời gian ở M15.
Xác nhận. Chúng ta thấy rằng một tín hiệu đã được thêm vào symbol và khung thời gian hiện tại để tạo ra các sự kiện cho EA.
Chuyển sang chế độ Trailing Stop. Ở đây tôi đã chọn giới hạn kích thước cố định. Tôi cũng đặt lệnh cắt lỗ ở 150 điểm và chốt lời ở 200 điểm.
Tiếp theo, chúng ta có thể chọn một trong năm chế độ quản lý tiền cho tài khoản giao dịch. Giao dịch có sẵn với:
- Khối lượng giao dịch cố định;
- Ký quỹ cố định;
- Rủi ro cố định;
- Khối lượng giao dịch cho phép tối thiểu;
- Khối lượng giao dịch được tối ưu hóa.
Tôi đã chọn giao dịch với rủi ro cố định là 1% số tiền trong tài khoản.
Nhấp vào Xong (Done) và thu lợi nhuận! Vậy là chúng ta vừa tạo một Expert Advisor mà không cần viết một dòng code nào.
Hãy xem xét kỹ hơn và tiến hành phân tích nguồn một chút.
Phần đầu bảng và các thuộc tính đều quen thuộc. Tiếp đến là chèn các mô-đun thư viện. Expert là robot của chúng ta. MACross là trình tạo tín hiệu cho sự giao cắt của Đường trung bình động, TrailingFixedPips là mô-đun kiểm soát mức giới hạn, MoneyFixedRisk là mô-đun quản lý rủi ro. Sau đó là cài đặt bao gồm các biến đầu vào để xác định giao diện tương tác với ứng dụng. Trông rất quen phải không? Dĩ nhiên rồi! Chúng ta đã thiết lập chúng trong Trình hướng dẫn tạo Expert Advisor. Các giá trị mặc định có thể được thay đổi sau tại đây.
Tiếp theo, một biến global tự động kiểu CExpert sẽ được khai báo, biến này được khởi tạo với giá trị mặc định. Đối với một đối tượng, điều này có nghĩa là hàm tạo mặc định đã được gọi. Trong phần nội dung của OnInit, EA được khởi tạo, các tín hiệu và bộ lọc được tạo và khởi tạo với các giá trị được chỉ định trong cài đặt. Dưới đây là code sau khi loại bỏ tất cả các mục kiểm tra kết quả khởi tạo thành công và các descriptor kiểm tra tính hợp lệ để giảm bớt số lượng code trực quan.
Dưới đây bạn có thể thấy các hàm OnDeinit, OnTick, OnTimer, OnTrade. Mỗi hàm chỉ gọi phương thức tương ứng của lớp CExpert.
Nếu bạn quan sát kỹ, trong trình điều hướng bên trái trong thư mục Bao gồm -> Expert, bạn có thể thấy các tín hiệu và mô-đun có sẵn trong trình tạo. Theo đó, bạn có thể thêm một số giải pháp chuyên biệt vào trình tạo và tạo ra một số giải pháp cho bất kỳ nhu cầu nào chỉ sau vài cú nhấp chuột.
Hãy thử biên dịch code. 0 lỗi và 0 cảnh báo tức là bạn đã thành công. Để khởi chạy chế độ thử nghiệm chiến lược, hãy nhấn đồng thời Ctrl và F5 hoặc nhấp vào nút trong menu đồ họa ở trên cùng.
Quyền kiểm soát được chuyển đến MetaTrader Client Terminal trong cài đặt của trình thử nghiệm chiến lược. Sau đó, chúng ta chọn tệp để kiểm tra và định cấu hình các tham số còn lại: symbol, khung thời gian, độ sâu lịch sử, số dư và đòn bẩy của tài khoản giao dịch, v.v. Có nhiều cài đặt và mỗi cài đặt đều được mô tả trong tệp tham khảo. Để biết thông tin chi tiết về các cài đặt và chế độ thử nghiệm, hãy chọn trình thử nghiệm và nhấn F1.
Để bắt đầu, hãy nhấn Bắt đầu ở góc dưới bên phải của trình thử nghiệm và nếu thử nghiệm xảy ra mà không tối ưu hóa, thì bạn có thể chọn chế độ trực quan hóa cho chiến lược của mình.
Các nhà phát triển đã mô tả từng mô-đun được tích hợp sẵn và tín hiệu trong https://www.mql5.com/en/docs/standardlibrary/expertclasses. Hãy tham khảo tài liệu để có thêm kiến thức về vấn đề này.
Ưu và nhược điểm của ngôn ngữ MQL4 và MQL5
Nhược điểm chính là mục đích của các ngôn ngữ này. Ngôn ngữ Truy vấn MetaQuotes là ngôn ngữ viết ứng dụng chỉ dành cho MetaTrader. Chỉ có thể biên dịch và gỡ lỗi code MQL trong môi trường MetaEditor. Chỉ MetaTrader Client Terminal mới có thể khởi chạy chương trình để thực thi. Không thể quản lý bộ nhớ thủ công. Bạn vẫn phải tạo nhiều biến hoặc tạo biến trong phạm vi động, nhưng sẽ không có quyền truy cập vào địa chỉ ảo của nó.
Có nhiều giá trị hơn. Ngưỡng đầu vào thấp, đặc biệt nếu bạn đã có kinh nghiệm phát triển bằng các ngôn ngữ tĩnh statically typed. Hiệu suất cao ở cấp độ C và C++. Hỗ trợ phong cách lập trình hướng đối tượng: tính ngắn gọn và khả năng mở rộng, tính kế thừa, tính đa hình và các phương thức lớp ảo. Có thể tạo các mẫu cho các lớp và hàm, tức là tính đa hình xét về tham số. Tất cả những điều này cho phép code được tái sử dụng nhiều lần. Cơ sở hạ tầng miễn phí bao gồm terminal giao dịch, môi trường phát triển, trình thử nghiệm chiến lược, thư viện tích hợp.
Chuyển đổi MQL4 sang MQL5
Cùng xem xét việc cập nhật để chuyển đổi một chương trình từ phiên bản này sang phiên bản khác qua ví dụ về một robot, đã được trình bày ở phần trên của bài viết trong phần khả năng của ngôn ngữ. Để thực hiện việc này, hãy tạo một Expert Advisor trống trong MetaEditor 5 và sao chép code nguồn của Expert Advisor MQL4_Example_EA vào đó. Bạn sẽ không thể biên dịch code này mà không thay đổi, rất nhiều lỗi sẽ xảy ra khi bạn thực hiện.
Lúc đầu, hầu như sẽ không có gì thay đổi, ngoại trừ một vài điểm:
- Xóa #property strict khỏi các chỉ thị tiền xử lý để có thể biên dịch code MQL4.
- Chuyển quy trình tạo biến static Direction phía trên hàm khởi tạo EA thành khởi tạo trong OnInit theo cách đặc biệt, tùy thuộc vào các vị thế có sẵn. Điều này sẽ cho phép thay đổi cài đặt EA trong quá trình giao dịch sau này.
Lưu ý rằng giờ đây việc chọn giao dịch cho bất kỳ symbol nào trong MQL5 đều dễ dàng hơn khi sử dụng hàm PositionSelect tích hợp sẵn mà không cần phải tìm kiếm trong tất cả các giao dịch đang mở.
Hãy xem xét toàn diện hàm OnTick. Chúng ta sẽ sử dụng PositionSelect để kiểm tra vị thế mở cho một symbol. Nếu không có, hãy vào bên trong phần nội dung if và chuẩn bị gửi yêu cầu mở giao dịch. MQL5 cung cấp cấu trúc MqlTradeRequest để tạo yêu cầu, trái ngược với một loạt các tham số trong MQL4. Tôi sẽ không xem xét riêng từng lĩnh vực. Xin lưu ý rằng giống như trong MQL4, chúng ta có 4 trong 7 tham số bắt buộc: symbol giao dịch, khối lượng, hướng và độ lệch so với giá yêu cầu. Chúng ta tính toán 3 tham số còn lại (giá mở cửa, cắt lỗ và chốt lời) tùy thuộc vào hướng giao dịch. Chúng ta điền vào cấu trúc theo thứ tự. Tạm thời không cần chuẩn hóa các số thực, vì vậy không cần biến chữ số.
Gửi yêu cầu bằng phiên bản ngôn ngữ mới nhất sẽ ngắn gọn hơn nhiều. Tất cả thông tin về kết quả thực hiện hàm OrderSend đã được trả về trong MQLTradeResult.
Tôi đã có được code bên dưới sau khi gỡ lỗi và một loạt các thử nghiệm. Kích thước không thay đổi, mặc dù chúng ta đã thay đổi logic yêu cầu các hành động bổ sung ở giai đoạn khởi tạo trong OnInit.
Tóm lại, nâng cấp các ứng dụng từ MQL4 lên MQL5 rất dễ dàng. Nếu bạn có kiến thức cơ bản về MQL thì sẽ không khó để tự thực hiện.
Hơn nữa, tôi đã chọn ra một số câu hỏi thường gặp nhất về MQL và cố gắng trả lời ngắn gọn thấu đáo.
Hỏi đáp về MQL4 và MQL5
Ngôn ngữ MetaQuotes là một ngôn ngữ lập trình cấp cao được sử dụng để viết ứng dụng cho nền tảng giao dịch MetaTrader với kiểu gõ tĩnh yếu có cú pháp gần giống với cú pháp của ngôn ngữ C++ tiền nhiệm. Ngôn ngữ MetaQuotes thực hiện khái niệm đa mô hình. Trong quá trình viết code, bạn có thể sử dụng cách tiếp cận hướng đối tượng, hàm, theo quy trình hoặc hỗn hợp. OOP hỗ trợ tính ngắn gọn, kế thừa và đa hình. Có sẵn nhiều mẫu hàm và lớp. Tuy nhiên bạn không thể sử dụng metaprogramming với tính toán thời gian biên dịch.
Để viết chương trình bằng MQL, bạn cần cài đặt MetaTrader Client Terminal. Gói sản phẩm bao gồm một môi trường MetaEditor để phát triển các ứng dụng trong MQL. Khởi chạy MetaEditor bằng cách sử dụng menu chính Tools -> MetaQuotes Language Editor (F4). Vậy là bạn đã sẵn sàng để viết chương trình MQL đầu tiên của mình.
Kết quả của việc chạy một chương trình như vậy trong terminal giao dịch sẽ là đầu ra sau:

Mq4 là một tệp văn bản đơn giản. Tiện ích mở rộng này cho phép hệ điều hành tự động liên kết tệp với môi trường phát triển MetaEditor. Tệp ex4 là tệp thực thi không thể đọc dưới dạng văn bản và chứa dữ liệu ở dạng code nhị phân.
Trong quá trình biên dịch, code chương trình mq4 được chuyển đổi thành code ex4 thực thi. Quy trình chuyển đổi rất đơn giản và xảy ra rất thường xuyên khi tạo chương trình. Đây chính xác là nhiệm vụ của trình biên dịch.
Quá trình ngược lại là dịch ngược code ex4 thực thi về code văn bản mq4, quá trình này hiếm khi xảy ra và thường không có cơ sở pháp lý. Các dự án nguồn mở thường cung cấp code nguồn cho bất kỳ ai đồng ý với các quy tắc phân phối, chuyển đổi và sử dụng. Các dự án còn lại bảo vệ tất cả các phát triển bằng luật bản quyền. Không có công cụ tiêu chuẩn nào để thực hiện dịch ngược.
Điều gì sẽ xảy ra nếu bạn thực sự cần chuyển đổi code thực thi của tệp ex4 thành code chương trình? Dưới đây là một số câu trả lời cho câu hỏi này, xếp theo thứ tự tăng dần độ phức tạp khi triển khai:
- Liên hệ với tác giả của chương trình và tìm hiểu các điều kiện để lấy được code.
- Tìm một lập trình viên có thể triển khai logic trong chương trình ex4 của bạn và thương lượng.
- Học MQL và tự viết một chương trình tương đương với chương trình bạn đang có nhưng ở dạng ex4. Con đường này không dễ dàng, nhưng chỉ như vậy mới có thể nâng cao khả năng của bạn.
- Tự mình dịch ngược hoặc nhờ ai đó giúp đỡ. Lưu ý về trách nhiệm pháp lý theo luật bản quyền.
Các tệp Mq4 và mq5 là tệp văn bản đơn giản chứa code MQL ở dạng văn bản. Nếu bạn không muốn chia sẻ code nguồn của riêng mình, thì tốt nhất là không phân phối tệp ở định dạng này.
Cách đơn giản để bảo vệ code là phân phối nó ở định dạng ex4 (ex5). Tệp ở định dạng này được tạo bởi MetaEditor khi biên dịch code mq4 (mq5). Theo các quy tắc của ngôn ngữ này, hướng dẫn trong văn bản được chuyển đổi thành code nhị phân thực thi, được thực thi bởi terminal khi bạn thêm một advisor, script hoặc chỉ báo vào biểu đồ.
Dịch ngược code thực thi về nguyên bản không phải là một tác vụ thông thường, và giúp bảo vệ code nguồn của bạn. Trong mọi trường hợp, khi dịch ngược về code nguồn, tên biến có ý nghĩa của code sẽ bị mất và gây khó khăn hơn cho việc hiểu logic chương trình.
MetaQuotes là ngôn ngữ lập trình OOP cấp cao với khả năng gõ tĩnh yếu, được kế thừa từ C++. MQL5 được phát triển theo logic từ MQL4, được phát hành cùng với nền tảng MetaTrader 5. Sau đó, nó đã có tác động đáng kể đến sự phát triển của MQL4 và góp phần vào việc cập nhật phiên bản này.
Trong MQL5 có một công cụ để tạo EA, giúp bạn hoàn toàn không cần phải tự viết code bằng tay. Chỉ sau một vài cú nhấp chuột, bạn sẽ có được một robot giao dịch cùng với code nguồn. Việc thiết lập robot để giao dịch được thực hiện bằng cách sử dụng tín hiệu. Việc kiểm soát trạng thái của tài khoản giao dịch dựa trên các chiến lược quản lý rủi ro và quản lý tiền được cung cấp cùng với terminal giao dịch.
Tải xuống chỉ báo giống như tải bất kỳ tệp nào khác xuống máy tính của bạn. Tác vụ này phải được thực hiện trên máy tính, vì MQL chỉ khả dụng với phiên bản MetaTrader Client Terminal dùng trên máy tính. Mở thư mục làm việc của terminal (File -> Open Data Folder). Tiếp theo, chuyển đến thư mục MQL/indicator rồi dán chỉ báo đã tải vào đây. Sau khi bạn khởi động lại terminal, chỉ báo sẽ có sẵn trong Trình điều hướng. Bạn chỉ cần di chuyển chỉ báo vào biểu đồ và điều chỉnh các thông số đầu vào là xong.
Trên thực tế, tất cả các chương trình MQL4 hoặc MQL5 đều được tạo bằng phiên bản thứ năm của MetaQuotes Language Editor. Có sự tương thích ngược giữa các phiên bản chính và phụ của ngôn ngữ này. Hạn chế duy nhất là Máy chủ MetaQuotes. Một số hàm và cấu trúc không có trong phiên bản thứ tư của nền tảng. Logic xử lý các hoạt động giao dịch trong phiên bản thứ năm của máy chủ đã được thay đổi phần nào. Cấu trúc bên trong của các chỉ báo cũng có sự khác biệt. Ở phiên bản thứ tư, không thể sử dụng nhiều hơn 8 bộ đệm chỉ báo. Trong MetaTrader 5, số lượng bộ đệm đã tăng lên thành 21.
Hàm iCustom tích hợp sẵn cho phép bạn sử dụng tín hiệu từ các chỉ báo để thực hiện logic giao dịch bên trong EA. Nếu bạn có chỉ báo của riêng mình và muốn tạo tín hiệu giao dịch trong advisor để thực hiện các hoạt động giao dịch thì hãy sử dụng iCustom. Hãy xem tài liệu hướng dẫn. Ở đây bạn có thể thấy định nghĩa sau của MQL4:
Định nghĩa MQL5:
Về cơ bản, chức năng của hàm là như nhau, mặc dù chữ ký của nó trong phiên bản thứ tư khác với trong phiên bản thứ năm của ngôn ngữ. Hãy xem xét kỹ hơn từng tham số:
- Dòng symbol chuỗi. Đây là symbol sẽ được tính toán.
- Khung thời gian. Trong MQL4 nó là một int kiểu số nguyên, trong MQL5 nó cũng là một số nguyên nhưng enum chứa các kiểu liệt kê khung thời gian.
- Tên tham số chuỗi. Bạn cần truyền đường dẫn đến chỉ báo vào nó (ví dụ: nếu nó nằm trong một thư mục khác) và cả tên chỉ báo cùng với phần mở rộng mà chúng ta muốn tính toán. Tiếp theo, các tham số bắt buộc được truyền cho chỉ báo mà chúng ta muốn sử dụng.
- Danh sách các tham số của chỉ báo, sẽ được khởi chạy bởi hàm iCustom. Số lượng tham số phụ thuộc vào số lượng đối số cần thiết để nhận được giá trị cần thiết từ chỉ báo. Có nghĩa là hàm có số lượng tham số thay đổi. Ví dụ: đối với Alligator (được bao gồm trong gói cài đặt MetaTrader Client Terminal):
![LiteFinance: Hỏi đáp về MQL4 và MQL5]()
Hoặc, ví dụ: đối với Ichimoku thì sẽ là một tập hợp các biến khác:
Do đó, trong trường hợp đầu tiên, bạn cần truyền 6 tham số cho hàm để nhận giá trị chính xác và 3 tham số trong trường hợp thứ hai. - Có thêm hai tham số trong MQL4 phiên bản thứ tư. Đầu tiên là chế độ số nguyên biểu thị chỉ mục đường chỉ báo và được thời gian chạy sử dụng để bộ đệm dữ liệu lập chỉ mục nội bộ.
- Sự dịch chuyển số nguyên tiếp theo cho biết sự dịch chuyển tiến hoặc lùi của chỉ báo dọc theo dòng thời gian.
MQL là bản kế thừa của ngôn ngữ C++, máy chủ giao dịch MetaTrader và tất cả các ứng dụng liên quan, bao gồm Client Terminal và Language Editor, đều được viết bằng C++. Tuy nhiên, nếu chúng ta so sánh MQL với bản tiền nhiệm thì rõ ràng là ngôn ngữ này phát triển với một độ trễ. Hiện tại, các khả năng MQL tương ứng với tiêu chuẩn C++ 2003. Điều đáng chú ý là MQL là một ngôn ngữ khá mạnh và có thể đáp ứng 99% nhu cầu hiện tại của các lập trình viên và nhà phát triển.
Thoạt nhìn, code của các chương trình trong phiên bản 4 và 5 chỉ khác nhau một chút. Trong phiên bản thứ năm, tất cả các macro từ phiên bản thứ tư được thay thế bằng kiểu liệt kê.
Mô hình sự kiện để khởi chạy các ứng dụng tùy chỉnh đã được mở rộng. Một loạt trình xử lý sự kiện như OnTrade, OnTradeTransaction, OnTesterInit, OnTesterDeinit, OnTesterPass đã ra đời. Hành vi không chính xác của OnTick và OnTimer trong chế độ trình kiểm tra chiến lược đã được khắc phục. Hàm OnTimer hiện có thể chạy với tốc độ lấy mẫu bộ hẹn giờ cao gấp 1000 lần so với trong MQL4. Một lần trên micro giây so với mili giây.
MQL5 đã thay đổi logic để gửi lệnh giao dịch và cơ chế phản hồi lệnh. Một số hàm giao dịch trong MQL4 đã được hợp nhất với các chế độ hoạt động khác nhau được gọi là OrderSend. Quá trình giao dịch trong MetaTrader 5 đã bắt đầu khác với giao dịch trên nền tảng thứ tư. Chế độ netting vị thế đã được áp dụng cùng với một hàm cho phép các giao dịch hedge. Ngoài lệnh, vị thế và giao dịch đã xuất hiện trong MT4. Ngôn ngữ này hiện có hàm OrderSendAsync để gửi yêu cầu đến máy chủ giao dịch ở chế độ không đồng bộ.
Tất cả các macro MQL4 trong MQL5 được thay thế bằng kiểu liệt kê, do đó, trình biên dịch hiện chỉ ra các chuyển đổi kiểu ngầm cho nhà phát triển.
MetaTrader 5 cho phép bạn làm việc với 21 khung thời gian tiêu chuẩn so với 9 khung thời gian ở MetaTrader 4. Các chỉ báo trong MQL5 có số lượng bộ đệm lớn hơn trên biểu đồ.
Chuyển đổi MQL4 sang MQL5 là một tác vụ thông thường đối với một lập trình viên nhập môn, nhưng đòi hỏi sự chú ý và kiên nhẫn. Trình biên dịch sẽ hiển thị cho bạn hầu hết những thứ không tương thích với MQL5.
Cần chú ý đến việc xử lý các lệnh giao dịch và gửi chúng đến máy chủ.
Trong MQL4, một yêu cầu giao dịch được thực hiện bằng cách sử dụng hàm OrderSend và một tập hợp các tham số. Việc sửa đổi lệnh và xóa lệnh chờ được thực hiện bởi các hàm riêng biệt. Kết quả của truy vấn được xác định bởi giá trị Boolean được trả về ở cuối hàm. Việc phân tích kết quả được rút ngắn để xác định code trả về của máy chủ bằng cách sử dụng hàm GetLastError.
MQL5 có cấu trúc MqlTradeRequest đặc biệt để gửi lệnh giao dịch đến máy chủ. Bạn cần điền loại hoạt động và loại lệnh thích hợp. Để nhận được kết quả, bạn cần khai báo và truyền tham chiếu một instance của cấu trúc MqlTradeResult khi gọi OrderSend để nhận phản hồi từ máy chủ, kết hợp các tham số khác nhau đã truyền trước đó khi gọi OrderSend thành một cấu trúc MqlTradeRequest duy nhất rồi gửi đến máy chủ. Chúng ta sẽ phân tích cấu trúc MqlTradeResult nhận được trong phản hồi. Mọi thông tin cần thiết sẽ có sẵn trong phản hồi từ máy chủ.
Cần đặc biệt chú ý đến các trình xử lý sự kiện trong code. Ngoài ra MQL5 còn có OnTesterTick, OnTesterTimer, OnBookEvent. Các ứng dụng khác nhau được khởi chạy để đáp ứng các sự kiện từ terminal giao dịch.
Đối với Expert:
- OnInit
- OnDeinit
- OnTimer
- OnTick
- OnChartEvent
- OnTester
Đối với chỉ báo:
- OnInit
- OnDeinit
- OnTimer
- OnCalculate
- OnChartEvent
- OnTester
Đối với script:
- OnStart (trình xử lý này không sử dụng được trong chỉ báo và script).
Không thể khởi chạy các thư viện tích hợp, vì chúng dành riêng cho các dự án lớn hơn khác.
Một điểm khác biệt khác là các biến xác định trước Ask, Bid, cũng như các mảng Open [], High [], Low [], Close [], Volume [], Time [] không có trong MQL5. Do đó, phải sửa code chương trình để có được dữ liệu này một cách độc lập bằng cách sử dụng các hàm tích hợp sẵn để truy cập các chuỗi thời gian CopyRates, CopyOpen, CopyHigh, v.v. Khai báo một mảng động và lưu dữ liệu vào đó. Hàm cung cấp kết quả sẽ tự thay đổi kích thước mảng.
P.S. Bạn có thích bài viết của tôi? Chia sẻ nó trong các mạng xã hội: đó sẽ là lời cảm ơn tốt nhất của bạn ":)
Liên kết hữu ích:
- Tôi khuyên bạn nên thử giao dịch với một nhà môi giới đáng tin cậy tại đây . Hệ thống cho phép bạn tự giao dịch hoặc sao chép các nhà giao dịch thành công từ khắp nơi trên thế giới.
- Trò chuyện trên Telegram với đội ngũ hỗ trợ Việt Nam cho những nhà giao dịch LiteFinance có sẵn ở đây https://t.me/blogforexchocacnhagiaodich
- Kênh Telegram với các phân tích chất lượng cao, đánh giá Forex, bài viết đào tạo và những thứ hữu ích khác cho các nhà giao dịch https://t.me/blogforexchocacnhagiaodich

Nội dung của bài viết này phản ánh quan điểm của tác giả và không nhất thiết phản ánh quan điểm chính thức của nhà môi giới LiteFinance. Tài liệu được công bố trên trang này chỉ nhằm mục đích cung cấp thông tin và không nên được coi là lời khuyên đầu tư theo mục đích của Chỉ thị 2014/65/EU.
Theo luật bản quyền, bài viết này được coi là tài sản trí tuệ, bao gồm lệnh cấm sao chép và phân phối mà không có sự đồng ý.





















































