【MQL5】ArrayPrint関数について

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

ArrayPrint関数の働き・役割

ArrayPrint関数は、配列の内容を操作ログに出力するための関数です。
ArrayPrint関数は、配列の状態を視覚的に確認するために使用され、特にデバッグ時に役立ちます。単純型または単純な構造体配列を出力できます。

ArrayPrint関数の引数について

ArrayPrint関数は、次のような複数の引数を取ります。

void ArrayPrint(
   const void& array[],       // 出力された配列
   uint digits=_Digits,       // 小数点以下の桁数
   const string separator=NULL,  // 構造体フィールド値のセパレーター(区切り文字)
   ulong start=0,             // 最初に出力された要素のインデックス
   ulong count=WHOLE_ARRAY,   // 出力された要素の数
   ulong flags=ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_LIMIT|ARRAYPRINT_ALIGN  // 出力モードを設定するフラグの組み合わせ
);

第1引数: array[]
種類: 任意の型の配列
説明: 出力対象の配列を指定します。

第2引数: digits
種類: uint型
説明: 実数型の小数点以下の桁数を指定します。初期値_Digits (現在の取引銘柄が規定している価格の小数点以下桁数)です。

第3引数: separator
種類: string型
説明: 構造体フィールド値(各メンバ変数)のセパレーター(区切り文字)を指定します。初期値は NULL で、スペースが区切り文字として使用されます。

第4引数: start
種類: ulong型
説明: 最初に出力する配列における要素インデックスを指定します。初期値は 0 です。

第5引数: count
種類: ulong型
説明: 出力する配列における要素の数を指定します。初期値配列全体です (WHOLE_ARRAY

第6引数: flags
種類: ulong型
説明: 出力モードを設定するフラグの組み合わせです。初期値ARRAYPRINT_HEADERARRAYPRINT_INDEXARRAYPRINT_LIMITARRAYPRINT_ALIGN です。

第6引数の各フラグについて

ARRAYPRINT_HEADER

構造体における配列の各フィールド名(メンバ変数名)をヘッダーとして出力します。
例えば、MqlRates構造体の場合、ヘッダーには「time」「open」「high」「low」「close」「tick_volume」「spread」「real_volume」などが表示されます。

ARRAYPRINT_INDEX

配列における要素の左側にそのインデックスを表示します。配列のどの要素がどのインデックスに対応しているかを確認できます。

ARRAYPRINT_LIMIT

配列が大きい場合に最初の100要素と最後の100要素のみを出力します。大量のデータを扱う際に、全体を出力せずに要点だけを確認するのに役立ちます。

ARRAYPRINT_ALIGN

出力された値の位置合わせを行います。具体的には、数値データは右揃え、文字列データは左揃えで表示されます。これにより、エキスパートログでの表示が整然となり、見やすくなります。

ARRAYPRINT_DATE

dateTime型のデータが “yyyy.dd.mm” 形式で表示されます。

ARRAYPRINT_MINUTES

dateTime型のデータが “HH” 形式で表示されます。例えば、午後3時45分の場合は “15:45” となります。

ARRAYPRINT_SECONDS

dateTime型のデータが “HH:MM” 形式で表示されます。例えば、午後3時45分30秒の場合は “15:45:30” となります。

ArrayPrint関数の戻り値について

配列の内容を操作ログに出力するだけのため、ArrayPrint関数戻り値を持ちません。

ArrayPrint関数を使う際の注意点

  1. 大きな配列を出力するとエキスパートログに大量のデータが出力され、確認が困難になる場合があります。
  2. 構造体における配列のフィールドとは、構造体内の個々のメンバ変数のことです。例えば、MqlRates構造体では、time、open、highなどがフィールドです。構造体の各フィールドを出力する際には、特定のフィールドを個別に指定して出力する必要があります。

ArrayPrint関数を使ったサンプルコード

以下はArrayPrint関数を使用したサンプルコードです。この例では、最後の10バーの価格データをエキスパートログに出力します。

// OnStart関数はスクリプトの実行が開始されたときに自動的に呼び出されます
void OnStart()
  {
   // MqlRates構造体の配列を定義し、初期化します
   MqlRates rates[];
   
   // 過去10本のバーのデータをコピーします
   if(CopyRates(_Symbol,_Period,1,10,rates))
     {
      // 配列の内容をエキスパートログに出力します
      ArrayPrint(rates);
      Print("確認\n[time]\t[open]\t[high]\t[low]\t[close]\t[tick_volume]\t[spread]\t[real_volume]");
      for(int i=0; i<10; i++)
        {
         PrintFormat("[%d]\t%s\t%G\t%G\t%G\t%G\t%G\t%G\t%I64d\t", i,
                     TimeToString(rates[i].time, TIME_DATE|TIME_MINUTES|TIME_SECONDS),
                     rates[i].open, rates[i].high, rates[i].low, rates[i].close,
                     rates[i].tick_volume, rates[i].spread, rates[i].real_volume);
        }
     }
   else
      PrintFormat("CopyRates failed, error code=%d", GetLastError());
  }


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

OnStart関数

OnStart関数は、スクリプトが実行されるときに自動的に呼び出される関数です。スクリプトの開始点となります。

MqlRates構造体

MqlRates構造体は、バーの価格データを格納する構造体です。time、open、high、low、close、tick_volume、spread、real_volumeのフィールドがあります。

CopyRates関数

CopyRates関数は、指定したシンボルと時間枠の価格データを配列にコピーします。

PrintFormat関数

PrintFormat関数は、フォーマットされた文字列をエキスパートログに出力します。様々なデータ型を指定したフォーマットで表示できます。

\nと\t

\n\tPrintFormat関数で使用される特殊文字です。
\nは改行を意味し、エキスパートログに出力する際に新しい行に移ります。
\tはタブを意味し、文字列内にタブスペースを挿入します。これにより、出力を整形しやすくなります。

フォーマット指定子 %G と %I64d

%Gは浮動小数点数の表示に使用されます。
科学記法または固定小数点形式で、より短い方の形式で表示されます。

%fも浮動小数点数の表示に使用されるフォーマット指定子ですが、その表示形式に違いがあります。

%G: 科学記法または固定小数点形式のうち、より短い方を自動的に選択して表示します。例えば、小数部分が少ない場合は固定小数点形式、非常に大きな数や非常に小さな数の場合は科学記法で表示されます。

%f: 常に固定小数点形式で表示します。小数点以下の桁数を指定することができ、通常はより見慣れた形式で数値を表示します。

%I64dは64ビット整数を表示するためのフォーマット指定子です。大きな整数値を扱う際に使用されます。

for文の中の記述について解説

for(int i=0; i<10; i++)
  {
   PrintFormat("[%d]\t%s\t%G\t%G\t%G\t%G\t%G\t%G\t%I64d\t", i,
               TimeToString(rates[i].time, TIME_DATE|TIME_MINUTES|TIME_SECONDS),
               rates[i].open, rates[i].high, rates[i].low, rates[i].close,
               rates[i].tick_volume, rates[i].spread, rates[i].real_volume);
  }

ループ処理の目的

このfor文は、配列ratesの各要素をエキスパートログに出力するために使用されます。0から9までのインデックスでループを回し、各バーの価格データを出力します。

PrintFormat関数のフォーマット指定子

PrintFormat関数では、以下のフォーマット指定子が使用されています。

※64ビット(=8バイト)整数とは、64ビットのデータ幅で表現される整数型のことです。MQL5データ型でいうと、long型ulong型にあたります。
64ビットのデータ幅は、非常に大きな整数値を扱うことができます。
例えば、符号付きの64ビット整数は -9,223,372,036,854,775,808 から 9,223,372,036,854,775,807 までの範囲の値を表現できます。これは、通常の32ビット整数(-2,147,483,648 から 2,147,483,647 まで)よりもはるかに大きな範囲をカバーします。

これらのフォーマット指定子は、それぞれのデータ型に対応する形式で値を表示します。

TimeToString関数

TimeToString関数は、dateTime型の値を文字列に変換します。ここでは、rates[i].timeを”年月日 時:分:秒”形式で変換しています。この形式により、エキスパートログに出力された日時が見やすくなります。

コメント

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