Trang chủ Kiến thức String trong MQL5: Xử Lý Chuỗi Ký Tự và Text
Knowledge

String trong MQL5: Xử Lý Chuỗi Ký Tự và Text

14 tháng 11, 2025

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: Kiểu Dữ Liệu Chuỗi Ký Tự

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.

Khai Báo và Khởi Tạo

// 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"";

Nối Chuỗi (String Concatenation)

// 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 Functions: Các Hàm Xử Lý Chuỗi

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"

Format String với StringFormat()

// 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"

Chuyển Đổi Kiểu Dữ Liệu

// 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"

Ứng Dụng Thực Tế trong Trading

// 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);
}

Working with Symbol Names

// 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;
}

Best Practices

  • ✅ Sử dụng StringFormat() thay vì nối chuỗi phức tạp
  • ✅ Luôn kiểm tra StringFind() trả về >= 0 trước khi sử dụng
  • ✅ Sử dụng const string cho các giá trị không đổi
  • ✅ Trim whitespace trước khi parse input string
  • ⛔ Tránh so sánh string case-sensitive, dùng StringToUpper() trước
  • ⛔ Không nối chuỗi trong vòng lặp lớn (performance issue)

Bài Tập Thực Hành

  1. Viết hàm tách base/quote currency từ symbol và trả về struct {base, quote}
  2. Tạo hàm format currency với dấu phân cách: 10000.50 → "$10,000.50"
  3. Viết parser để đọc cấu hình từ string: "SL=50;TP=100;Lot=0.1"

Tài Liệu Tham Khảo