Biến đầu vào
Lớp lưu trữ input
xác định biến bên ngoài. Bộ sửa đổi input
được chỉ định trước kiểu dữ liệu. Một biến với bộ sửa đổi input
không thể thay đổi bên trong chương trình mql5, các biến này chỉ có thể được truy cập để đọc. Giá trị của biến đầu vào chỉ có thể được thay đổi bởi người dùng từ cửa sổ thuộc tính chương trình. Các biến bên ngoài luôn được khởi tạo lại ngay trước khi OnInit()
được gọi.
Độ dài tối đa của tên biến đầu vào là 63 ký tự. Đối với tham số đầu vào kiểu chuỗi, độ dài giá trị maximum
(độ dài chuỗi) có thể từ 191 đến 253 ký tự (xem Ghi chú). Độ dài tối thiểu là 0 ký tự (giá trị không được đặt).
VíSecond dụ:
//--- tham số đầu vào
input int MA_Period=13;
input int MA_Shift=0;
input ENUM_MA_METHOD MA_Method=MODE_SMMA;
2
3
4
Biến đầu vào xác định các tham số đầu vào của chương trình. Chúng có sẵn từ cửa sổ Thuộc tính của chương trình.
Có một cách khác để thiết lập cách tham số đầu vào của bạn sẽ hiển thị trong tab Đầu vào. Để làm điều này, đặt một chú thích chuỗi sau mô tả của tham số đầu vào trên cùng một dòng. Bằng cách này, bạn có thể làm cho tên của các tham số đầu vào dễ hiểu hơn cho người dùng.
Ví dụ:
//--- tham số đầu vào
input int InpMAPeriod=13; // Chu kỳ làm mịn
input int InpMAShift=0; // Độ dịch chuyển ngang của đường
input ENUM_MA_METHOD InpMAMethod=MODE_SMMA; // Phương pháp làm mịn
2
3
4
Ghi chú: Mảng và biến của kiểu phức tạp không thể hoạt động như biến đầu vào.
Ghi chú: Độ dài của chú thích chuỗi cho biến đầu vào không được vượt quá 63 ký tự.
Ghi chú: Đối với biến đầu vào kiểu chuỗi, giới hạn độ dài giá trị (độ dài chuỗi) được đặt bởi các điều kiện sau:
- Giá trị tham số được biểu diễn bằng chuỗi "parameter_name=parameter_value" ('=' được tính),
- Độ dài biểu diễn tối đa là 255 ký tự (
total_length_max
=255 hoặc 254 ký tự không tính '='), - Độ dài tối đa của chuỗi tham số
parameter_name_length
= 63 ký tự.
Do đó, kích thước chuỗi tối đa cho một tham số chuỗi được tính bằng phương trình:
parameter_value_length=total_length_max-parameter_name_length=254-parameter_name_length
Điều này cung cấp kích thước chuỗi tối đa từ 191 (parameter_name_length=63) đến 253 ký tự (parameter_name_length=1).
Truyền tham số khi gọi chỉ báo tùy chỉnh từ chương trình MQL5
Chỉ báo tùy chỉnh được gọi bằng hàm iCustom()
. Sau tên của chỉ báo tùy chỉnh, các tham số phải được đặt theo thứ tự nghiêm ngặt phù hợp với khai báo biến đầu vào của chỉ báo tùy chỉnh này. Nếu các tham số được chỉ định ít hơn số biến đầu vào được khai báo trong chỉ báo tùy chỉnh được gọi, các tham số còn thiếu sẽ được điền bằng các giá trị được chỉ định trong quá trình khai báo biến.
Nếu chỉ báo tùy chỉnh sử dụng hàm OnCalculate
kiểu thứ nhất (tức là chỉ báo được tính toán bằng cùng một mảng dữ liệu), thì một trong các giá trị ENUM_APPLIED_PRICE
hoặc tay cầm của một chỉ báo khác phải được sử dụng làm tham số cuối cùng khi gọi chỉ báo tùy chỉnh như vậy. Tất cả các tham số tương ứng với biến đầu vào phải được chỉ định rõ ràng.
Các liệt kê làm tham số đầu vào
Không chỉ các liệt kê có sẵn trong MQL5 mà cả các biến do người dùng định nghĩa cũng có thể được sử dụng làm biến đầu vào (tham số đầu vào cho chương trình mql5). Ví dụ, chúng ta có thể tạo liệt kê dayOfWeek
, mô tả các ngày trong tuần, và sử dụng biến đầu vào để chỉ định một ngày cụ thể trong tuần, không phải dưới dạng số, mà theo cách thông thường hơn.
Ví dụ:
#property script_show_inputs
//--- ngày trong tuần
enum dayOfWeek
{
S=0, // Chủ nhật
M=1, // Thứ hai
T=2, // Thứ ba
W=3, // Thứ tư
Th=4, // Thứ năm
Fr=5, // Thứ sáu,
St=6, // Thứ bảy
};
//--- tham số đầu vào
input dayOfWeek swapday=W;
2
3
4
5
6
7
8
9
10
11
12
13
14
Để cho phép người dùng chọn giá trị cần thiết từ cửa sổ thuộc tính trong khi khởi động script, chúng ta sử dụng lệnh tiền xử lý #property script_show_inputs
. Chúng ta khởi động script và có thể chọn một trong các giá trị của liệt kê dayOfWeek
từ danh sách. Chúng ta khởi động script EnumInInput và chuyển đến tab Đầu vào. Theo mặc định, giá trị của swapday
(ngày tính phí swap gấp ba) là Thứ tư (W = 3), nhưng chúng ta có thể chỉ định bất kỳ giá trị nào khác và sử dụng giá trị này để thay đổi hoạt động của chương trình.
Số lượng giá trị có thể của một liệt kê là có giới hạn. Để chọn một giá trị đầu vào, danh sách thả xuống được sử dụng. Tên gợi nhớ của các thành viên liệt kê được sử dụng cho các giá trị hiển thị trong danh sách. Nếu một chú thích được liên kết với tên gợi nhớ, như trong ví dụ này, nội dung chú thích sẽ được sử dụng thay vì tên gợi nhớ.
Mỗi giá trị của liệt kê dayOfWeek
có giá trị từ 0 đến 6, nhưng trong danh sách tham số, các chú thích được chỉ định cho mỗi giá trị sẽ được hiển thị. Điều này mang lại sự linh hoạt bổ sung để viết chương trình với mô tả rõ ràng về các tham số đầu vào.
Biến với bộ sửa đổi sinput
Biến với bộ sửa đổi input
không chỉ cho phép thiết lập giá trị tham số bên ngoài khi khởi động chương trình mà còn cần thiết khi tối ưu hóa chiến lược giao dịch trong Strategy Tester. Mỗi biến đầu vào, ngoại trừ biến kiểu chuỗi, có thể được sử dụng trong tối ưu hóa.
Đôi khi, cần loại bỏ một số tham số chương trình bên ngoài khỏi khu vực tất cả các lần chạy trong tester. Bộ sửa đổi bộ nhớ sinput
đã được giới thiệu cho những trường hợp như vậy. sinput
là viết tắt của khai báo biến bên ngoài tĩnh (sinput = static input). Điều này có nghĩa là khai báo sau trong mã Expert Advisor
sinput int layers=6; // Số lớp
sẽ tương đương với khai báo đầy đủ
static input int layers=6; // Số lớp
Biến được khai báo với bộ sửa đổi sinput
là một tham số đầu vào của chương trình MQL5. Giá trị của tham số này có thể được thay đổi khi khởi động chương trình. Tuy nhiên, biến này không được sử dụng trong tối ưu hóa tham số đầu vào. Nói cách khác, các giá trị của nó không được liệt kê khi tìm kiếm tập hợp tham số tốt nhất phù hợp với điều kiện được chỉ định.
Expert Advisor được hiển thị ở trên có 5 tham số bên ngoài. "Số lớp" được khai báo là sinput
và bằng 6. Tham số này không thể thay đổi trong quá trình tối ưu hóa chiến lược giao dịch. Chúng ta có thể chỉ định giá trị cần thiết cho nó để sử dụng tiếp. Các trường Start, Step và Stop không khả dụng cho biến như vậy.
Do đó, người dùng sẽ không thể tối ưu hóa tham số này sau khi chúng ta chỉ định bộ sửa đổi sinput
cho biến. Nói cách khác, người dùng thiết bị đầu cuối sẽ không thể đặt giá trị ban đầu và cuối cùng cho nó trong Strategy Tester để tự động liệt kê trong phạm vi được chỉ định trong quá trình tối ưu hóa.
Tuy nhiên, có một ngoại lệ cho quy tắc này: các biến sinput
có thể được thay đổi trong các tác vụ tối ưu hóa bằng hàm ParameterSetRange()
. Hàm này được giới thiệu đặc biệt để kiểm soát chương trình các tập giá trị có sẵn cho bất kỳ biến đầu vào nào bao gồm cả những biến được khai báo là static input
(sinput
). Hàm ParameterGetRange()
cho phép nhận giá trị biến đầu vào khi tối ưu hóa được khởi động (trong trình xử lý OnTesterInit()
) và đặt lại giá trị bước thay đổi và phạm vi, trong đó các giá trị tham số tối ưu hóa sẽ được liệt kê.
Bằng cách này, việc kết hợp bộ sửa đổi sinput
và hai hàm làm việc với tham số đầu vào cho phép tạo ra các quy tắc linh hoạt để thiết lập khoảng tối ưu hóa của tham số đầu vào phụ thuộc vào giá trị của các tham số đầu vào khác.
Sắp xếp tham số đầu vào
Để thuận tiện khi làm việc với chương trình MQL5, các tham số đầu vào có thể được chia thành các khối có tên bằng từ khóa group
. Điều này cho phép tách biệt trực quan một số tham số khỏi các tham số khác dựa trên logic được nhúng trong chúng.
input group "Group name"
input int variable1 = ...
input double variable2 = ...
input double variable3= ...
2
3
4
Sau khai báo như vậy, tất cả các tham số đầu vào được kết hợp trực quan vào một nhóm được chỉ định, đơn giản hóa việc cấu hình tham số cho người dùng MQL5 khi khởi động trên biểu đồ hoặc trong strategy tester. Việc chỉ định mỗi nhóm có hiệu lực cho đến khi xuất hiện khai báo nhóm mới:
input group "Group name #1"
input int group1_var1 = ...
input double group1_var2 = ...
input double group1_var3 = ...
input group "Group name #2
input int group2_var1 = ...
input double group2_var2 = ...
input double group2_var3 = ...
2
3
4
5
6
7
8
9
Một EA mẫu có khối tham số đầu vào được phân tách theo mục đích của chúng:
input group "Signal"
input int ExtBBPeriod = 20; // Chu kỳ Bollinger Bands
input double ExtBBDeviation= 2.0; // Độ lệch
input ENUM_TIMEFRAMES ExtSignalTF=PERIOD_M15; // Khung thời gian BB
input group "Trend"
input int ExtMAPeriod = 13; // Chu kỳ Moving Average
input ENUM_TIMEFRAMES ExtTrendTF=PERIOD_M15; // Khung thời gian MA
input group "ExitRules"
input bool ExtUseSL = true; // Sử dụng StopLoss
input int Ext_SL_Points = 50; // StopLoss tính bằng điểm
input bool ExtUseTP = false; // Sử dụng TakeProfit
input int Ext_TP_Points = 100; // TakeProfit tính bằng điểm
input bool ExtUseTS = true; // Sử dụng Trailing Stop
input int Ext_TS_Points = 30; // Trailing Stop tính bằng điểm
input group "MoneyManagement"
sinput double ExtInitialLot = 0.1; // Giá trị lô ban đầu
input bool ExtUseAutoLot = true; // Tính toán lô tự động
input group "Auxiliary"
sinput int ExtMagicNumber = 123456; // Số ma thuật EA
sinput bool ExtDebugMessage= true; // In thông báo gỡ lỗi
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Khi khởi động một EA như vậy trong strategy tester, bạn có thể nhấp đúp vào tên nhóm để thu gọn/mở rộng khối tham số đầu vào, cũng như nhấp vào hộp kiểm nhóm để chọn tất cả các tham số của nó để tối ưu hóa.
Xem thêm