MQL5 文字列関数 完全ガイド|StringFind・StringFormat・StringSplit・StringReplace全解説

MQL5 文字列関数を完全網羅。StringFind・StringFormat・StringSplit・StringReplaceなど、EA開発で使うすべての文字列操作をコード付きで解説します。ログ出力、トレードコメント生成、CSV解析、設定ファイルのパースまで、実践的なパターンを豊富に紹介。MQL4との違いも併記しています。

MQL5 文字列関数 リファレンスカード
目次

MQL5文字列の基礎知識

MQL5の文字列(string型)はUnicodeベースで、日本語を含むマルチバイト文字を正しく処理できます。C++のstd::stringに近い使い勝手ですが、MQL5独自の関数群で操作します。

// 文字列の宣言と初期化
string str1 ="Hello MQL5";
string str2 ="";           // 空文字列
string str3 = NULL;         // NULL文字列(空文字列とは異なる)

// 文字列の結合(+演算子)
string result ="Price:" + DoubleToString(1.2345, 4);
// result ="Price: 1.2345"

// 文字列の比較
if(str1 =="Hello MQL5")  Print("一致");     // ==で比較可能
if(str1 != str2)           Print("不一致");

// 日本語文字列
string jpStr ="移動平均線";
Print("文字数:", StringLen(jpStr));  // 5(Unicodeなので正確)

MQL4とMQL5の文字列の違い

項目MQL4MQL5
エンコーディングANSI(1バイト)Unicode(2バイト)
StringSplit対応対応
StringFormat対応(ビルド600+)対応(C言語のsprintfと同等)
StringReplace対応(MQL4ビルド600+)対応
StringToCharArrayANSI文字配列UTF-8またはANSI選択可
StringGetCharacter対応対応(Unicode値を返す)
StringSetCharacter対応対応
StringCompare対応対応(大小比較可能)

StringLen:文字列の長さ

int StringLen(
   string  string_value  // 対象の文字列
);
// 戻り値: 文字数(NULL文字列の場合は0)

// 使用例
string s ="USDJPY";
Print(StringLen(s));       // 6

string jp ="ドル円";
Print(StringLen(jp));      // 3(Unicodeなので正確)

// 空チェック
string comment ="";
if(StringLen(comment) == 0)
   Print("コメントは空です");

// NULLチェック
string nullStr = NULL;
if(nullStr == NULL)
   Print("NULL文字列です");  // これが出力される
Print(StringLen(nullStr));    // 0

StringFind:文字列の検索

文字列内で指定したパターンを検索し、最初に見つかった位置を返します。見つからない場合は-1を返します。

int StringFind(
   string  string_value,     // 検索対象の文字列
   string  match_substring,  // 検索する部分文字列
   int     start_pos = 0     // 検索開始位置
);
// 戻り値: 見つかった位置(0ベース)、見つからない場合 -1

// 基本使用
string comment ="MA_Cross_Buy_USDJPY";
int pos = StringFind(comment,"Buy");
if(pos >= 0)
   Print("'Buy'が位置", pos,"に見つかりました");  // 位置9

// 複数回検索(全出現位置を取得)
void FindAll(string str, string pattern)
  {
   int startPos = 0;
   int found;
   while((found = StringFind(str, pattern, startPos)) >= 0)
     {
      Print("位置", found," に発見");
      startPos = found + 1;
     }
  }

// トレードコメントの解析
bool IsMyTrade(string comment, string eaName)
  {
   return StringFind(comment, eaName) >= 0;
  }

StringSubstr:部分文字列の抽出

string StringSubstr(
   string  string_value,       // 対象の文字列
   int     start_pos,          // 開始位置(0ベース)
   int     length = -1         // 抽出する文字数(-1=最後まで)
);
// 戻り値: 抽出された部分文字列

// 基本使用
string symbol ="USDJPY_micro";
string base = StringSubstr(symbol, 0, 3);    //"USD"
string quote = StringSubstr(symbol, 3, 3);   //"JPY"
string suffix = StringSubstr(symbol, 6);     //"_micro"

// 日付文字列の解析
string dateStr ="2026.03.15 10:30:00";
string year  = StringSubstr(dateStr, 0, 4);   //"2026"
string month = StringSubstr(dateStr, 5, 2);   //"03"
string day   = StringSubstr(dateStr, 8, 2);   //"15"
string time  = StringSubstr(dateStr, 11);     //"10:30:00"

// StringFindと組み合わせて区切り文字で分割
string GetValueAfterKey(string str, string key)
  {
   int pos = StringFind(str, key);
   if(pos < 0) return"";
   return StringSubstr(str, pos + StringLen(key));
  }

// 使用例
string data ="profit=123.45";
string value = GetValueAfterKey(data,"profit=");  //"123.45"

StringReplace:文字列の置換

int StringReplace(
   string&  str,              // 対象の文字列(参照渡し・書き換えられる)
   const string  find,        // 検索する文字列
   const string  replacement  // 置換する文字列
);
// 戻り値: 置換した回数

// 基本使用
string text ="Hello World Hello MQL5";
int count = StringReplace(text,"Hello","Hi");
// text ="Hi World Hi MQL5", count = 2

// CSV用エスケープ(ダブルクォートを二重に)
string EscapeCsv(string value)
  {
   string result = value;
   StringReplace(result,""","""");
   return""" + result +""";
  }

// テンプレート文字列の置換
string FormatTradeComment(string tmpl, string symbol, double lot, double price)
  {
   string result = tmpl;
   StringReplace(result,"{SYMBOL}", symbol);
   StringReplace(result,"{LOT}", DoubleToString(lot, 2));
   StringReplace(result,"{PRICE}", DoubleToString(price, _Digits));
   return result;
  }

// 使用例
string tmpl ="EA_v1 {SYMBOL} Lot:{LOT} @{PRICE}";
string comment = FormatTradeComment(tmpl,"USDJPY", 0.1, 150.123);
//"EA_v1 USDJPY Lot:0.10 @150.123"

StringSplit:文字列の分割

文字列を指定した区切り文字で分割し、文字列配列に格納します。CSV解析やコマンドパースで使う関数です。

int StringSplit(
   const string  string_value,   // 分割する文字列
   const ushort  separator,      // 区切り文字(Unicode値)
   string&       result[]        // 結果配列
);
// 戻り値: 分割された要素数

// 基本使用(カンマ区切り)
string csv ="USDJPY,150.123,0.10,Buy";
string parts[];
int count = StringSplit(csv, ',', parts);
// parts[0]="USDJPY", parts[1]="150.123", parts[2]="0.10", parts[3]="Buy"

// セミコロン区切り
string config ="period=20;method=EMA;price=close";
string items[];
StringSplit(config, ';', items);

// 各項目をさらにキー=値に分割
for(int i = 0; i < ArraySize(items); i++)
  {
   string kv[];
   StringSplit(items[i], '=', kv);
   if(ArraySize(kv) == 2)
      Print("Key=", kv[0]," Value=", kv[1]);
  }

// 区切り文字にStringGetCharacterを使う場合
ushort tab = StringGetCharacter("t", 0);   // タブ文字
ushort pipe = StringGetCharacter("|", 0);   // パイプ文字
string data ="col1tcol2tcol3";
StringSplit(data, tab, parts);              // タブ区切り
重要

StringSplit()の第2引数はchar型ではなくushort型です。文字リテラルを直接渡す(',')か、StringGetCharacter()で変換してください。文字列を渡すとコンパイルエラーになります。

StringFormat:書式付き文字列生成

C言語のsprintf()と同等の書式指定文字列です。ログ出力やコメント生成に便利です。

string StringFormat(
   string  format,  // 書式文字列
   ...              // 引数(可変長)
);

// 書式指定子
// %s = 文字列
// %d = 整数
// %f = 浮動小数点
// %.Nf = 小数点以下N桁
// %e = 指数表記
// %% = %文字そのもの

// 基本使用
string msg = StringFormat("Symbol=%s Price=%.5f Lot=%.2f", _Symbol, 1.23456, 0.10);
//"Symbol=USDJPY Price=1.23456 Lot=0.10"

// 整数のゼロ埋め
string orderNum = StringFormat("EA_%04d", 42);  //"EA_0042"

// パーセント表示
string pct = StringFormat("勝率: %.1f%%", 65.5);  //"勝率: 65.5%"

// 複数行ログ
string log = StringFormat("=== Trade Report ===n""Symbol: %sn""Direction: %sn""Entry: %.5fn""SL: %.5fn""TP: %.5fn""Lot: %.2f",
   _Symbol,"BUY", 1.12345, 1.12000, 1.13000, 0.10
);
Print(log);

StringFormat()はMQL4でもビルド600以降で利用可能です。複雑なログ出力にはPrintFormat()(StringFormatの結果を直接出力)も便利です。

StringConcatenate:高速文字列結合

int StringConcatenate(
   string&  string_var,  // 結合先(参照渡し)
   ...                   // 結合する値(可変長・型混在OK)
);
// 戻り値: 結合後の文字列長

// +演算子より高速(特に大量結合時)
string result;
StringConcatenate(result,"Price=", 1.23456," Time=", TimeCurrent());

// ループでの文字列構築(+演算子よりStringConcatenateが高速)
string report ="";
for(int i = 0; i < PositionsTotal(); i++)
  {
   ulong ticket = PositionGetTicket(i);
   if(ticket == 0) continue;

   string line;
   StringConcatenate(line,
      PositionGetString(POSITION_SYMBOL),"",
      PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY ?"Buy" :"Sell","",
      DoubleToString(PositionGetDouble(POSITION_VOLUME), 2)," lots",
      DoubleToString(PositionGetDouble(POSITION_PROFIT), 2)," JPYn"
   );
   report += line;
  }
Print(report);

StringConcatenate()は型変換を自動で行います。int、double、datetime、boolなどを直接渡せるため、IntegerToString()などの変換関数を個別に呼ぶ必要がありません。ただし精度の指定はできないため、小数点以下の桁数を制御したい場合はDoubleToString()を使ってください。

StringTrimLeft / StringTrimRight:空白の除去

int StringTrimLeft(string&  string_var);   // 左側の空白を除去
int StringTrimRight(string&  string_var);  // 右側の空白を除去
// 戻り値: 処理後の文字列長

// 両側の空白を除去
string Trim(string str)
  {
   StringTrimLeft(str);
   StringTrimRight(str);
   return str;
  }

// CSVパース時に使用
string csv ="  USDJPY , 150.123 , 0.10";
string parts[];
StringSplit(csv, ',', parts);
for(int i = 0; i < ArraySize(parts); i++)
  {
   StringTrimLeft(parts[i]);
   StringTrimRight(parts[i]);
   Print(i,": [", parts[i],"]");
  }
// 0: [USDJPY]  1: [150.123]  2: [0.10]

StringToLower / StringToUpper:大文字・小文字変換

bool StringToLower(string&  string_var);  // 小文字に変換
bool StringToUpper(string&  string_var);  // 大文字に変換
// 戻り値: 成功でtrue

// 大文字小文字を無視した比較
bool EqualsIgnoreCase(string a, string b)
  {
   string lowerA = a, lowerB = b;
   StringToLower(lowerA);
   StringToLower(lowerB);
   return lowerA == lowerB;
  }

// シンボル名の正規化
string NormalizeSymbol(string symbol)
  {
   string upper = symbol;
   StringToUpper(upper);
   // サフィックスを除去(例:"usdjpy.m" →"USDJPY")
   int dotPos = StringFind(upper,".");
   if(dotPos > 0)
      upper = StringSubstr(upper, 0, dotPos);
   return upper;
  }

StringCompare:文字列の大小比較

int StringCompare(
   const string&  string1,           // 文字列1
   const string&  string2,           // 文字列2
   bool           case_sensitive = true  // 大文字小文字を区別
);
// 戻り値: 0=等しい、<0=string1が小さい、>0=string1が大きい

// 大文字小文字を無視して比較
if(StringCompare("usdjpy","USDJPY", false) == 0)
   Print("同じシンボルです");

// ソートでの使用(シンボル名の辞書順ソート)
void SortSymbols(string &symbols[])
  {
   int size = ArraySize(symbols);
   for(int i = 0; i < size - 1; i++)
     {
      for(int j = i + 1; j < size; j++)
        {
         if(StringCompare(symbols[i], symbols[j]) > 0)
           {
            string temp = symbols[i];
            symbols[i] = symbols[j];
            symbols[j] = temp;
           }
        }
     }
  }

StringGetCharacter / StringSetCharacter:文字単位の操作

ushort StringGetCharacter(
   string  string_value,  // 対象文字列
   int     pos            // 位置
);
// 戻り値: 指定位置のUnicode文字コード

bool StringSetCharacter(
   string&  string_var,   // 対象文字列(参照渡し)
   int      pos,          // 位置
   ushort   character     // 設定する文字コード
);

// 文字コードの確認
string s ="ABC";
ushort ch = StringGetCharacter(s, 0);  // 65 ('A')
Print("文字コード:", ch);

// 文字の置換
StringSetCharacter(s, 0, 'X');  // s ="XBC"

// 文字列の末尾に文字を追加(StringSetCharacterの特殊用法)
string str ="Hello";
StringSetCharacter(str, StringLen(str), '!');  // str ="Hello!"

// 特定の文字をカウント
int CountChar(string str, ushort ch)
  {
   int count = 0;
   for(int i = 0; i < StringLen(str); i++)
     {
      if(StringGetCharacter(str, i) == ch)
         count++;
     }
   return count;
  }

// 使用例: CSVのカラム数を推定
string csvLine ="a,b,c,d,e";
int columns = CountChar(csvLine, ',') + 1;  // 5

StringInit:文字列の初期化

bool StringInit(
   string&  string_var,      // 対象文字列
   int      new_len = 0,     // 新しい長さ
   ushort   character = 0    // 埋める文字
);

// 使用例: 固定長文字列の生成
string separator;
StringInit(separator, 50, '-');  //"──────────..." (50文字のハイフン)

// 使用例: 文字列バッファの確保
string buffer;
StringInit(buffer, 1024, ' ');   // 1024文字のスペース

// 使用例: ゼロクリア
string data ="some data";
StringInit(data);  // 空文字列に初期化

StringBufferLen:バッファサイズの取得

int StringBufferLen(
   string  string_value  // 対象文字列
);
// 戻り値: 内部バッファのサイズ(StringLenとは異なる場合がある)

// StringLen vs StringBufferLen
string s ="Hello";
Print("StringLen:", StringLen(s));           // 5
Print("StringBufferLen:", StringBufferLen(s)); // 16(内部バッファは余裕を持って確保)

// StringInitでバッファを事前確保した場合
string buf;
StringInit(buf, 1000);
Print("Len:", StringLen(buf));        // 0(実際の文字列は空)
Print("Buffer:", StringBufferLen(buf)); // 1000以上(確保済み)

StringToCharArray / CharArrayToString:文字列と配列の変換

文字列をuchar型の文字配列に変換、またはその逆を行います。ファイル操作やWebRequest()でのデータ送受信に使用します。

int StringToCharArray(
   string  text_string,      // 変換する文字列
   uchar&  array[],          // 出力配列
   int     start = 0,        // 開始位置
   int     count = -1,       // 文字数(-1=全部)
   uint    codepage = CP_ACP // コードページ(CP_UTF8推奨)
);

string CharArrayToString(
   uchar   array[],          // 入力配列
   int     start = 0,        // 開始位置
   int     count = -1,       // 文字数
   uint    codepage = CP_ACP // コードページ
);

// WebRequest用のデータ変換
string jsonBody ="{"symbol":"USDJPY","action":"buy"}";
uchar postData[];
StringToCharArray(jsonBody, postData, 0, WHOLE_ARRAY, CP_UTF8);

// WebRequestの応答を文字列に変換
uchar responseData[];
string headers;
int result = WebRequest("GET","https://api.example.com/data",
                        NULL, 5000, postData, responseData, headers);
string response = CharArrayToString(responseData, 0, WHOLE_ARRAY, CP_UTF8);
Print("Response:", response);

// バイナリデータのHEXダンプ
string HexDump(uchar &data[], int count)
  {
   string result ="";
   for(int i = 0; i < MathMin(count, ArraySize(data)); i++)
     {
      result += StringFormat("%02X", data[i]);
      if((i + 1) % 16 == 0) result +="n";
     }
   return result;
  }
重要

StringToCharArray()CP_ACP(デフォルト)を使うと、日本語環境ではShift-JISに変換されます。JSON/XMLの送受信や日本語を含むデータを扱う場合は必ずCP_UTF8を指定してください。

実践パターン:EA開発での文字列活用

パターン1:高機能ログフォーマッター

enum ENUM_LOG_LEVEL { LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR };

input ENUM_LOG_LEVEL LogLevel = LOG_INFO;
input bool           LogToFile = false;

string LogLevelToString(ENUM_LOG_LEVEL level)
  {
   switch(level)
     {
      case LOG_DEBUG: return"DEBUG";
      case LOG_INFO:  return"INFO";
      case LOG_WARN:  return"WARN";
      case LOG_ERROR: return"ERROR";
      default:        return"?????";
     }
  }

void Log(ENUM_LOG_LEVEL level, string message)
  {
   if(level < LogLevel) return;

   MqlDateTime dt;
   TimeCurrent(dt);
   string timestamp = StringFormat("%04d.%02d.%02d %02d:%02d:%02d",
                                   dt.year, dt.mon, dt.day,
                                   dt.hour, dt.min, dt.sec);

   string logLine = StringFormat("[%s] [%s] [%s] %s",
                                  timestamp,
                                  LogLevelToString(level),
                                  _Symbol,
                                  message);
   Print(logLine);

   if(LogToFile)
     {
      int handle = FileOpen("EA_Log.txt", FILE_WRITE | FILE_READ | FILE_TXT | FILE_SHARE_READ);
      if(handle != INVALID_HANDLE)
        {
         FileSeek(handle, 0, SEEK_END);
         FileWriteString(handle, logLine +"n");
         FileClose(handle);
        }
     }
  }

// 使用例
void OnTick()
  {
   Log(LOG_DEBUG, StringFormat("Bid=%.5f Ask=%.5f Spread=%d",
       SymbolInfoDouble(_Symbol, SYMBOL_BID),
       SymbolInfoDouble(_Symbol, SYMBOL_ASK),
       (int)SymbolInfoInteger(_Symbol, SYMBOL_SPREAD)));

   Log(LOG_INFO, StringFormat("新規注文: Buy %.2f lots @ %.5f", 0.10, 1.12345));
   Log(LOG_ERROR, StringFormat("注文失敗: error=%d (%s)", GetLastError(),"OrderSend failed"));
  }

パターン2:CSV読み書きヘルパー

// CSVの1行を解析して各フィールドを取得
bool ParseCsvLine(string line, string &fields[], int expectedCount = 0)
  {
   int count = StringSplit(line, ',', fields);
   if(count <= 0) return false;

   // 各フィールドの前後の空白を除去
   for(int i = 0; i < count; i++)
     {
      StringTrimLeft(fields[i]);
      StringTrimRight(fields[i]);
      // ダブルクォート除去
      if(StringLen(fields[i]) >= 2
         && StringGetCharacter(fields[i], 0) == '"'
         && StringGetCharacter(fields[i], StringLen(fields[i])-1) == '"')
        {
         fields[i] = StringSubstr(fields[i], 1, StringLen(fields[i]) - 2);
        }
     }

   if(expectedCount > 0 && count != expectedCount)
     {
      Print("CSV列数不一致: 期待=", expectedCount," 実際=", count);
      return false;
     }
   return true;
  }

// CSVの1行を生成
string BuildCsvLine(string &fields[])
  {
   string result ="";
   for(int i = 0; i < ArraySize(fields); i++)
     {
      if(i > 0) result +=",";
      // カンマやダブルクォートを含む場合はエスケープ
      if(StringFind(fields[i],",") >= 0 || StringFind(fields[i],""") >= 0)
        {
         string escaped = fields[i];
         StringReplace(escaped,""","""");
         result +=""" + escaped +""";
        }
      else
         result += fields[i];
     }
   return result;
  }

パターン3:トレードコメントの生成と解析

// トレードコメントの生成(構造化データの埋め込み)
string BuildTradeComment(string eaName, string logic, int signalId)
  {
   // 形式:"EA名|ロジック名|シグナルID|エントリー時刻"
   return StringFormat("%s|%s|%d|%s",
                       eaName, logic, signalId,
                       TimeToString(TimeCurrent(), TIME_DATE | TIME_MINUTES));
  }

// トレードコメントの解析
struct TradeInfo
  {
   string eaName;
   string logic;
   int    signalId;
   string entryTime;
  };

bool ParseTradeComment(string comment, TradeInfo &info)
  {
   string parts[];
   int count = StringSplit(comment, '|', parts);
   if(count < 4) return false;

   info.eaName    = parts[0];
   info.logic     = parts[1];
   info.signalId  = (int)StringToInteger(parts[2]);
   info.entryTime = parts[3];
   return true;
  }

// 使用例
void OnTick()
  {
   // エントリー時
   string comment = BuildTradeComment("MyEA_v2","GoldenCross", 42);
   // comment ="MyEA_v2|GoldenCross|42|2026.03.15 10:30"

   // ポジション分析時
   for(int i = 0; i < PositionsTotal(); i++)
     {
      ulong ticket = PositionGetTicket(i);
      string posComment = PositionGetString(POSITION_COMMENT);
      TradeInfo info;
      if(ParseTradeComment(posComment, info))
        {
         PrintFormat("EA=%s Logic=%s Signal=%d Entry=%s",
                     info.eaName, info.logic, info.signalId, info.entryTime);
        }
     }
  }

パターン4:チャートコメントの整形表示

input int MagicNumber = 12345;  // マジックナンバー

// チャート左上に整形された情報を表示
void UpdateChartComment()
  {
   string sep;
   StringInit(sep, 40, '-');

   string comment ="";
   comment +="=== MyEA v2.0 ===n";
   comment += sep +"n";
   comment += StringFormat("Symbol:    %sn", _Symbol);
   comment += StringFormat("Timeframe: %sn", EnumToString(Period()));
   comment += StringFormat("Spread:    %d ptn",
                           (int)SymbolInfoInteger(_Symbol, SYMBOL_SPREAD));
   comment += StringFormat("Bid:       %.5fn",
                           SymbolInfoDouble(_Symbol, SYMBOL_BID));
   comment += StringFormat("Ask:       %.5fn",
                           SymbolInfoDouble(_Symbol, SYMBOL_ASK));
   comment += sep +"n";

   // ポジション情報
   double totalProfit = 0;
   int posCount = 0;
   for(int i = 0; i < PositionsTotal(); i++)
     {
      ulong ticket = PositionGetTicket(i);
      if(PositionGetInteger(POSITION_MAGIC) == MagicNumber)
        {
         posCount++;
         totalProfit += PositionGetDouble(POSITION_PROFIT)
                      + PositionGetDouble(POSITION_SWAP);
        }
     }
   comment += StringFormat("Positions: %dn", posCount);
   comment += StringFormat("P/L:       %.2f %sn",
                           totalProfit,
                           AccountInfoString(ACCOUNT_CURRENCY));
   comment += sep +"n";
   comment += StringFormat("Updated:   %s",
                           TimeToString(TimeCurrent(), TIME_SECONDS));

   Comment(comment);
  }

文字列関数一覧リファレンス

関数機能MQL4MQL5
StringLen文字列の長さ対応対応
StringFind部分文字列の検索対応対応
StringSubstr部分文字列の抽出対応対応
StringReplace文字列の置換対応(ビルド600+)対応
StringSplit文字列の分割対応対応
StringFormat書式付き文字列生成対応(600+)対応
StringConcatenate高速文字列結合対応対応
StringTrimLeft/Right空白除去対応対応
StringToLower/Upper大文字・小文字変換対応対応
StringCompare文字列比較(大小)対応対応
StringGetCharacter文字コード取得対応対応
StringSetCharacter文字の設定対応対応
StringInit文字列初期化対応対応
StringBufferLenバッファサイズ取得対応対応
StringToCharArray文字列→文字配列対応(ANSI)対応(Unicode)
CharArrayToString文字配列→文字列対応対応
  • StringFormatはログ出力の品質を大幅に向上させる必須テクニック
  • StringSplitでCSVやコマンド文字列を効率的に解析
  • StringReplaceでテンプレート文字列による柔軟なコメント生成
  • StringToCharArrayはWebRequest()とのデータ連携に必須(CP_UTF8指定を忘れずに)
  • 構造化されたトレードコメントでポジション管理の精度を高める

プロが開発したEAをお探しの方は → シストレ.COM EA一覧

まとめ

MQL5 文字列関数はMQL4の関数を継承しつつ、StringSplit()やStringReplace()が追加されて実用性が大幅に向上しました。StringFormat()を使えばログやアラートメッセージを整形して出力できます。実際に試したところ、StringFormat()によるデバッグログ出力はOnTick()内の不具合特定に有効でした。文字列操作は実行コストが高いので、OnTick()内での多用は避け、必要な部分だけ更新する設計にしましょう。

EA本番運用では損失リスクが伴います。十分なバックテストとフォワードテストを経てから本番口座で稼働させてください。EA運用による損失はトレーダー自身の責任となります。

よくある質問

MQL5の文字列関数の特徴は?

MQL4の関数に加え、StringSplit()による文字列分割、StringReplace()による置換、StringTrimLeft()/StringTrimRight()による空白除去が標準搭載されています。StringToCharArray()/CharArrayToString()でバイト配列との相互変換も可能です。

StringSplit()の使い方は?

StringSplit(text, separator, result_array)でデリミタで分割し、結果を配列に格納します。戻り値は分割後の要素数です。CSVデータの解析や設定ファイルの読み込みに便利です。

StringFormat()の使い方は?

StringFormat("%.2f pips, Lot: %.2f",pips,lots)のようにC言語形式でフォーマットします。ログ出力やアラートメッセージの整形に使います。PrintFormat()と組み合わせてデバッグログを構造化できます。

StringReplace()の使い方は?

StringReplace(str, find, replace)で文字列内の置換を行います。戻り値は置換された回数です。テンプレートテキストの変数展開や、特定文字列の一括削除(replaceに空文字指定)に使えます。

MQL5で文字列を結合する方法は?

StringConcatenate()関数または+演算子で結合できます。大量の結合にはStringConcatenate()の方が高速です。StringFormat()でフォーマットしながらの結合も便利で、ログメッセージの構築に向いています。

文字列の検索と部分文字列の取得方法は?

StringFind(str, find, from)で検索位置を取得(未発見は-1)、StringSubstr(str, start, length)で部分文字列を抽出します。StringLen()で文字列長、StringToLower()/StringToUpper()で大文字小文字変換も可能です。

MQL5リファレンス 関連記事

シストレ.COM編集部|200種類以上のEAをフォワード計測する運営3年の検証メディア。MetaTrader (MT4/MT5) を実運用してきた編集部が監修・執筆しています。

⚠ リスクに関する注意事項

本記事は情報提供を目的としており、特定の金融商品の売買を推奨するものではありません。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)での実運用経験を持つスタッフが担当。

目次