ArrayFill関数の働き・役割
ArrayFill関数は、指定された値で配列を埋めるために使用されます。この関数は、基本データ型(int型やfloat型など)を要素とする配列に対して適用され、配列内の特定の範囲を指定した値で埋めます。特に、配列の一部または全体に同じ値を設定する際に便利です。
ArrayFill関数を使用することで、配列の要素を一括して初期化する作業を簡潔に行うことができ、効率的なコード記述が可能となります。
ArrayFill関数の引数について
void ArrayFill(
void& array[], // 配列
int start, // 開始インデックス
int count, // 埋める要素の数
void value // 値
);
ArrayFill関数は、以下の4つの引数を取ります。
第1引数: array
これは、埋める対象となる配列です。配列は基本データ型のいずれかで構成されている必要があります。基本データ型には、以下のものが含まれます。
- char, uchar
- short, ushort
- int, uint
- long, ulong
- bool, color
- datetime
- float, double
この配列は、関数を通じて値が変更されるため、参照渡しとして渡されます。
第2引数: start
この引数は、配列のどの位置から値を埋め始めるかを指定します。インデックスは0から始まり、このインデックス位置から指定した数の要素がvalueで埋められます。
たとえば、startに0を指定すると配列の最初の要素から値を埋めることになります。
第3引数: count
埋める要素の数を指定します。countが5の場合、startで指定した位置から連続して5つの要素が第4引数で指定した値で埋められます。
第4引数: value
この引数で、配列の要素を埋める際に使用する値を指定します。valueは、配列の要素と同じデータ型でなければなりません。たとえば、配列がint型で構成されている場合、valueもint型でなければなりません。
ArrayFill関数の戻り値について
ArrayFill関数には戻り値はありません。この関数はvoid型で定義されており、配列に値を埋める処理を行うだけです。
ArrayFill関数を使う際の注意点
ArrayFill関数を使用する際は、配列の要素へのアクセス順序に注意する必要があります。特に、ArraySetAsSeries関数を使用して配列のアクセス順序を逆(右から左)に設定した場合でも、ArrayFill関数は常に通常の順序(左から右)で配列を処理します。このため、逆順でのアクセスを期待している場合には、意図しない結果が生じる可能性があります。アクセス順序をしっかり確認してから使用することが重要です。
また、ArrayFill関数は多次元配列を1次元配列として処理します。たとえば、2次元配列であっても、内部的には1次元配列のように扱われます。具体的には、配列[2][4]のような2次元配列は、1次元配列として処理され、8個の連続した要素(配列[8])として扱われます。
この特性を理解するために、次の例を考えます。もし、ArrayFill関数が配列のインデックス5から始まり、2つの要素に対して3.14を代入する場合、これはインデックス5から始まり、2つの要素に対して3.14を代入します。配列[2][4]という2次元配列では、インデックス5は配列[1][1]に相当し、その次のインデックスは配列[1][2]です。したがって、この場合、配列[1][1]と配列[1][2]が3.14で埋められることになります。
多次元配列に対してArrayFill関数を使用する場合は、このように内部で1次元配列として扱われるため、開始インデックスや埋める要素の数を慎重に設定する必要があります。
ArrayFill関数を使ったサンプルコード
以下は、ArrayFill関数を使った簡単なサンプルコードです。このコードでは、動的配列を作成し、その配列の一部を特定の値で埋める処理を行っています。
// スクリプトの開始時に呼ばれる関数
void OnStart()
{
//--- 動的配列を宣言する
int a[];
//--- 配列のサイズを10に設定する
ArrayResize(a, 10);
//--- 最初の5要素を123で埋める
ArrayFill(a, 0, 5, 123);
//--- 次の5要素を456で埋める
ArrayFill(a, 5, 5, 456);
//--- 配列の内容をエキスパートログに出力する
for(int i = 0; i < ArraySize(a); i++)
{
printf("a[%d] = %d", i, a[i]);
}
}
このサンプルコードを実行すると、配列の最初の5つの要素は123で埋められ、次の5つの要素は456で埋められます。結果として、配列は123が5回、456が5回連続する形になります。
サンプルコードに使われた関数や文法要素の解説
OnStart関数
OnStart関数は、スクリプトが実行された際に自動的に呼び出される関数です。この関数の中で、配列を動的に作成し、ArrayFill関数を使用して配列の特定範囲に値を埋める処理が行われます。
配列の宣言
int型の配列を宣言することで、aという動的配列を作成しています。動的配列は初期サイズを持たないため、後からArrayResize関数でサイズを指定します。
ArrayResize関数
ArrayResize関数は、動的配列のサイズを変更するために使用されます。ArrayResize関数を使用することで、配列aのサイズを10に設定しています。これにより、配列aは10個の要素を持つことになります。
ArrayFill関数
ArrayFill関数は、指定した範囲の配列要素に同じ値を一括で代入するために使用されます。この例では、最初に配列の0番目から5つの要素を123で埋め、その後、6番目からの5つの要素を456で埋めています。
for文
for文を使用して、配列aの全ての要素にアクセスし、値をエキスパートログに出力しています。ArraySize関数は、配列の要素数を返すため、配列の範囲内でループ処理が行われます。
printf関数
printf関数は、エキスパートログにメッセージを出力するために使用されます。この例では、配列の各要素のインデックスとその値を出力しています。printf関数の引数として、インデックス番号iとその要素a[i]の値が表示されます。
フォーマット指定子
%dは、整数を表示するためのフォーマット指定子です。文字列の中で%dを使用すると、その場所に対応する整数値が表示されます。この形式により、a[0] = 123のように結果がエキスパートログに表示されます。
この関数を使ってEAを作る際のアイディア
ArrayFill関数は、配列を効率的に初期化したり、特定の範囲に一括で値を設定したりする際に役立ちます。例えば、以下のようなEA(:エキスパートアドバイザー)の作成に活用できます。
- 価格データの初期化
過去の価格データを特定の値で初期化する際に使用できます。たとえば、一定のルールに基づいて特定の期間の価格を一括で初期化し、そのデータを基に取引判断を行うEAを作成することができます。 - バックテストデータの操作
バックテストにおいて、特定の範囲のデータを特定の値で埋めることで、特定の相場状況をシミュレートすることが可能です。例えば、ArrayFill関数を使用して、低ボラティリティの相場をシミュレーションするために一定の値で価格を埋めることができます。 - 一括ポジション管理の初期化
EAの中で、複数のポジションデータやオーダーデータを管理する際に、初期化処理としてAArrayFill関数を使用し、全てのポジションデータを一度にクリアしたり、特定の値でリセットすることができます。
このように、ArrayFill関数は配列を簡単に操作できるため、様々なEA開発に役立てることができます。