MQL4の文字列関数を体系的にまとめました。StringLen()による文字列長取得、StringFind()による検索、StringSubstr()による部分文字列抽出、StringConcatenate()による結合、StringReplace()による置換、IntegerToString()・DoubleToStr()・StringToInteger()・StringToDouble()による型変換、StringTrimLeft/Right()によるトリミングまで、MT4 EA開発に必要な文字列処理のすべてをコード付きで解説します。
MQL4とMQL5の文字列関数の違い
| 機能 | MQL4 | MQL5 |
|---|---|---|
| 数値→文字列 | DoubleToStr(), IntegerToString() | DoubleToString(), IntegerToString() |
| 文字列→数値 | StrToDouble(), StrToInteger() | StringToDouble(), StringToInteger() |
| 文字列結合 | StringConcatenate() / + 演算子 | StringConcatenate() / + 演算子 |
| 文字列フォーマット | StringFormat()(ビルド600+) | StringFormat() |
| 文字列比較 | StringCompare()(ビルド600+) | StringCompare() |
MQL4の文字列関数はMQL5と高い互換性がありますが、いくつかの関数名が変更されています。特にDoubleToStr()→DoubleToString()、StrToDouble()→StringToDouble()、StrToInteger()→StringToInteger()はMQL5移植時の頻出修正箇所です。
MQL4の文字列関数はMQL5と高い互換性がありますが、いくつかの関数名が変更されています。特にDoubleToStr()→DoubleToString()、StrToDouble()→StringToDouble()、StrToInteger()→StringToInteger()はMQL5移植時の頻出修正箇所です。
基本文字列関数
StringLen — 文字列長
int StringLen(string str);
// 戻り値: 文字列の文字数StringFind — 文字列検索
int StringFind(
string str, // 検索対象の文字列
string match_substr, // 検索する部分文字列
int start_pos = 0 // 検索開始位置
);
// 戻り値: 見つかった位置(0始まり)、見つからない場合は-1StringSubstr — 部分文字列
string StringSubstr(
string str, // 元の文字列
int start_pos, // 開始位置
int length = -1 // 長さ(-1=末尾まで)
);
// 戻り値: 切り出した部分文字列void StringBasics()
{
string str = "USDJPY_H1_EA";
// 長さ
Print("長さ: ", StringLen(str)); // 12
// 検索
int pos = StringFind(str, "H1");
Print("H1の位置: ", pos); // 7
// 部分文字列
string pair = StringSubstr(str, 0, 6); // "USDJPY"
string tf = StringSubstr(str, 7, 2); // "H1"
Print("通貨ペア: ", pair, " 時間軸: ", tf);
// 検索して通貨ペアを判定
if(StringFind(Symbol(), "JPY") >= 0)
Print("JPYペアです");
}StringConcatenate / + 演算子
void ConcatenateExample()
{
// + 演算子(簡単だが多数の結合では遅い)
string msg = "Balance: " + DoubleToStr(AccountBalance(), 2)
+ " Equity: " + DoubleToStr(AccountEquity(), 2);
// StringConcatenate(高速、多数の引数に対応)
string result;
StringConcatenate(result,
"Balance: ", DoubleToStr(AccountBalance(), 2),
" Equity: ", DoubleToStr(AccountEquity(), 2),
" Spread: ", MarketInfo(Symbol(), MODE_SPREAD));
Print(result);
}StringReplace — 文字列置換
int StringReplace(
string& str, // 対象文字列(書き換わる)
string find, // 検索文字列
string replacement // 置換文字列
);
// 戻り値: 置換した回数void ReplaceExample()
{
string text = "Buy at 110.500, SL at 110.000, TP at 111.000";
int count = StringReplace(text, "at", "=>");
Print("置換回数: ", count); // 3
Print(text); // "Buy => 110.500, SL => 110.000, TP => 111.000"
}型変換関数
| 関数 | 変換方向 | MQL5対応 |
|---|---|---|
| DoubleToStr(value, digits) | double → string | DoubleToString() |
| IntegerToString(value) | int/long → string | IntegerToString() |
| StrToDouble(str) | string → double | StringToDouble() |
| StrToInteger(str) | string → int | StringToInteger() |
| CharToStr(code) | 文字コード → string | CharToString() |
| StringGetChar(str, pos) | string → 文字コード | StringGetCharacter() |
void ConversionExample()
{
// 数値 → 文字列
string priceStr = DoubleToStr(110.523, 3); // "110.523"
string lotStr = DoubleToStr(0.1, 2); // "0.10"
string ticketStr = IntegerToString(12345); // "12345"
// 文字列 → 数値
double price = StrToDouble("110.523"); // 110.523
int value = StrToInteger("42"); // 42
// 価格表示(桁数自動)
Print("Price: ", DoubleToStr(Ask, Digits)); // "110.523" or "110.52300"
}StringFormat — フォーマット文字列(ビルド600+)
void FormatExample()
{
// printf形式のフォーマット
string msg = StringFormat("Ticket: %d, Price: %.5f, Lots: %.2f",
12345, 110.52300, 0.10);
Print(msg); // "Ticket: 12345, Price: 110.52300, Lots: 0.10"
// ログ出力に便利
Print(StringFormat("[%s] %s %s %.2f lots at %.5f",
TimeToStr(TimeCurrent(), TIME_MINUTES),
Symbol(), "BUY", 0.1, Ask));
// パディング
string padded = StringFormat("%-10s %8.2f", "Balance:", AccountBalance());
Print(padded); // "Balance: 123456.78"
}- + 演算子での大量結合は遅い: 毎回新しい文字列オブジェクトが生成されるため、ループ内での使用は避ける
- StringConcatenate()は高速: 内部で効率的に結合され、引数も最大64個まで対応
- StringFormat()は可読性が高い: printf形式で複雑なフォーマットを簡潔に書ける
- Comment()への出力は改行に\nを使う(HTMLの<br>ではない)
- + 演算子での大量結合は遅い: 毎回新しい文字列オブジェクトが生成されるため、ループ内での使用は避ける
- StringConcatenate()は高速: 内部で効率的に結合され、引数も最大64個まで対応
- StringFormat()は可読性が高い: printf形式で複雑なフォーマットを簡潔に書ける
- Comment()への出力は改行に\nを使う(HTMLの<br>ではない)
トリミング・大文字小文字変換
void TrimCaseExample()
{
string str = " Hello World ";
// トリミング
StringTrimLeft(str); // "Hello World "
StringTrimRight(str); // "Hello World"
Print("[", str, "]");
// 大文字・小文字変換
string upper = str;
string lower = str;
StringToUpper(upper); // "HELLO WORLD"
StringToLower(lower); // "hello world"
Print("Upper: ", upper);
Print("Lower: ", lower);
}MQL5にはStringSplit()関数がありますが、MQL4には存在しません。カンマ区切りの文字列を分割するには、StringFind()とStringSubstr()を組み合わせて自前で実装する必要があります。ただしCSVファイルの読み込みであれば、FILE_CSVモードのFileOpen()を使えば自動的に区切り文字で分割されます。
MQL5にはStringSplit()関数がありますが、MQL4には存在しません。カンマ区切りの文字列を分割するには、StringFind()とStringSubstr()を組み合わせて自前で実装する必要があります。ただしCSVファイルの読み込みであれば、FILE_CSVモードのFileOpen()を使えば自動的に区切り文字で分割されます。
実践: ログフォーマット関数
void LogTrade(string action, int ticket, double lots, double price)
{
string logMsg = StringFormat(
"[%s] %s: %s %s %.2f lots @ %s SL=%s TP=%s",
TimeToStr(TimeCurrent(), TIME_DATE|TIME_SECONDS),
action,
Symbol(),
(action == "BUY" || action == "BUY_LIMIT") ? "Long" : "Short",
lots,
DoubleToStr(price, Digits),
DoubleToStr(OrderStopLoss(), Digits),
DoubleToStr(OrderTakeProfit(), Digits)
);
Print(logMsg);
}
// コメント表示用の情報整形
string FormatAccountInfo()
{
string info = "";
info += StringFormat("Balance: %s %s\n",
DoubleToStr(AccountBalance(), 2), AccountCurrency());
info += StringFormat("Equity: %s %s\n",
DoubleToStr(AccountEquity(), 2), AccountCurrency());
info += StringFormat("Spread: %d pts\n",
(int)MarketInfo(Symbol(), MODE_SPREAD));
info += StringFormat("Positions: %d\n", OrdersTotal());
return info;
}文字列関数一覧(MQL5対応表)
| MQL4関数 | MQL5対応 | 説明 |
|---|---|---|
| StringLen() | StringLen() | 文字列長 |
| StringFind() | StringFind() | 文字列検索 |
| StringSubstr() | StringSubstr() | 部分文字列 |
| StringConcatenate() | StringConcatenate() | 文字列結合 |
| StringReplace() | StringReplace() | 文字列置換 |
| StringTrimLeft() | StringTrimLeft() | 左側トリミング |
| StringTrimRight() | StringTrimRight() | 右側トリミング |
| StringToUpper() | StringToUpper() | 大文字変換 |
| StringToLower() | StringToLower() | 小文字変換 |
| DoubleToStr() | DoubleToString() | double→文字列 |
| IntegerToString() | IntegerToString() | int→文字列 |
| StrToDouble() | StringToDouble() | 文字列→double |
| StrToInteger() | StringToInteger() | 文字列→int |
| StringFormat() | StringFormat() | フォーマット文字列 |
| StringGetChar() | StringGetCharacter() | 文字コード取得 |
| CharToStr() | CharToString() | 文字コード→文字列 |
| StringCompare() | StringCompare() | 文字列比較 |
まとめ
MQL4の文字列関数はMQL5と高い互換性がありますが、関数名が異なるものがあります。重要なポイントは以下の通りです。
- DoubleToStr()はMQL5ではDoubleToString()に変更 — 移植時に注意
- StrToDouble()/StrToInteger()もMQL5で名称変更 — StringToDouble()/StringToInteger()
- StringFormat()はprintf形式で複雑なフォーマットに便利
- 大量の文字列結合にはStringConcatenate()が高速 — + 演算子より効率的
次のステップとして、MQLリファレンス総合ガイドで他のカテゴリも学習しましょう。





