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_HEADER、ARRAYPRINT_INDEX、ARRAYPRINT_LIMIT、ARRAYPRINT_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関数を使う際の注意点
- 大きな配列を出力するとエキスパートログに大量のデータが出力され、確認が困難になる場合があります。
- 構造体における配列のフィールドとは、構造体内の個々のメンバ変数のことです。例えば、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
と\t
はPrintFormat関数で使用される特殊文字です。\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関数では、以下のフォーマット指定子が使用されています。
%d
: 整数(ここでは、インデックスi)%s
: 文字列(ここでは、TimeToString関数で変換された日時)%G
: 浮動小数点数(ここでは、open、high、low、close、tick_volume、spread)%I64d
: 64ビット整数(ここでは、real_volume)
※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を”年月日 時:分:秒”形式で変換しています。この形式により、エキスパートログに出力された日時が見やすくなります。
コメント