MQL4 文字列関数リファレンス|StringFind・StringSubstr・DoubleToStr・StringFormat

MQL4の文字列関数は、StringFindとStringSubstrで位置を調べて切り出し、DoubleToStrとIntegerToStringで数値を文字列にし、StringFormatで書式を決めて組み立てます。この記事のサンプルコード11本を、ローカルのMT4(build 1470)でコンパイルすると、エラー0・警告0でした。USDJPYの1時間足チャートでスクリプトとして実行し、出力も確かめています。StringTrimLeftとStringTrimRightは、呼んだ変数を書き換えず、空白を取った文字列を戻り値で返しました。

目次

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

MQL4の文字列関数を、長さ・検索・切り出し・分割・変換・書式・結合・置換・空白除去・大小変換・比較の用途別に、関数名と戻り値の型で並べた表
出典: docs.mql4.com の各関数のページと、MT4 build 1470 での実行結果。用途別の関数と戻り値の型。

用途別の関数と戻り値の型

文字列関数は、戻り値の型で使い方が分かれます。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

文字列USDJPY_H1_EAの12文字に0から11の位置を振り、StringFindが返す位置とStringSubstrで切り出す範囲を示した図
出典: MT4 build 1470 で実行した結果。文字列USDJPY_H1_EAの位置と、StringFind・StringSubstrの範囲。

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に110.523・1.28473418・2.5を渡し、digitsを0・1・2・3・8にしたときの出力を並べた表
出典: MT4 build 1470 で実行した結果。DoubleToStrの桁数ごとの出力。

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とStrToIntegerに、数として読める文字列と読めない文字列を渡したときの戻り値を並べた表
出典: MT4 build 1470 で実行した結果。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の指定%d・%03d・%+d・%.5f・%8.2f・%-10s・%.1f%%・%x・%I64d・%.0fに値を渡したときの出力を並べた表
出典: MT4 build 1470 で実行した結果。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・StringToUpper・StringToLower・StringTrimLeft・StringTrimRightを呼んだあとに、変数が書き換わったかと戻り値を並べた表
出典: MT4 build 1470 で実行した結果。呼んだあとの変数と戻り値。

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 文字列関数をコンパイルして実行した結果

StringFind・StringSubstr・StringLen・StringSplit・StringCompareに境界の値を渡したときの戻り値を並べた表
出典: MT4 build 1470 で実行した結果。境界の値で返ってきた戻り値。

測り方とコンパイルの結果

この記事のサンプルコード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取引はレバレッジ取引の特性上、預託した証拠金以上の損失が生じる可能性があります。取引の際は、ご自身の判断と責任において行ってください。詳しくは特定商取引法に基づく表記をご確認ください。

\シストレ.COMで実績のあるEAが使い放題!/
無料会員登録はこちら
FX自動売買でEAを探すなら
シストレ.COM 記事下バナー
実績あるEAが無料
厳格な審査を乗り越えた実績のあるEAが無料で使えます!
自由な口座選び
有料版を購入し柔軟な口座選びが可能!
フォワードテスト公開
全EAのフォワードテスト結果を公開中!
FX初心者も安心
初心者の方も安心して取引を始められます。
多様なEA選択肢
様々な種別のEAをご用意!自分の手法にあった取引が可能です。
信頼のFX会社と提携
人気のFX会社と提携中!様々なFX会社から選べます。
\1分で登録完了!EA探すならシストレ.COM!/
無料会員登録はこちら

この記事が気に入ったら
フォローしてね!

お役立ち情報をシェアする
  • URLをコピーしました!

この記事を書いた人

シストレ.COM編集部は、FX自動売買(EA)とテクニカル分析を専門とするインターネットメディア「シストレ.COM」の編集チームです。200本以上のEAのフォワードテスト結果を公開し、実際の運用データに基づいた客観的な情報を発信しています。記事の執筆・監修はMetaTrader(MT4/MT5)での実運用経験を持つスタッフが担当。

目次