Học cách làm việc với string, từ khai báo đến các thao tác concatenation, substring, format trong MQL5.
string trong MQL5 là kiểu dữ liệu lưu trữ chuỗi ký tự Unicode. String được sử dụng rộng rãi cho tên symbol, comment, thông báo, log messages, và file operations.
// Cách khai báo cơ bản
string symbol = "EURUSD";
string comment = "Expert Advisor Trade";
string message = "Order opened successfully";
// Chuỗi rỗng
string empty = "";
// Chuỗi đa dòng (sử dụng
)
string multiLine = "Line 1
Line 2
Line 3";
// Escape characters
string path = "C:\Users\Trader\EA\MyEA.ex5";
string quote = "He said "Hello"";
// Sử dụng toán tử +
string firstName = "John";
string lastName = "Doe";
string fullName = firstName + " " + lastName; // "John Doe"
// Nối với số
string symbol = "EUR" + "USD";
int magic = 12345;
string info = "Magic Number: " + IntegerToString(magic);
// Nối nhiều giá trị
double price = 1.12345;
int digits = 5;
string priceInfo = "Current Price: " + DoubleToString(price, digits) +
" for " + symbol;
string text = "EURUSD Trading";
// Độ dài chuỗi
int length = StringLen(text); // 14
// Lấy substring
string sub = StringSubstr(text, 0, 6); // "EURUSD"
// Tìm vị trí ký tự
int pos = StringFind(text, "Trading"); // 7
// So sánh chuỗi
int compare = StringCompare(text, "EURUSD Trading"); // 0 (bằng nhau)
// Chuyển đổi chữ hoa/thường
string upper = text;
StringToUpper(upper); // "EURUSD TRADING"
string lower = text;
StringToLower(lower); // "eurusd trading"
// Thay thế chuỗi con
string replaced = text;
StringReplace(replaced, "Trading", "Market"); // "EURUSD Market"
// Trim whitespace
string trimmed = " EURUSD ";
StringTrimLeft(trimmed);
StringTrimRight(trimmed); // "EURUSD"
// Giống printf trong C
string symbol = "EURUSD";
double price = 1.12345;
int volume = 100;
// %s = string, %f = double, %d = integer
string formatted = StringFormat("Symbol: %s, Price: %.5f, Volume: %d",
symbol, price, volume);
// "Symbol: EURUSD, Price: 1.12345, Volume: 100"
// Định dạng giá với digits
string priceStr = StringFormat("%.2f", 1234.5678); // "1234.57"
// Padding với số 0
string padded = StringFormat("%08d", 123); // "00000123"
// Alignment
string aligned = StringFormat("%-10s: %10.2f", "Balance", 10000.50);
// "Balance : 10000.50"
// String → Integer
string numStr = "12345";
int number = (int)StringToInteger(numStr); // 12345
// String → Double
string priceStr = "1.12345";
double price = StringToDouble(priceStr); // 1.12345
// Integer → String
int magic = 20250114;
string magicStr = IntegerToString(magic); // "20250114"
// Double → String với digits
double value = 1.123456789;
string valueStr = DoubleToString(value, 5); // "1.12346"
// DateTime → String
datetime time = TimeCurrent();
string timeStr = TimeToString(time, TIME_DATE|TIME_MINUTES);
// "2025.01.14 10:30"
// 1. Tạo comment cho order
string CreateOrderComment(int orderType, double price, double sl, double tp) {
string typeStr = (orderType == ORDER_TYPE_BUY) ? "BUY" : "SELL";
string comment = StringFormat("%s @ %.5f | SL: %.5f | TP: %.5f",
typeStr, price, sl, tp);
return comment;
}
// 2. Log trade information
void LogTrade(string symbol, double profit, double balance) {
string timestamp = TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS);
string logMsg = StringFormat("[%s] %s: Profit = $%.2f | Balance = $%.2f",
timestamp, symbol, profit, balance);
Print(logMsg);
// Write to file
int fileHandle = FileOpen("trade_log.txt", FILE_WRITE|FILE_READ|FILE_TXT);
if(fileHandle != INVALID_HANDLE) {
FileSeek(fileHandle, 0, SEEK_END);
FileWriteString(fileHandle, logMsg + "
");
FileClose(fileHandle);
}
}
// 3. Parse symbol để lấy base/quote currency
void ParseSymbol(string symbol) {
if(StringLen(symbol) != 6) {
Print("Invalid symbol format");
return;
}
string baseCurrency = StringSubstr(symbol, 0, 3); // "EUR"
string quoteCurrency = StringSubstr(symbol, 3, 3); // "USD"
Print("Base: ", baseCurrency, " | Quote: ", quoteCurrency);
}
// 4. Generate unique order ticket string
string GenerateTicketID(int magic) {
string timestamp = IntegerToString((int)TimeCurrent());
string magicStr = IntegerToString(magic);
string randomNum = IntegerToString((int)MathRand());
return StringFormat("%s-%s-%s", timestamp, magicStr, randomNum);
}
// Kiểm tra symbol có tồn tại không
bool SymbolExists(string symbol) {
return SymbolSelect(symbol, true);
}
// Lấy danh sách symbols
string symbols[];
int total = SymbolsTotal(true); // Symbols in Market Watch
ArrayResize(symbols, total);
for(int i = 0; i < total; i++) {
symbols[i] = SymbolName(i, true);
}
// Filter symbols (chỉ lấy major pairs)
string majorPairs = "EURUSD,GBPUSD,USDJPY,USDCHF,AUDUSD,USDCAD,NZDUSD";
bool IsMajorPair(string symbol) {
return StringFind(majorPairs, symbol) >= 0;
}
StringFormat() thay vì nối chuỗi phức tạpStringFind() trả về >= 0 trước khi sử dụngconst string cho các giá trị không đổiStringToUpper() trước