
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 %sn",
DoubleToStr(AccountBalance(), 2), AccountCurrency());
info += StringFormat("Equity: %s %sn",
DoubleToStr(AccountEquity(), 2), AccountCurrency());
info += StringFormat("Spread: %d ptsn",
(int)MarketInfo(Symbol(), MODE_SPREAD));
info += StringFormat("Positions: %dn", 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()をDoubleToString()に一括置換するだけで大半のコンパイルエラーが解消できました。確認しておきたいポイントは以下の通りです。
- DoubleToStr()はMQL5ではDoubleToString()に変更:移植時に注意
- StrToDouble()/StrToInteger()もMQL5で名称変更:StringToDouble()/StringToInteger()
- StringFormat()はprintf形式で複雑なフォーマットに便利
- 大量の文字列結合にはStringConcatenate()が高速:+ 演算子より効率的
次のステップとして、MQLリファレンス総合ガイドで他のカテゴリも学習しましょう。
MQL4文字列関数 よくある質問
MQL4の文字列関数の特徴は?
StringLen()で長さ取得、StringSubstr()で部分文字列抽出、StringFind()で文字列検索、StringReplace()で置換が基本です。StringConcatenate()で効率的な結合、StringFormat()でC言語スタイルのフォーマット出力も可能です。
MQL4でStringFormat()を使う方法は?
StringFormat(“%.2f pips”, pips)のようにC言語形式でフォーマットします。Print()やComment()と組み合わせてログメッセージを整形するのに便利です。MQL4 Build 600以降で使用可能です。古いビルドではprintf的な書き方が制限されます。
MQL4でシンボル名や時刻を文字列に変換する方法は?
Symbol()でシンボル名を取得(既に文字列)、TimeToStr(TimeCurrent())で現在時刻を文字列化します。DoubleToStr(Ask, Digits())で価格を指定桁数の文字列に変換します。MQL5ではTimeToString()と関数名が変わっています。
MQL4で文字列を数値に変換する方法は?
StrToDouble(str)で文字列をdoubleに、StrToInteger(str)でintに変換します。MQL5ではStringToDouble()/StringToInteger()と名前が変わりました。変換失敗時は0を返すため、入力値の検証が必要です。
MQL4で文字列を分割する方法は?
MQL4にはStringSplit()がないため、StringFind()とStringSubstr()を組み合わせて手動で実装します。デリミタ位置をStringFind()で探し、StringSubstr()でその前後を取り出す方法が一般的です。MQL5ではStringSplit()が標準搭載されています。
MQL4の文字列比較の方法は?
StringCompare(str1, str2)で文字列比較(0=等しい、正=str1>str2、負=str1
MQL4リファレンス 関連記事
- MQL4 取引関数:OrderSend・OrderClose・ポジション管理
- MQL4 インジケーター関数:iMA・iRSI・iCustom
- MQL4 口座・マーケット情報:ロット計算
- MQL4 イベントハンドラ:OnInit・OnTick
- MQL4 エラーコード:リトライパターン
- MQL4 時間・日付関数:取引時間フィルター
- EA始め方ガイド:MT4へのEA設定手順
⚠ リスクに関する注意事項
本記事は情報提供を目的としており、特定の金融商品の売買を推奨するものではありません。FX取引はレバレッジ取引の特性上、預託した証拠金以上の損失が生じる可能性があります。取引の際は、ご自身の判断と責任において行ってください。詳しくは特定商取引法に基づく表記をご確認ください。






