Nối Chuỗi (String Concatenation)
Việc nối chuỗi có lẽ là thao tác chuỗi phổ biến nhất. Trong MQL5, điều này có thể được thực hiện bằng cách sử dụng toán tử '+' hoặc '+= '. Toán tử đầu tiên nối hai chuỗi (các toán hạng ở bên trái và bên phải của '+') và tạo ra một chuỗi tạm thời đã được nối, chuỗi này có thể được gán cho một biến mục tiêu hoặc truyền sang một phần khác của biểu thức (chẳng hạn như lời gọi hàm). Toán tử thứ hai thêm chuỗi ở bên phải của toán tử '+=' vào chuỗi (biến) ở bên trái của toán tử này.
Ngoài ra, API MQL5 cung cấp một vài hàm để tạo chuỗi từ các chuỗi khác hoặc các phần tử của các kiểu khác.
Ví dụ về việc sử dụng các hàm được đưa ra trong script StringAdd.mq5
, sẽ được xem xét sau phần mô tả của chúng.
bool StringAdd(string &variable, const string addition)
Hàm này thêm chuỗi được chỉ định addition
vào cuối biến chuỗi variable
. Bất cứ khi nào có thể, hệ thống sử dụng bộ đệm sẵn có của chuỗi variable
(nếu kích thước của nó đủ cho kết quả kết hợp) mà không cần cấp phát lại bộ nhớ hoặc sao chép chuỗi.
Hàm này tương đương với toán tử variable += addition
. Chi phí thời gian và mức tiêu thụ bộ nhớ là gần giống nhau.
Hàm trả về true
trong trường hợp thành công và false
trong trường hợp có lỗi.
int StringConcatenate(string &variable, void argument1, void argument2 [, void argumentI...])
Hàm này chuyển đổi hai hoặc nhiều đối số của các kiểu tích hợp sang dạng biểu diễn chuỗi và nối chúng vào chuỗi variable
. Các đối số được truyền bắt đầu từ tham số thứ hai của hàm. Mảng, cấu trúc, đối tượng, con trỏ không được hỗ trợ làm đối số.
Số lượng đối số phải nằm trong khoảng từ 2 đến 63.
Các đối số chuỗi được thêm vào biến kết quả nguyên trạng.
Các đối số kiểu double
được chuyển đổi với độ chính xác tối đa (lên đến 16 chữ số có nghĩa), và ký hiệu khoa học với số mũ có thể được chọn nếu nó gọn gàng hơn. Các đối số kiểu float
được hiển thị với 5 ký tự.
Giá trị kiểu datetime
được chuyển đổi thành chuỗi với tất cả các trường ngày và giờ ("YYYY.MM.DD hh:mm:ss").
Các liệt kê, ký tự một byte và hai byte được xuất ra dưới dạng số nguyên.
Giá trị kiểu color
được hiển thị dưới dạng bộ ba thành phần "R,G,B" hoặc tên màu (nếu có trong danh sách các màu web tiêu chuẩn).
Khi chuyển đổi kiểu bool
, các chuỗi "true" hoặc "false" được sử dụng.
Hàm StringConcatenate
trả về độ dài của chuỗi kết quả.
StringConcatenate
được thiết kế để xây dựng một chuỗi từ các nguồn khác (biến, biểu thức) ngoài biến nhận. Không nên sử dụngStringConcatenate
để nối các đoạn dữ liệu mới vào cùng một hàng bằng cách gọiStringConcatenate(variable, variable, ...)
. Lời gọi hàm này không được tối ưu hóa và cực kỳ chậm so với toán tử '+' vàStringAdd
.
Các hàm StringAdd
và StringConcatenate
được kiểm tra trong script StringAdd.mq5
, sử dụng macro PRTE và hàm trợ giúp StrOut
từ phần trước.
void OnStart()
{
string s = "message";
StrOut(s);
PRTE(StringAdd(s, "r"));
StrOut(s);
PRTE(StringConcatenate(s, M_PI * 100, " ", clrBlue, PRICE_CLOSE));
StrOut(s);
}
2
3
4
5
6
7
8
9
Kết quả của việc thực thi, các dòng sau được hiển thị trong nhật ký:
'message' [7] 0
StringAdd(s,r)=true
'messager' [8] 260
StringConcatenate(s,M_PI*100, ,clrBlue,PRICE_CLOSE)=true
'314.1592653589793 clrBlue1' [26] 260
2
3
4
5
Script cũng bao gồm tệp tiêu đề StringBenchmark.mqh
với lớp benchmark
. Nó cung cấp một khung cho các lớp dẫn xuất được triển khai trong script để đo hiệu suất của các phương pháp thêm chuỗi khác nhau. Đặc biệt, chúng đảm bảo rằng việc thêm chuỗi bằng toán tử '+' và hàm StringAdd
là tương đương. Tài liệu này được để lại cho việc tự nghiên cứu.
Ngoài ra, cuốn sách đi kèm với script StringReserve.mq5
: nó thực hiện so sánh trực quan về tốc độ thêm chuỗi tùy thuộc vào việc sử dụng hoặc không sử dụng bộ đệm (StringReserve
).