【MQL5】PrintFormat関数について

MQL5リファレンス
スポンサーリンク
スポンサーリンク

PrintFormat関数の働き・役割

PrintFormat関数は、指定されたフォーマットに従って文字列や数値を整形し、エキスパートログに出力するために使用されます。

フォーマット指定子を使って、出力するデータの形式を詳細に制御できます。

フォーマット指定子についてはこの後説明しますので、今はわからなくても大丈夫です。

PrintFormat関数の引数について

void PrintFormat(
   const string format_string,   // フォーマット文字列
   ...                          // フォーマット文字列に対応するパラメータ
);

フォーマット指定子とは?

フォーマット指定子とは、データをどのように表示するかを決める特別な記号です。

PrintFormat関数では、フォーマット指定子を使って出力形式を指定します。

フォーマット指定子は、以下の形式で記述されます。

%[フラグ][幅][.精度][サイズ]型

%(パーセント記号)

%フォーマット指定子の開始を示します。

例えば、%dは整数を表示するためのフォーマット指定子です。

フラグ

[フラグ]は、出力形式に対する追加のオプションを指定します。

以下は一般的なフラグの説明です:

  • -:左寄せを指定します。例えば、%-10s文字列を左寄せで表示し、右にスペースを追加します。
  • +:符号付き表示を指定します。プラスの値には+を、マイナスの値には-を表示します。例えば、%+dは常に符号を表示します。
  • 0:ゼロ埋めを指定します。指定された幅に達するまで、値の前にゼロを追加します。例えば、%04dは4桁の整数をゼロ埋めで表示します。
    例:「0042」
  • space (スペース)
    符号が正の値である場合、出力値の前にスペースが示されています。デフォルト動作ではスペースは挿入されません。

[幅]は、出力フィールドの最小幅を指定します。

例えば、%10s文字列を少なくとも10文字の幅で表示します。幅が足りない場合は左にスペースを追加します。

精度

[.精度]は、小数点以下の桁数や文字列の最大長を指定します。

例えば、%.2fは浮動小数点数を小数点以下2桁まで表示します。また、%.3s文字列の先頭3文字のみを表示します。

サイズ

[サイズ]は、データのサイズを指定します。

例えば、短整数(Short)や長整数(long)などです。一般的には以下のような指定があります:

は出力するデータ型を指定します。以下は一般的なデータ型の例です:

  • dまたはi:整数を表示します。
  • f:浮動小数点数を表示します。
  • s文字列を表示します。

フォーマット指定子を使った具体例

以下は、PrintFormat関数を使ってさまざまなデータをフォーマットする例です。

%s:文字列を表示する

この指定子は文字列をそのまま出力するために使います。例えば、名前やメッセージなどを表示する場合に使用します。

例:

string name = "Alice";
PrintFormat("名前: %s", name);

結果:

名前: Alice

%d:整数を表示する

この指定子は整数を表示するために使います。例えば、カウントやIDなどの整数値を表示する場合に使用します。

例:

int count = 5;
PrintFormat("カウント: %d", count);

第1引数の%dの所に、変数count、つまり5が表示されます。

結果:

カウント: 5

%f:浮動小数点数を表示する

この指定子は浮動小数点数(小数点がある数)を表示するために使います。デフォルトでは小数点以下6桁まで表示されます。

例:

double value = 3.14159;
PrintFormat("値: %f", value);

第1引数の%fの所に、変数value、つまり3.14159が表示されます。

結果:

値: 3.141590

%+.2f:符号付きで小数点以下2桁までの浮動小数点数を表示する

この指定子は浮動小数点数を符号付きで表示し、小数点以下2桁まで表示します。プラスまたはマイナスの符号が常に表示されます。

例:

double profit = 3.14;
PrintFormat("利益: %+ .2f", profit);

別の例:

double loss = -2.5;
PrintFormat("損失: %+ .2f", loss);

第1引数の%+.2fの所に、変数loss、つまり-2.50が表示されます。

結果:

損失: -2.50

%-10s:幅10のフィールドに左揃えで文字列を表示する

この指定子は幅10のフィールドに文字列を左揃えで表示します。右側には必要に応じてスペースが追加されます。

例:

string title = "Hello";
PrintFormat("タイトル: %-10s 終了", title);

第1引数の%-10sの所に、変数title、つまり”Hello”が表示されます。

結果:

タイトル: Hello      終了

このように、PrintFormat関数フォーマット指定子を使うことで、データを整形して見やすく出力することができます。各指定子は表示形式を細かく制御するために便利です。

PrintFormat関数の使用例

以下は、PrintFormat関数を使ったサンプルコードです。

void OnStart()
{
    // 変数の宣言
    string server = AccountInfoString(ACCOUNT_SERVER);  // サーバー名
    int login = (int)AccountInfoInteger(ACCOUNT_LOGIN);  // アカウント番号
    long leverage = AccountInfoInteger(ACCOUNT_LEVERAGE);  // レバレッジ
    double equity = AccountInfoDouble(ACCOUNT_EQUITY);  // 証拠金
    double profit = AccountInfoDouble(ACCOUNT_PROFIT);  // 利益
    double point_value = SymbolInfoDouble(_Symbol, SYMBOL_POINT);  // ポイント値
    int spread = (int)SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);  // スプレッド

    // PrintFormat関数を使用して情報を出力
    PrintFormat("%s %d: レバレッジ = 1:%I64d", server, login, leverage);
    PrintFormat("%s %d: 証拠金 = %.2f %s", server, login, equity, AccountInfoString(ACCOUNT_CURRENCY));
    PrintFormat("%s %d: オープンポジションの現在の結果 = %+.2f %s", server, login, profit, AccountInfoString(ACCOUNT_CURRENCY));
    PrintFormat("%s: ポイント値 = %.5f", _Symbol, point_value);
    PrintFormat("%s: 現在のスプレッド = %d ポイント", _Symbol, spread);
}

このコードでは、次の情報をエキスパートログに出力します:

  • サーバー名とアカウント番号に続いてレバレッジ
  • アカウントの証拠金(口座残高)
  • 開いているポジションの現在の利益または損失
  • シンボルのポイント値
  • 現在のスプレッド(売買価格の差)

フォーマット指定子の使い方に関する注意

フォーマット文字列に続く、コンマで区切られた任意の基本データ型の値パラメータの数は、フォーマットされる文字列を含めて64を超えることはできません。つまり、一度に64個以上のデータを出力しようとするとエラーが発生しますので、必要に応じてデータを分けて出力するようにしましょう。

サンプルコードに使われた関数や文法要素の簡単な解説

以下は、サンプルコードで使われたその他の関数や文法要素についての解説です:

これらの関数を組み合わせることで、取引アカウントやシンボルに関する詳細な情報を取得し、それを整形してエキスパートログに出力することができます。

StringFormat関数との違いについて

PrintFormat関数StringFormat関数も、指定された形式に従って文字列をフォーマットする点では似ていますが、重要な違いがあります。

PrintFormat関数はフォーマットされた文字列を生成し、そのままエキスパートログに出力するため、生成された文字列変数に保存することはできません。
一方、StringFormat関数はフォーマットされた文字列を返すので、その結果を変数に格納したり、他の処理に利用することが可能です。

この違いにより、特定のフォーマットで文字列を整形し、その結果を複数回使用したい場合には、StringFormat関数を使用することが適しています。エキスパートログへの即時出力が目的の場合は、PrintFormat関数が便利です。

タイトルとURLをコピーしました