
Có khoảng sáu thành phần cấu trúc trong bất kỳ Expert Advisor nào, năm trong số đó là tùy chọn và chỉ có một thành phần thiết yếu. Đúng, cấu trúc của EA có thể đơn giản như chỉ biết một phần cơ bản, mặc dù cuối cùng bạn sẽ muốn biết tất cả. Tìm hiểu cách thêm biến và các chức năng khác để giúp bạn lập trình EA giao dịch của mình trong hướng dẫn đầy đủ này về các mẫu và cấu trúc MQL4 Expert Advisor.
Khi nhấp vào trình hướng dẫn Expert Advisor (chọn Mới/Tệp trong MetaEditor hoặc nút Mới trên thanh công cụ hoặc nhấn Ctrl + N trên bàn phím), thật dễ dàng để nhìn thấy hầu hết các thành viên cấu trúc. Chọn "Chuyên gia cố vấn" từ hộp thoại, nhấn "Tiếp theo" và nhập bất kỳ tên, tác giả và liên kết nào bạn muốn. EA sẽ được lưu vào thư mục \experts với tên đã chọn.
Tiếp theo, bạn có thể thêm một số biến bên ngoài. Bấm vào nút Thêm (thao tác này sẽ thêm một bản ghi mới vào danh sách biến ngoài của bạn), mỗi bản ghi chứa ba trường: Tên (bấm đúp để đặt tên biến); Loại (bấm đúp để đặt kiểu dữ liệu); và Giá trị ban đầu (Nhấp đúp chuột để cung cấp giá trị khởi tạo biến của bạn). Chúng tôi vừa thêm ba biến vào mẫu BasicTemplate EA:
| Tên | Loại | Giá trị ban đầu |
|---|---|---|
| Lô | gấp đôi | 0,1 |
| TakeProfit | int | 250 |
| Dừng lỗ | int | 150 |
Việc đặt quá nhiều biến ở đây là lãng phí thời gian vì hầu hết đều phải được nhập thủ công. Nhấn nút "Xong" và mẫu EA sẽ mở một tài liệu giống như tài liệu bên dưới (lưu ý: Tôi đã sửa đổi nó một chút để nó hữu ích hơn và bạn có thể xem qua cấu trúc là gì).
Xin lưu ý: Tôi nhớ khi mới học lập trình với mql4, tôi rất mong chờ Chuyên gia Trình hướng dẫn cố vấn Hãy giúp tôi dịch và viết mã các ý tưởng giao dịch của mình. Trong thực tế, nó không làm gì khác ngoài việc hiển thị một lớp vỏ trống của mẫu. Thật là một phù thủy tội nghiệp! Trong các bài viết tiếp theo, tôi sẽ giới thiệu cho bạn một mẫu hoàn chỉnh hơn để bạn sử dụng và học hỏi.
//+——————————————————–+
//| BasicTemplate.mq4 |
//| Copyright © 2011, ExcelMarkets |
//| /school |
//+——————————————————–+
// Structure #1 (Optional): Directives
#property copyright “Copyright © 2011, excelmarkets.com”
#property link “/school”// Structure #2 (Optional): Input parameters
extern double Lots=0.1;
extern int TakeProfit = 250;
extern int StopLoss = 150;
// Structural #3 (Optional): expert initialization function
int init()
{
//—- start up code
return(0);
}
// Structure #4 (Optional): expert deinitialization function
<structural#4>
int deinit()
{
//—- shutdown code
return(0);
}
// Structure #5 (Essential): expert start function
int start()
{
//—- your trade conditions and orders
return(0);
}
// Structure #6 (Optional): Custom Functions
</structural#4>
int customfunction1(){
// your custom option conditions
return (0); }
void customfunction2(){
// your custom function conditions
}
Ở trên giống như cấu trúc cơ bản của bất kỳ EA cụ thể nào, không có mã nào mang lại sự sống cho nó. Mỗi thành phần cấu trúc đều cần được giải thích.
Phần tử cấu trúc số 1 (tùy chọn): Chỉ thị tiền xử lý
Mục đầu tiên xuất hiện trong mẫu MQL là Chỉ thị tiền xử lý, bắt đầu bằng #, bạn có thể thấy rằng mẫu có hai: #property Copyright, là tên tác giả và #property link, là nơi bạn có thể hoặc không thể nhập trình hướng dẫn. Đây là hai chỉ thị thuộc tính duy nhất liên quan đến Expert Advisors và việc bao gồm hoặc loại trừ chúng là hoàn toàn tùy chọn.
Một lệnh tiền xử lý khác mà bạn có thể thấy trong một số EA là lệnh #include. Tệp include bao gồm các hàm và mã nguồn sẽ được đưa vào dự án khi biên dịch và cú pháp của nó là:
#include < filename.mqh > ;< /p>
Tệp bao gồm tiêu chuẩn mà bạn có thể thấy là #include stdlib.mqh, đi kèm với MetaEditor và chứa một số chức năng hữu ích mà các lập trình viên có thể thấy.
Nếu bạn muốn sử dụng một hàm đã được biên dịch trong một tệp khác (chẳng hạn như EA khác, tệp thư viện hoặc tệp dll Windows), bạn có thể sử dụng # lệnh nhập để nhập các hàm này trực tiếp vào dự án của bạn.
Hầu hết các tệp thư viện được gọi bằng lệnh #import.
Việc sử dụng các chỉ thị tiền xử lý như #include và #import thường dành riêng cho các lập trình viên nâng cao. Tôi nghĩ tôi nên đăng chúng ở đây để bạn biết chúng là gì khi nhìn vào các chuyên gia cố vấn sử dụng chúng.
Thành phần cấu trúc số 2 (tùy chọn): Biến bên ngoài và biến toàn cục
Phần tiếp theo trong mã của chúng ta là các biến bên ngoài và chúng rất hữu ích.
Biến giống như một chiếc hộp nhỏ trong đó bạn có thể lưu trữ thứ gì đó để sử dụng sau này, đặc biệt là các con số. Khái niệm này được mượn từ toán học (hãy nhớ câu x = 10, trong đó giá trị 1 được lưu trong biến x). Từ thời điểm đó trở đi, cho đến khi giá trị của x thay đổi thì giá trị của x là 10. Tất cả các tham chiếu đến x đều được thay thế bằng giá trị 10.
Tất nhiên, chúng ta có thể khai báo bất kỳ biến nào bên trong các phần khác nhau của chương trình, nhưng hãy đặt biến đó ở đây trong phần này và đặt trước nó bằng từ extern cho phép bạn để xem hộp thoại thuộc tính của biến Expert Advisor từ bên ngoài (tức là từ Expert).
Các biến bên ngoài là nơi bạn có thể đặt các tham số có thể điều chỉnh của chương trình, chẳng hạn như cài đặt giao dịch của bạn (kích thước lô, chốt lãi và dừng lỗ) và cài đặt chỉ báo. Khi bạn mở hộp thoại Thuộc tính Expert của Expert Advisor, bạn đang xem các biến bên ngoài của chương trình.
Lưu ý rằng chúng ta chỉ định các biến bên ngoài bằng cách thêm extern trước biến. Extern đảm bảo rằng biến là bên ngoài, nghĩa là nó sẽ xuất hiện trong hộp thoại Expert Properties và người dùng có thể xem và điều chỉnh.
external int stoploss = 150;
Như tôi đã gợi ý, biến It là đơn vị lưu trữ cơ bản của bất kỳ ngôn ngữ lập trình nào và chứa dữ liệu cần thiết để chương trình chạy. Một biến phải được khai báo. Để khai báo một biến, bạn ghép ba phần lại với nhau:
Loại dữ liệu (ví dụ: int), dấu cách, mã định danh (ví dụ: :StopLoss), dấu bằng, giá trị mặc định (ví dụ: 150).
Loại dữ liệu chỉ định loại thông tin mà biến chứa, chẳng hạn như số, chuỗi văn bản, ngày tháng hoặc màu sắc. Để biết thêm thông tin về các biến, hãy xem mô tả của tôi về các biến trong Hướng dẫn cơ bản về MQL4.
Nếu bạn không đặt extern trước biến thì biến đó vẫn hợp lệ, nó chỉ là nội bộ, tức là không hiển thị trong thuộc tính chuyên gia hộp thoại. Ưu điểm của việc khai báo các biến bên trong và bên ngoài trong phần này là chúng có tính toàn cục, nghĩa là nó có thể được sử dụng trong bất kỳ hàm nào trong chương trình. Miễn là chương trình đang chạy, các biến toàn cục và giá trị của chúng vẫn còn trong bộ nhớ và có thể được tham chiếu bởi bất kỳ hàm nào trong chương trình.
Lưu ý: Mặc dù việc khai báo các biến bên ngoài và bên trong trong phần này của EA là thống nhất và thuận tiện nhưng điều đó không thực sự cần thiết. Bạn có thể khai báo bất kỳ hoặc tất cả các biến bên trong (nhưng không phải bên ngoài) trong bất kỳ hàm nào. Một nhược điểm nhỏ là biến sẽ chỉ áp dụng cho hàm đó chứ không áp dụng chung cho tất cả các hàm.
Phần tử cấu trúc số 3 (tùy chọn): Hàm khởi tạo chuyên gia
Hàm init() là tùy chọn nếu bạn có thể. bỏ qua nếu không sử dụng.
Đây là hàm chạy trước bất kỳ hàm nào khác.
Hàm init() sẽ bắt đầu chạy:
Sau khi chương trình được đính kèm vào biểu đồ;
Sau khi khách hàng bắt đầu;
Sau biểu tượng giao dịch và/hoặc thời gian biểu đồ bị thay đổi;
Sau khi biên dịch lại chương trình trong metatrader;
Thay đổi đầu vào từ cửa sổ chuyên gia Sau;
Sau khi thay đổi tài khoản.
Hàm start() chạy trên trích dẫn đầu tiên, nhưng init() chạy ngay sau khi thêm vào (bất kể trích dẫn đến). Nếu không có kết nối với máy chủ, nó sẽ không chạy. Nó sẽ chỉ được gọi một lần trong vòng lặp chương trình và sẽ không được gọi lại.
Khi sử dụng hàm init(), bạn thường đặt rất ít mã. Các đoạn mã phổ biến nhất mà tôi thấy được đặt trong chức năng này là các sơ đồ bảo vệ tài khoản (các đoạn mã khóa EA vào tài khoản của người dùng) và khóa chương trình để hoạt động trên các cặp tiền tệ và giờ giao dịch cụ thể.
Tôi thường đặt mã tự động xác định giá trị pip và độ trượt trong khu vực này, như bạn có thể thấy ở đây.
Phần tử cấu trúc số 4 (tùy chọn): Hàm khử khởi tạo chuyên gia
Hàm deinit() cũng là tùy chọn và có thể bỏ qua nếu không sử dụng. Bạn có thể không cần nó ở một chuyên gia cố vấn.
Đây là chức năng cuối cùng mà chương trình sẽ gọi sau khi kết thúc, bạn có thể xóa bất kỳ nội dung nào bạn muốn tại đây.
Hàm này được gọi là:
Khi chúng tôi thực hiện công việc của mình bằng MetaTrader 4, Hoặc khi chúng ta đóng biểu đồ giá;
Khi chúng ta chuyển đổi giữa các tài khoản giao dịch;
Khi chúng tôi thay đổi khoảng thời gian của thời gian biểu;
Khi chúng tôi xóa phán quyết khỏi biểu đồ giá;
< br/>
Khi chúng tôi thay đổi các tham số của Expert;
Khi chúng tôi biên dịch lại chương trình trong MetaEditor
< p>Hầu hết tôi thấy deinit() không bao giờ được sử dụng.
Thành phần cấu trúc số 5 (Cơ bản): Chức năng khởi động chuyên nghiệp
Chức năng này là chức năng quan trọng nhất của hệ thống giao dịch thông minh và có thể thực hiện công việc quan trọng nhất bất cứ lúc nào. Đó thường là nơi chứa hầu hết mã của bạn, trừ khi bạn đặt phần lớn mã đó vào một hàm tùy chỉnh, vì vậy nó đáng được chú ý đặc biệt.
Nó luôn bắt đầu bằng:
(){
;
Ở đầu Giữa đường đóng và đường đóng, bạn có thể đặt tất cả các điều kiện để mở và đóng giao dịch, cũng như bất kỳ thủ tục và điều kiện giao dịch nào.
Hàm start() chạy trên mỗi tích tắc và sẽ tiếp tục được gọi cho mỗi tích tắc dữ liệu nhận được. Hãy coi nó như một vòng lặp, chức năng khởi động được kích hoạt mỗi khi giá di chuyển, vì vậy mọi thứ chúng ta đưa vào chức năng khởi động sẽ được kích hoạt tương tự. Chức năng khởi chạy giống như Movie Director của EA. Nó gọi hành động và cho các diễn viên và đoàn làm phim biết họ nên làm gì. Nó thiết lập mã và gọi tất cả các chức năng khác.
Tôi đã thấy nhiều EA có toàn bộ mã của họ được đặt trong hàm này.
Nếu bạn muốn kiểm tra một EA đầy đủ chức năng có chứa thành phần cấu trúc này cũng như một số biến bên ngoài, bạn có thể mở MACD Sample.mq4 từ MetaEditor. Bạn có thể thấy rằng EA ghi tất cả các biến, chỉ báo và điều kiện ra vào bên trong hàm khởi động. Ngoài một vài biến số bên ngoài rõ ràng, không có bộ phận cấu trúc nào khác. Đây có lẽ là một trong những EA đơn giản nhất mà bạn từng thấy để viết, đó có thể là lý do tại sao mọi bản tải xuống MT4 đều bao gồm nó. Lợi ích có thể không cao nhưng cách viết đơn giản, rõ ràng, giúp lập trình viên có thông tin dễ dàng học tập.
Trong một số bài viết tiếp theo, chúng ta sẽ chủ yếu tập trung vào mã trong hàm start(), cũng như một số hàm tùy chỉnh.
Phần tử cấu trúc số 6 (tùy chọn): Hàm tùy chỉnh
Mọi hàm khác mà EA của bạn có thể sử dụng phải được khai báo trong start() sau hàm .
Các hàm tùy chỉnh này có thể được gọi từ các hàm start(), init() hoặc deinit() hoặc các hàm khác được gọi từ chương trình chính.
Ý tưởng đằng sau việc tạo các hàm tùy chỉnh là tạo các khối mã thực hiện các tác vụ cụ thể và sau khi tạo, bạn có thể gọi các tác vụ cụ thể đó từ bất kỳ phần nào trong chương trình của mình. Do đó, các chức năng tùy chỉnh làm cho mọi thứ trở nên rất gọn gàng và thuận tiện.
Một số ví dụ về hàm tùy chỉnh là:
Hàm hàng loạt
< p>Chức năng đếm đơn hàng
Chức năng đặt hàng
< / p>
Chức năng đóng lệnh
Chức năng dừng lỗ theo sau
Nhiều Nhiều
Tôi đã thấy nhiều lập trình viên sử dụng các hàm tùy chỉnh để điều khiển EA của họ, vì vậy hàm start() yêu cầu rất ít mã. Họ chỉ cần chèn chức năng tùy chỉnh vào chức năng khởi động và EA sẽ được đóng và chạy.
Khi bạn tìm thấy các chức năng tùy chỉnh thú vị từ các EA khác, bạn có thể sao chép và dán chúng vào EA của riêng mình và trích xuất chúng từ các phần khác nhau của chương trình gọi chúng. Bạn không cần phải hiểu đầy đủ cách hoạt động của tất cả mã trong hàm tùy chỉnh, chỉ cần hiểu cách hoạt động của nó. Bạn có thể tìm hiểu chi tiết cụ thể sau.
Trong các bài viết sau, tôi sẽ trình bày chi tiết một số chức năng tùy chỉnh hữu ích có thể được triển khai nhanh chóng trong bất kỳ EA nào.
Lưu ý: Tất cả các chức năng tùy chỉnh sẽ nằm bên dưới chức năng khởi động. Nó phải ở bên dưới và không nằm trong chức năng khởi động. Nếu nó vào chức năng khởi động, nó sẽ gây nhầm lẫn cho EA, mặc dù nó có thể không biên dịch chính xác.