
MQL4 文字列関数の一覧|用途別の早見表と戻り値

用途別の関数と戻り値の型
文字列関数は、戻り値の型で使い方が分かれます。StringLen・StringFind・StringSplit・StringReplace・StringCompareは数(int)を返し、StringSubstr・StringFormat・StringConcatenate・StringTrimLeft・StringTrimRightは文字列(string)を返します。StringToUpperとStringToLowerはbool(成功したかどうか)を返し、結果は引数の変数に入ります。
位置は、先頭の文字を0として数えます。StringFindが返す位置も、StringSubstrに渡す開始位置も同じ数え方です。MT5は測っていないので、この記事の内容はMT4(MQL4)の範囲です。
旧名と新名|どちらもMQL4で使える
MQL4では、DoubleToStrとDoubleToString、StrToDoubleとStringToDouble、StrToIntegerとStringToInteger、TimeToStrとTimeToString、CharToStrとCharToString、StringGetCharとStringGetCharacterの両方に、docs.mql4.comのページがあります。下のコードは新名の例で、build 1470でコンパイルして実行できました。
void NewNamesExample()
{
// MQL4 でも、MQL5 と同じ名前の関数が使える
string a = DoubleToString(110.523, 3); // DoubleToStr と同じ働き
double b = StringToDouble("110.523"); // StrToDouble と同じ働き
long c = StringToInteger("42"); // StrToInteger と同じ働き
string d = TimeToString(D'2026.10.29 09:30', TIME_DATE|TIME_MINUTES); // TimeToStr と同じ働き
string e = CharToString(65); // CharToStr と同じ働き
int f = StringGetCharacter("A", 0); // StringGetChar と同じ働き
Print(a, " ", b, " ", c, " ", d, " ", e, " ", f);
}出力は 110.523 110.523 42 2026.10.29 09:30 A 65 でした。違いは、DoubleToStrの桁数(digits)が0〜8で必ず渡すのに対し、DoubleToStringは省略でき、省略すると8桁になることです。StringToIntegerの戻り値はlong、StrToIntegerはintです。
アドバイス旧名と新名は、どちらもMQL4で動いたよ。新しく書くときは、どちらかに揃えると読みやすいね。
MQL4 文字列関数で切り出す|StringLen・StringFind・StringSubstr・StringSplit

StringLenとStringFind|長さと位置を調べる
StringLen(string_value)は文字数を返します。StringFind(string_value, match_substring, start_pos=0)は、探す文字列が始まる位置を返し、見つからなければ-1を返します。第3引数の開始位置を省くと、先頭から探します。
void BasicExample()
{
string str = "USDJPY_H1_EA";
// 長さ
Print("長さ:", StringLen(str)); // 12
// 検索(見つからなければ -1)
int pos = StringFind(str, "H1");
Print("H1の位置:", pos); // 7
// 部分文字列(開始位置は0始まり)
string pair = StringSubstr(str, 0, 6); // "USDJPY"
string tf = StringSubstr(str, 7, 2); // "H1"
Print("通貨ペア:", pair, " 時間軸:", tf);
}void FindExample()
{
string str = "USDJPY_H1_EA";
int first = StringFind(str, "_"); // 最初の _ の位置
int next = StringFind(str, "_", first + 1); // 2つ目の _ の位置
int none = StringFind(str, "h1"); // 大文字小文字は区別される
Print(first, " ", next, " ", none); // 6 9 -1
if(StringFind(Symbol(), "JPY") >= 0) // 0 以上なら見つかった
Print("JPYを含むシンボルです");
}文字列 USDJPY_H1_EA では、長さが12、H1 の位置が7でした。_ は6と9にあり、2つ目は開始位置を7にして探しています。大文字と小文字は区別され、h1 で探すと-1でした。位置が0以上かどうかで、含まれているかを判定できます。
StringSubstr|位置と長さで切り出す
StringSubstr(string_value, start_pos, length=0)は、開始位置から切り出した文字列を返します。長さが0以下か省略されると、末尾までです。上のコードの StringSubstr(str, 0, 6) は USDJPY、StringSubstr(str, 7, 2) は H1 でした。
長さを0にした StringSubstr(s, 7, 0) は、末尾までの H1_EA でした。残りより大きい長さを渡した StringSubstr(s, 10, 100) は EA で、文字数を超えた開始位置の StringSubstr(s, 12, 2) は空の文字列です。
StringSplit|区切り文字で分ける
StringSplit(string_value, separator, result[])は、区切り文字で分けた文字列を配列に入れ、個数を返します。区切り文字は文字そのものではなく、コード(ushort)で渡します。コードはStringGetCharacterで取れます。
void SplitExample()
{
string parts[];
ushort sep = StringGetCharacter("_", 0); // 区切り文字のコード
int n = StringSplit("USDJPY_H1_EA", sep, parts);
for(int i = 0; i < n; i++)
Print(i, ":", parts[i]); // 0:USDJPY 1:H1 2:EA
}出力は 0:USDJPY・1:H1・2:EA の3行でした。区切りが続く a,,b は3個になり、2個目は空の文字列です。末尾が区切りの a,b, も3個、空の文字列を渡すと0個でした。配列の扱いはMQL4の配列関数の記事にまとめています。
アドバイス位置は0から数えるよ。StringFindが7を返したら、StringSubstrの開始位置にそのまま使えるね。
MQL4 文字列関数で型を変換する|DoubleToStr・IntegerToString・StrToDouble

DoubleToStrとIntegerToString|数値を文字列にする
DoubleToStr(value, digits)は、小数点以下をdigits桁にした文字列を返します。docs.mql4.comのdigitsの範囲は0〜8です。IntegerToString(number, str_len=0, fill_symbol=’ ‘)は、整数を指定の長さの文字列にし、足りない分を左に埋め字で埋めます。
void ConvertExample()
{
// 数値 → 文字列
string priceStr = DoubleToStr(110.523, 3); // "110.523"
string lotStr = DoubleToStr(0.1, 2); // "0.10"
string ticketStr = IntegerToString(12345); // "12345"
string padStr = IntegerToString(42, 5, '0'); // "00042"
// 文字列 → 数値
double price = StrToDouble("110.523"); // 110.523
int value = StrToInteger("42"); // 42
Print(priceStr, " ", lotStr, " ", ticketStr, " ", padStr, " ", price, " ", value);
}出力は 110.523 0.10 12345 00042 110.523 42 でした。図のとおり、110.523を0桁にすると111、1.28473418を3桁にすると1.285で、桁数より下は四捨五入されました。2.5を0桁にすると3です。IntegerToStringの長さより桁が多い数は切られず、IntegerToString(123456, 3) は 123456 でした。
StrToDoubleとStrToInteger|文字列を数値にする

StrToDouble(value)はdouble、StrToInteger(value)はintを返します。図の戻り値は、小数の末尾の0を省いて表示しています。"abc" と空の文字列は0で、"1e3" は1000でした。先頭の空白は読み飛ばされ、"12.5x" は12.5になります。
注意したいのは、"1,234.5" が1になったことです。桁区切りのカンマで読み取りが止まります。"abc" も0になるので、戻り値が0でも、0を渡したのか読めなかったのかは、戻り値だけでは区別できません。"42.9" をStrToIntegerに渡すと42でした。
時刻と文字コードの変換
TimeToStr(value, mode)は、時刻を yyyy.mm.dd hh:mi の形式の文字列にします。modeを省くと日付と分までで、TIME_DATE|TIME_SECONDS にすると秒まで出ます。D'2026.10.29 09:30:15' を渡すと、modeを省いた場合は 2026.10.29 09:30、秒を指定した場合は 2026.10.29 09:30:15 でした。CharToStr(65)は A、StringGetChar(“A”, 0)は65を返しました。
アドバイスStrToDoubleは、読めない文字列でも0を返すよ。カンマ入りの数は、先にカンマを取ってから渡そうね。
MQL4 文字列関数 StringFormat|書式を指定して組み立てる

指定と出力
StringFormat(format, …)は、書式の文字列と値から、組み立てた文字列を返します。書式の規則はPrintFormatと同じです。整数は %d、小数は %.2f のように桁数を決め、文字列は %s で入れます。
void FormatExample()
{
string msg = StringFormat("Ticket: %d, Price: %.5f, Lots: %.2f",
12345, 110.52300, 0.10);
Print(msg); // Ticket: 12345, Price: 110.52300, Lots: 0.10
string padded = StringFormat("%-10s %8.2f", "Balance:", 123456.78);
Print("[", padded, "]");
}出力は Ticket: 12345, Price: 110.52300, Lots: 0.10 と [Balance: 123456.78] でした。図の [ ] は文字列の両端を示す記号で、出力には含まれません。%03d は3桁のゼロ埋め、%8.2f は幅8の右寄せ、%-10s は幅10の左寄せになりました。
%.0f に2.5を渡すと、出力は2でした。DoubleToStrで2.5を0桁にすると3だったので、同じ0桁でも、関数によって結果が違います。桁を丸める基準をそろえたいときは、使う関数を1つに決めてください。
取引ログの1行を作る
時刻・売買の種類・チケット番号・通貨ペア・ロット・価格を1行にまとめる関数です。時刻はTimeToStr、価格は桁数をDigitsにしたDoubleToStrで文字列にして、%s に渡しています。
string FormatTradeLog(string action, int ticket, double lots, double price, datetime t)
{
return StringFormat("[%s] %s #%d %s %.2f lots @ %s",
TimeToStr(t, TIME_DATE|TIME_SECONDS),
action,
ticket,
Symbol(),
lots,
DoubleToStr(price, Digits));
}FormatTradeLog("BUY", 12345, 0.1, 110.523, D'2026.10.29 09:30:15') を、USDJPYのチャートで呼ぶと、[2026.10.29 09:30:15] BUY #12345 USDJPY 0.10 lots @ 110.523 が出力されました。このときのDigitsは3です。
StringConcatenateと + 演算子の違い
StringConcatenateは、渡した値を文字列にして結合し、結合した文字列を戻り値で返します。+ 演算子でも同じ文字列が作れます。
void ConcatExample()
{
// + 演算子
string a = "Balance:" + DoubleToStr(1234.5, 2) + " Equity:" + DoubleToStr(1200.25, 2);
// StringConcatenate は結合した文字列を戻り値で返す
string b = StringConcatenate("Balance:", DoubleToStr(1234.5, 2),
" Equity:", DoubleToStr(1200.25, 2));
Print(a);
Print(b);
}2つとも Balance:1234.50 Equity:1200.25 が出力されました。StringConcatenateは、小数をPrintと同じ規則で文字列にします。StringConcatenate("v=", 1.23456789012) は v=1.23456789012 で、"v=" + DoubleToStr(1.23456789012, 8) は v=1.23456789 です。桁数を決めたいときは、DoubleToStrを通してください。docs.mql4.comには、引数の数を「2〜63個」とも「2〜64個」とも書いた箇所があり、この記事では数えていません。
アドバイスログの1行は、StringFormatでまとめると読みやすいよ。価格はDoubleToStrにDigitsを渡して、桁をそろえようね。
MQL4 文字列関数の置換・空白除去|変数が書き換わるかを確かめる

StringReplace|変数が書き換わり、回数が返る
StringReplace(str, find, replacement)は、第1引数の変数の中を直接書き換え、置換した回数を返します。見つからなければ0、エラーなら-1です。
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
}出力は、置換回数が3、文字列が Buy => 110.500, SL => 110.000, TP => 111.000 でした。大文字と小文字は区別され、Abc abc の abc を置換すると1回で、結果は Abc X です。探す文字列を空にすると-1、置換後を空にすると、見つかった分が消えて、aaa から a を消すと3回で空の文字列になりました。エラーコードの一覧はMQL4のエラーコードの記事にあります。
StringTrimLeftとStringTrimRight|戻り値で受け取る
StringTrimLeft(text)とStringTrimRight(text)は、空白・タブ・改行を取った文字列を戻り値で返します。docs.mql4.comの説明文には「modified at place」(その場で書き換える)とありますが、宣言は const string text です。build 1470では、変数は書き換わりませんでした。
前後に空白がある " Hello World "(15文字)で試すと、StringTrimLeftを呼んだあとも、変数の長さは15のままでした。戻り値は "Hello World " です。StringTrimRightの戻り値は " Hello World"(13文字)で、2つを重ねると "Hello World"(11文字)になりました。変数を整えたいときは、戻り値を代入します。
void TrimCaseExample()
{
string str = " Hello World ";
str = StringTrimLeft(str); // 左側の空白を取った文字列が戻り値で返る
str = StringTrimRight(str); // 右側の空白を取った文字列が戻り値で返る
Print("[", str, "]"); // [Hello World]
string upper = str;
string lower = str;
StringToUpper(upper); // "HELLO WORLD"
StringToLower(lower); // "hello world"
Print(upper, " / ", lower);
}StringToUpperとStringToLower|変数が書き換わる
StringToUpperとStringToLowerは、変数を直接書き換えて、成功すればtrueを返します。Hello World は HELLO WORLD と hello world になり、戻り値はどちらもtrueでした。上のコードのように、元の変数を残したいときは、コピーした変数に使います。
StringCompare|比べて -1・0・1 を返す
StringCompare(string1, string2, case_sensitive=true)は、string1が小さければ-1、等しければ0、大きければ1を返します。
void CompareExample()
{
Print(StringCompare("abc", "abd")); // -1
Print(StringCompare("a", "A")); // 大文字小文字を区別
Print(StringCompare("a", "A", false)); // 0(区別しない)
Print("abc" == "abc"); // true
}"abc" と "abd" は-1、"a" と "A" は-1で、順番を入れ替えた "A" と "a" は1でした。第3引数をfalseにすると、"a" と "A" は0です。== で比べた "abc" == "abc" はtrueでした。
アドバイスStringReplaceは変数が書き換わるけれど、StringTrimLeftは書き換わらないよ。戻り値を代入するのを忘れないでね。
MQL4 文字列関数をコンパイルして実行した結果

測り方とコンパイルの結果
この記事のサンプルコード11本は、1つのスクリプトファイルにまとめてコンパイルし、実行してPrintの出力を読みました。境界の値を試す呼び出しも、同じファイルに入れてあります。計測条件は次の表のとおりです。
| 項目 | 内容 |
|---|---|
| 端末 | MT4 build 1470(デモ口座) |
| チャート | USDJPY 1時間足 |
| 実行日 | 2026年10月30日 |
| コンパイル | MetaEditor・#property strict |
| 結果 | エラー0・警告0 |
実行して分かったこと
図の境界の値と、本文の出力から、次の4点が分かりました。1つ目は、StringTrimLeftとStringTrimRightが変数を書き換えないことです。2つ目は、%.0f に2.5を渡すと2、DoubleToStrで0桁にすると3と、同じ0桁でも結果が違うことです。3つ目は、StrToDoubleが "1,234.5" を1と読むことです。4つ目は、StringCompareが "a" と "A" を区別し、"a" を小さいと判定することです。
測っていないこと
測ったのは、1台の端末(build 1470)で、サンプルの引数と戻り値を確かめることです。MT5、ほかのbuild、処理の速さ、長い文字列、日本語の文字コードによる違いは測っていません。日本語は StringLen("日本語") が3だったことだけを確かめています。docs.mql4.comの記述と実行結果が食い違った箇所は、実行結果を書きました。
アドバイスサンプルは、コンパイルしてエラー0・警告0だったよ。コピーして使うときも、自分の環境で一度コンパイルしてね。
要点
・位置は0から数える。StringFindは見つからないと-1、StringSubstrは長さが0以下だと末尾まで
・DoubleToStrのdigitsは0〜8。桁数より下は四捨五入される(110.523を0桁にすると111)
・StringToUpper・StringToLower・StringReplaceは変数が書き換わる。StringTrimLeft・StringTrimRightは書き換わらず、戻り値で受け取る
・StrToDoubleは読めない文字列で0を返し、"1,234.5" は1になる
・サンプル11本は、build 1470でコンパイルしてエラー0・警告0
・測っていないのは、MT5・ほかのbuild・処理の速さ
MQL4 文字列関数のよくある質問
MQL4で文字列の一部を取り出す関数は何ですか?
StringSubstrです。開始位置は0から数え、長さを省くと末尾まで取り出します。
DoubleToStrとDoubleToStringは何が違いますか?
どちらもMQL4で使えます。DoubleToStrは桁数が必須で0〜8、DoubleToStringは桁数を省けて、省くと8桁です。
StringTrimLeftを呼んでも空白が取れないのはなぜですか?
戻り値を受け取っていないためです。build 1470では変数が書き換わらないので、str = StringTrimLeft(str); のように代入します。
文字列が含まれているかを調べるには?
StringFindの戻り値が0以上かどうかで判定します。見つからないときは-1です。
小数の桁をそろえて文字列にするには?
DoubleToStrか、StringFormatの %.2f を使います。価格ならDigitsを桁数に渡します。
MQL4 文字列関数のまとめ
MQL4の文字列関数は、位置を調べるStringFind、切り出すStringSubstr、数値と文字列を変えるDoubleToStrとStrToDouble、書式を決めるStringFormatが中心です。サンプルコード11本は、MT4 build 1470でエラー0・警告0でコンパイルでき、出力も確かめました。変数が書き換わるのはStringReplace・StringToUpper・StringToLowerで、StringTrimLeftとStringTrimRightは戻り値で受け取ります。
MT5やほかのbuildは測っていないので、自分の環境で一度コンパイルして使ってください。チャートに文字を出す関数はMQL4のチャート操作の記事、配列はMQL4の配列関数の記事、エラーコードはMQL4のエラーコードの記事にまとめています。
この記事はMQL4のプログラミングの情報提供で、特定の取引をすすめるものではありません。FXには価格変動のリスクがあり、元本を超える損失が出ることもあります。EAを動かす前に、デモ口座で動作を確かめてください。
⚠ リスクに関する注意事項
本記事は情報提供を目的としており、特定の金融商品の売買を推奨するものではありません。FX取引はレバレッジ取引の特性上、預託した証拠金以上の損失が生じる可能性があります。取引の際は、ご自身の判断と責任において行ってください。詳しくは特定商取引法に基づく表記をご確認ください。






