1. MQL5のArrayInitializeとは何か
1.1 ArrayInitializeの基本概念
ArrayInitialize は、MQL5で配列(array)のすべての要素を同じ値で一括初期化するための関数です。
配列とは「同じ型のデータを複数まとめて扱うデータ構造」のことで、EA(自動売買プログラム)やインジケーターでは次のような用途で頻繁に使われます。
- 価格データの保存
- インジケーターバッファ(指標計算用の配列)
- トレード状態の管理
- 計算用ワークバッファ
MQL5では配列を宣言しただけでは、要素が意図した値で初期化されているとは限りません。
環境や配列の種類(静的配列・動的配列)によっては、未定義の値(garbage value:意味のない値)が入る可能性があります。
そのため、EAやインジケーターでは次のような処理が重要になります。
- 配列を作成する
- 初期値を設定する
- 計算処理を行う
この「初期値を設定する」処理を簡潔に行うための関数が ArrayInitialize です。
例えば次のコードでは、配列の全要素を 0 に設定します。
double buffer[10];
ArrayInitialize(buffer,0);
この処理により、buffer の中身は次のようになります。
0
0
0
0
0
0
0
0
0
0
配列のサイズが100でも1000でも、1行のコードで一括初期化できます。
ArrayInitializeを使うメリット
配列初期化をループで書くことも可能ですが、ArrayInitializeを使う方がシンプルです。
ループで初期化する例
for(int i=0;i<10;i++)
{
buffer[i]=0;
}
ArrayInitializeを使う例
ArrayInitialize(buffer,0);
このように
- コードが短い
- 可読性が高い(読みやすい)
- ミスが起きにくい
というメリットがあります。
EA・インジケーターでの典型用途
実務では次のような場面でよく使用されます。
1 インジケーターバッファ初期化
ArrayInitialize(Buffer,EMPTY_VALUE);
EMPTY_VALUE(描画しない値)を入れることで、インジケーターの表示を制御します。
2 計算バッファのリセット
計算用配列を再利用する場合、前回の値が残ると誤計算の原因になります。
ArrayInitialize(workBuffer,0);
3 状態管理配列の初期化
EAではポジション状態などを配列で管理することがあります。
ArrayInitialize(tradeState,-1);
初心者がよく誤解するポイント
① 宣言しただけで配列が初期化されると思ってしまう
例
double data[100];
この状態では 意図した値で初期化されている保証はありません。
安全なプログラムを書くためには、明示的に初期化することが推奨されます。
② 配列サイズが0のまま使う
動的配列の場合
double data[];
ArrayInitialize(data,0);
このコードは意味を持ちません。
理由は 配列サイズが0だからです。
正しい手順は次の通りです。
ArrayResize(data,100);
ArrayInitialize(data,0);
③ OnTickで毎回初期化してしまう
EA初心者によくあるミスです。
void OnTick()
{
ArrayInitialize(buffer,0);
}
これを行うと
- 計算結果が毎Tick消える
- ロジックが正常に動かない
可能性があります。
配列初期化は通常
OnInit()- 計算開始前
など適切なタイミングで行います。
ArrayInitializeはシンプルな関数ですが、EA・インジケーターの安定動作に重要な基礎機能です。
特にバッファ処理やデータ管理では頻繁に使われるため、基本動作を正確に理解しておくことが重要です。
2. ArrayInitializeの構文と使い方
2.1 ArrayInitializeの基本構文
MQL5の ArrayInitialize は、配列のすべての要素を同じ値で初期化するための関数です。
基本構文は次の通りです。
ArrayInitialize(array,value);
引数
| 引数 | 内容 |
|---|---|
| array | 初期化する配列 |
| value | 配列のすべての要素に設定する値 |
この関数を実行すると、配列の全要素が 指定した値で上書きされます。
使用例(基本)
double data[5];
ArrayInitialize(data,0);
結果
data[0] = 0
data[1] = 0
data[2] = 0
data[3] = 0
data[4] = 0
配列サイズが大きくても、1行で全要素を初期化できます。
2.2 使用できる配列型
ArrayInitializeは、MQL5の数値型配列で使用できます。
主な対象型
| 型 | 例 |
|---|---|
| int | 整数 |
| double | 小数 |
| float | 小数 |
| long | 大きな整数 |
| ushort / short | 短整数 |
例
int numbers[10];
ArrayInitialize(numbers,1);
結果
1 1 1 1 1 1 1 1 1 1
2.3 動的配列での使用方法
MQL5では 動的配列(サイズを後から変更できる配列) がよく使われます。
この場合、ArrayResize → ArrayInitialize の順で使うのが一般的です。
例
double buffer[];
ArrayResize(buffer,100);
ArrayInitialize(buffer,0);
処理の流れ
- 配列サイズを100に変更
- 全要素を0で初期化
EAやインジケーターでは、このパターンが非常に多く使われます。
2.4 インジケーターバッファの初期化
インジケーターでは、EMPTY_VALUE を使った初期化がよく行われます。
EMPTY_VALUEとは
→ チャートに表示しない値
例
ArrayInitialize(Buffer,EMPTY_VALUE);
この処理により
- 初期状態ではラインを描画しない
- 計算された部分だけ表示する
という動作になります。
インジケーター開発では非常に重要なテクニックです。
2.5 初心者がつまずきやすいポイント
① 配列サイズが0のまま実行
次のコードは意味を持ちません。
double data[];
ArrayInitialize(data,0);
理由
配列サイズが 0だから
正しい書き方
ArrayResize(data,50);
ArrayInitialize(data,0);
② 初期化したあと値を書き換えてしまう
例
ArrayInitialize(buffer,0);
buffer[0] = 5;
この場合
5
0
0
0
...
になります。
ArrayInitializeは一括設定するだけで、その後の変更は通常通り可能です。
③ OnTickで毎回実行してしまう
EA初心者がやりがちなミスです。
void OnTick()
{
ArrayInitialize(buffer,0);
}
このコードは
- 計算結果が毎Tickリセットされる
- EAロジックが壊れる
可能性があります。
一般的には
OnInit()- 計算処理の開始前
などで初期化します。
2.6 ArrayInitializeの戻り値
ArrayInitializeは戻り値として配列サイズを返します。
例
int size = ArrayInitialize(buffer,0);
size には 配列の要素数 が入ります。
ただし、実務では戻り値を使うケースは多くありません。
通常は 初期化処理として単独で使うことが多いです。
ArrayInitializeは非常にシンプルな関数ですが、EAやインジケーターのバッファ管理では頻繁に使用される重要な基本機能です。
特に 動的配列・インジケーターバッファ・計算バッファの初期化では必須の知識になります。
3. ArrayInitializeの実用コード例(EA・インジケーター)
3.1 EAでの配列初期化の基本例
EA(Expert Advisor:自動売買プログラム)では、計算用の配列を使う場面が多くあります。
例えば、価格データや計算結果を保存するバッファとして配列を利用します。
次の例は、計算用配列を0で初期化する基本パターンです。
double priceBuffer[100];
int OnInit()
{
ArrayInitialize(priceBuffer,0);
return(INIT_SUCCEEDED);
}
このコードでは
priceBufferを100要素の配列として宣言- EA起動時(
OnInit())にすべて 0 に初期化
しています。
結果として配列の状態は次のようになります。
0
0
0
0
0
...
この処理を行うことで、過去データの残りや未定義値による誤計算を防ぐことができます。
3.2 動的配列の実用例
EAでは、動的配列(dynamic array)を使うケースも多くあります。
動的配列とは、ArrayResize()でサイズを変更できる配列です。
実務では次のパターンがよく使われます。
double buffer[];
int OnInit()
{
ArrayResize(buffer,100);
ArrayInitialize(buffer,0);
return(INIT_SUCCEEDED);
}
処理の流れ
- 配列サイズを100に設定
- 全要素を0で初期化
この順番を守ることが重要です。
よくある失敗
初心者に多いミスは次のコードです。
double buffer[];
ArrayInitialize(buffer,0);
このコードは正しく動作しません。
理由
配列サイズが 0のまま だからです。
正しい手順
ArrayResize(buffer,100);
ArrayInitialize(buffer,0);
3.3 インジケーターでの使用例
インジケーターでは、描画バッファ(Indicator Buffer)を初期化するために
ArrayInitialize がよく使われます。
特に重要なのが EMPTY_VALUE を使った初期化です。
double Buffer[];
int OnInit()
{
SetIndexBuffer(0,Buffer);
ArrayInitialize(Buffer,EMPTY_VALUE);
return(INIT_SUCCEEDED);
}
EMPTY_VALUEとは
チャートに描画されない値
を意味します。
そのため
- 計算されていない部分は表示しない
- 必要な部分だけ描画する
という制御が可能になります。
インジケーターでの典型的な使い方
インジケーターでは次のような流れになります。
- バッファを設定
- バッファをEMPTY_VALUEで初期化
- 計算された部分だけ値を入れる
例
ArrayInitialize(Buffer,EMPTY_VALUE);
Buffer[i] = Close[i];
この方法により
- 未計算部分は表示されない
- 計算部分だけラインが描画される
という動作になります。
3.4 計算バッファのリセット
EAやインジケーターでは、計算用配列を再利用するケースがあります。
その場合、前回の計算結果が残ると誤動作の原因になります。
例
double calcBuffer[50];
void ResetBuffer()
{
ArrayInitialize(calcBuffer,0);
}
この関数を呼び出すことで、計算バッファをリセットできます。
3.5 OnTickで初期化してしまう失敗
EA初心者がよくやるミスです。
void OnTick()
{
ArrayInitialize(buffer,0);
}
このコードは一見問題なさそうですが、実際には大きな問題があります。
理由
- 毎Tickデータがリセットされる
- 計算結果が保存されない
- EAロジックが崩れる
そのため通常は
OnInit()- 計算開始前
などで初期化します。
3.6 実務でよく使われる初期化値
ArrayInitializeでは、用途によって初期値を使い分けます。
| 初期値 | 用途 |
|---|---|
| 0 | 計算バッファ |
| -1 | 状態管理 |
| EMPTY_VALUE | インジケーター |
| 999999 | 特殊フラグ |
例
ArrayInitialize(tradeState,-1);
この場合
-1= 未処理0= 処理済み
のように状態管理に使うことができます。
ArrayInitializeは単純な関数ですが、EA・インジケーターの安定動作に直結する基本機能です。
特に配列管理を行うプログラムでは、適切な初期化がバグ防止に大きく影響します。
4. ArrayInitializeとArrayResizeの違い
4.1 役割の違い
MQL5で配列を扱うとき、初心者が混同しやすい関数が ArrayInitialize と ArrayResize です。
この2つは似ているように見えますが、役割はまったく異なります。
| 関数 | 役割 |
|---|---|
| ArrayResize | 配列のサイズを変更する |
| ArrayInitialize | 配列の値を初期化する |
つまり
- ArrayResize → 配列の大きさを決める
- ArrayInitialize → 配列の中身を設定する
という関係になります。
4.2 ArrayResizeの基本動作
ArrayResizeは、動的配列のサイズを変更する関数です。
基本構文
ArrayResize(array,new_size);
例
double buffer[];
ArrayResize(buffer,10);
この処理を行うと、buffer は 10要素の配列になります。
buffer[0]
buffer[1]
buffer[2]
...
buffer[9]
ただし、この段階では 値は初期化されていない可能性があります。
そのため、多くの場合は ArrayInitializeとセットで使用します。
4.3 実務でよく使う基本パターン
実務では次の順番で使うのが基本です。
ArrayResize(buffer,100);
ArrayInitialize(buffer,0);
処理の意味
- 配列サイズを100に変更
- 配列の全要素を0で初期化
この順番により、安全に配列を使用できる状態になります。
4.4 よくある間違い(順序ミス)
初心者がやりがちなミスが 順番を逆にすることです。
誤った例
ArrayInitialize(buffer,0);
ArrayResize(buffer,100);
このコードの問題点
- 初期化したあとサイズ変更
- 新しく確保された領域が初期化されない
結果として
- 配列の後半に未定義値が残る
- 計算バグの原因になる
可能性があります。
4.5 ArrayResizeだけでは安全ではない理由
次のコードを見てください。
double buffer[];
ArrayResize(buffer,100);
この時点で
buffer[0] = ?
buffer[1] = ?
buffer[2] = ?
...
値が保証されていません。
そのため安全な書き方は次の通りです。
ArrayResize(buffer,100);
ArrayInitialize(buffer,0);
4.6 EA開発での典型パターン
EAでは次のようなコードがよく使われます。
double priceBuffer[];
int OnInit()
{
ArrayResize(priceBuffer,1000);
ArrayInitialize(priceBuffer,0);
return(INIT_SUCCEEDED);
}
この処理の意味
- 計算用バッファを1000要素確保
- 初期状態を0に設定
これにより
- 未定義値の混入を防ぐ
- 計算ロジックを安定させる
ことができます。
4.7 インジケーターでの典型パターン
インジケーターでも同様に使われます。
ArrayResize(Buffer,rates_total);
ArrayInitialize(Buffer,EMPTY_VALUE);
この処理の意味
- チャートデータ数に合わせて配列サイズ変更
- 描画しない部分をEMPTY_VALUEで初期化
という動作になります。
4.8 初心者がつまずくポイント
① 静的配列と動的配列を混同する
静的配列
double data[100];
動的配列
double data[];
ArrayResize(data,100);
動的配列では 必ずArrayResizeが必要です。
② ArrayResize後の初期化を忘れる
よくあるコード
ArrayResize(buffer,100);
このままだと 未定義値が残る可能性があります。
安全な書き方
ArrayResize(buffer,100);
ArrayInitialize(buffer,0);
③ 配列サイズを頻繁に変更する
配列サイズを毎Tick変更すると
- メモリ確保が頻発する
- EAパフォーマンスが低下する
可能性があります。
そのため
- 初期化時にサイズ確保
- できるだけ再利用
という設計が推奨されます。
ArrayInitializeとArrayResizeは、MQL5で配列を扱う上で必須の基本関数です。
両者の役割を理解しておくことで、EAやインジケーターの安定性が大きく向上します。
5. ArrayInitializeが使えないケースと注意点
5.1 すべての配列に使えるわけではない
ArrayInitializeは便利な関数ですが、すべての配列型に使用できるわけではありません。
基本的に使用できるのは 数値型(numeric type)の配列です。
主に使用できる型
| 型 | 説明 |
|---|---|
| int | 整数 |
| double | 小数(最もよく使う) |
| float | 小数 |
| long | 大きな整数 |
| short | 短整数 |
例
double buffer[10];
ArrayInitialize(buffer,0);
このコードは問題なく動作します。
5.2 string配列では使用できない
初心者がよく遭遇するのが string配列の初期化です。
string型では ArrayInitializeは使用できません。
例
string names[10];
ArrayInitialize(names,"");
このコードはコンパイルエラーになります。
理由
ArrayInitializeは 数値配列専用の関数だからです。
string配列の正しい初期化方法
string配列は forループで初期化します。
string names[10];
for(int i=0;i<10;i++)
{
names[i] = "";
}
このように手動で設定する必要があります。
5.3 構造体配列では使えない
MQL5では 構造体(struct)配列を使うこともあります。
しかし、この場合もArrayInitializeは使用できません。
例
struct TradeData
{
double price;
int type;
};
TradeData trades[10];
この配列を次のように初期化することはできません。
ArrayInitialize(trades,0);
理由
構造体は 複数の型を持つデータ構造だからです。
構造体配列の初期化方法
構造体配列は次のように初期化します。
for(int i=0;i<10;i++)
{
trades[i].price = 0;
trades[i].type = -1;
}
このように メンバーごとに値を設定する必要があります。
5.4 配列サイズ0の状態では意味がない
次のコードも初心者がよく書くパターンです。
double data[];
ArrayInitialize(data,0);
このコードはエラーにはなりませんが意味がありません。
理由
配列サイズが 0だからです。
正しい書き方
ArrayResize(data,100);
ArrayInitialize(data,0);
この順番を守る必要があります。
5.5 OnTickでの多用は非効率になる
ArrayInitializeは便利ですが、頻繁に実行するとパフォーマンスに影響する可能性があります。
例
void OnTick()
{
ArrayInitialize(buffer,0);
}
このコードは
- 毎Tick配列を初期化
- CPU処理が増える
- 計算結果が消える
という問題を引き起こす可能性があります。
そのため通常は
OnInit()- 計算開始前
など必要なタイミングでのみ実行することが推奨されます。
5.6 初期化値の選び方に注意
ArrayInitializeでは、用途に応じて適切な値を選ぶ必要があります。
よく使われる値
| 初期値 | 用途 |
|---|---|
| 0 | 計算用バッファ |
| -1 | 状態管理 |
| EMPTY_VALUE | インジケーター |
| DBL_MAX | 特殊処理 |
例
ArrayInitialize(Buffer,EMPTY_VALUE);
インジケーターでは、この初期化を行うことで
未計算部分をチャートに表示しない動作を実現できます。
5.7 初期化忘れによるバグ
EA開発で実際によくあるバグが 初期化忘れです。
例
double result[100];
この状態で計算を行うと
- 過去データが残る
- 未定義値が混入する
- 計算結果が壊れる
可能性があります。
そのため、配列を使う場合は次の習慣をつけると安全です。
ArrayInitialize(result,0);
配列初期化は、EAの安定動作のための基本ルールと言えます。
ArrayInitializeは単純な関数ですが、使用できる配列型や使用タイミングを理解していないとバグの原因になります。
特に string配列や構造体配列では使用できない点は重要です。
6. ArrayInitializeでよくあるエラーと解決方法
6.1 「配列が初期化されない」問題
初心者が最もよく遭遇するのが
ArrayInitializeを実行したのに値が変わらないように見えるケースです。
原因の多くは 配列サイズが0のまま になっていることです。
誤った例
double data[];
ArrayInitialize(data,0);
このコードでは、配列サイズが 0要素 のため、
初期化する対象が存在しません。
そのため、実質的に 何も処理されていない状態になります。
正しいコード
double data[];
ArrayResize(data,100);
ArrayInitialize(data,0);
手順
- ArrayResizeでサイズ確保
- ArrayInitializeで初期化
この順番を必ず守る必要があります。
6.2 コンパイルエラー(string配列)
次のコードはコンパイルエラーになります。
string names[10];
ArrayInitialize(names,"");
エラー理由
ArrayInitializeは数値型配列のみ対応
つまり次の型には使用できません。
- string
- struct
- class
対処方法
string names[10];
for(int i=0;i<10;i++)
{
names[i] = "";
}
string配列は ループ初期化が必要です。
6.3 配列サイズ変更後に値が不安定
次のコードは初心者が書きがちな例です。
double buffer[];
ArrayResize(buffer,100);
この状態では、配列の中身は
?
?
?
?
...
のように 未定義値になる可能性があります。
安全なコード
ArrayResize(buffer,100);
ArrayInitialize(buffer,0);
このように サイズ変更 → 初期化 の順にします。
6.4 インジケーターが途中で消える
インジケーター開発でよくあるトラブルです。
例
ArrayInitialize(Buffer,0);
この場合、値0が描画されるため
意図しないラインが表示されることがあります。
インジケーターバッファでは通常
ArrayInitialize(Buffer,EMPTY_VALUE);
を使用します。
理由
EMPTY_VALUEは
チャートに表示しない値
だからです。
6.5 OnTickで毎回初期化してしまう
EA初心者に多いミスです。
例
void OnTick()
{
ArrayInitialize(buffer,0);
}
問題点
- 毎Tickデータが消える
- 計算結果が保存されない
- EAロジックが壊れる
配列初期化は通常
OnInit()- 計算開始前
など 一度だけ実行する場所で行います。
6.6 インジケーター計算との相性
インジケーターでは prev_calculated を使った計算最適化が一般的です。
この場合、毎回ArrayInitializeすると
計算効率が大きく落ちる可能性があります。
例
ArrayInitialize(Buffer,EMPTY_VALUE);
この処理は
- 初回計算
- バッファリセット
など 必要なタイミングだけ行うのが安全です。
6.7 配列サイズを頻繁に変更する問題
次のようなコードはパフォーマンスに悪影響を与える可能性があります。
void OnTick()
{
ArrayResize(buffer,100);
ArrayInitialize(buffer,0);
}
理由
- メモリ再確保が頻発する
- EA処理速度が低下する
一般的には
OnInit()
で配列サイズ確保
↓
OnTick()
では再利用
という設計にします。
6.8 初期値設計ミス
配列初期化の値は 用途に合わせて選ぶ必要があります。
例
| 初期値 | 意味 |
|---|---|
| 0 | 計算用 |
| -1 | 未処理 |
| EMPTY_VALUE | インジケーター |
| DBL_MAX | 特殊値 |
例えば
ArrayInitialize(signal,-1);
この場合
- -1 → 未判定
- 1 → BUY
- 2 → SELL
のような状態管理に使えます。
ArrayInitializeは非常にシンプルな関数ですが、
配列サイズ・配列型・実行タイミングを理解していないとトラブルの原因になります。
7. ArrayInitializeのベストプラクティス(実務での使い方)
7.1 配列は作成直後に必ず初期化する
MQL5で配列を扱う場合、配列作成直後に初期化する習慣を持つことが重要です。
配列を宣言しただけでは、要素の値が保証されない可能性があります。
安全な基本パターンは次の通りです。
double buffer[100];
ArrayInitialize(buffer,0);
動的配列の場合は次の順序になります。
double buffer[];
ArrayResize(buffer,100);
ArrayInitialize(buffer,0);
ポイント
- サイズ確保 → 初期化
- 未定義値を排除する
このパターンを守ることで、計算バグの多くを防ぐことができます。
7.2 EAではOnInitで初期化する
EAでは、配列初期化は OnInit() 内で行うのが基本設計です。
例
double calcBuffer[200];
int OnInit()
{
ArrayInitialize(calcBuffer,0);
return(INIT_SUCCEEDED);
}
この設計にすると
- EA起動時に一度だけ初期化
- OnTickでは再利用
という効率的な動作になります。
逆に OnTickで毎回初期化する設計は避けるべきです。
7.3 インジケーターではEMPTY_VALUEを使う
インジケーター開発では、通常の数値ではなく
EMPTY_VALUE を使って初期化するケースが多くなります。
例
ArrayInitialize(Buffer,EMPTY_VALUE);
理由
- 未計算部分を表示しない
- 描画バッファを正しく管理できる
もし 0 で初期化すると
- チャートに不要なラインが表示される
- インジケーターの表示が崩れる
可能性があります。
7.4 配列サイズはなるべく固定する
配列サイズを頻繁に変更すると、
メモリ確保が繰り返されてパフォーマンスが低下する可能性があります。
避けたいコード
void OnTick()
{
ArrayResize(buffer,100);
}
推奨設計
int OnInit()
{
ArrayResize(buffer,100);
ArrayInitialize(buffer,0);
return(INIT_SUCCEEDED);
}
配列は
- 起動時に確保
- 実行中は再利用
という設計が望ましいです。
7.5 状態管理用配列の初期化
EAでは、配列を 状態管理に使うケースもあります。
例
int tradeState[20];
ArrayInitialize(tradeState,-1);
このようにすると
| 値 | 意味 |
|---|---|
| -1 | 未処理 |
| 0 | 待機 |
| 1 | BUY |
| 2 | SELL |
のような状態管理が可能になります。
この方法は
- 複数ポジション管理
- シグナル履歴管理
などでよく使われます。
7.6 初期化値を用途で使い分ける
ArrayInitializeの初期値は用途に応じて設計します。
よく使われる初期値
| 値 | 用途 |
|---|---|
| 0 | 計算用配列 |
| -1 | 状態管理 |
| EMPTY_VALUE | インジケーター |
| DBL_MAX | 特殊処理 |
例
ArrayInitialize(priceBuffer,0);
ArrayInitialize(signalBuffer,-1);
ArrayInitialize(indicatorBuffer,EMPTY_VALUE);
このように役割ごとに初期値を決めると、
ロジックの可読性が向上します。
7.7 初期化タイミングを設計する
実務では、配列初期化のタイミングを設計することが重要です。
一般的なパターン
| タイミング | 用途 |
|---|---|
| OnInit | EA起動時 |
| 計算開始前 | バッファリセット |
| 条件発生時 | 状態リセット |
特にEAでは
- 不必要な初期化を避ける
- 必要なタイミングだけ実行する
ことがパフォーマンスに影響します。
ArrayInitializeは非常にシンプルな関数ですが、
配列管理・インジケーター描画・EA状態管理など、MQL5プログラムの多くの場面で使われる基本機能です。
配列サイズ確保、初期化値、実行タイミングを適切に設計することで、
EAやインジケーターの安定性と可読性を大きく向上させることができます。
8. MQL5 ArrayInitializeのよくある質問(FAQ)
8.1 ArrayInitializeとは何ですか?
ArrayInitializeは、配列のすべての要素を同じ値で一括設定するMQL5の関数です。
配列初期化をループで書く代わりに、1行のコードで処理できます。
例
double buffer[10];
ArrayInitialize(buffer,0);
このコードを実行すると、buffer の全要素が 0 になります。
8.2 ArrayInitializeは動的配列でも使えますか?
使用できます。
ただし、配列サイズを確保してから使用する必要があります。
正しい例
double data[];
ArrayResize(data,100);
ArrayInitialize(data,0);
誤った例
double data[];
ArrayInitialize(data,0);
この場合、配列サイズが0のため意味のある処理になりません。
8.3 string配列でもArrayInitializeは使えますか?
使用できません。
ArrayInitializeは 数値型配列専用の関数です。
対象型の例
- int
- double
- float
- long
string配列を初期化する場合は forループを使用します。
例
string names[10];
for(int i=0;i<10;i++)
{
names[i] = "";
}
8.4 ArrayInitializeとArrayResizeの違いは何ですか?
役割が異なります。
| 関数 | 役割 |
|---|---|
| ArrayResize | 配列サイズを変更する |
| ArrayInitialize | 配列の値を設定する |
一般的な使用パターン
ArrayResize(buffer,100);
ArrayInitialize(buffer,0);
つまり
- 配列サイズを決める
- 値を初期化する
という順番になります。
8.5 インジケーターではどの値で初期化するべきですか?
通常は EMPTY_VALUE を使用します。
例
ArrayInitialize(Buffer,EMPTY_VALUE);
EMPTY_VALUEを使う理由
- 未計算部分をチャートに表示しない
- インジケーター描画を正しく制御できる
もし 0 を使うと、チャートに不要なラインが表示される可能性があります。
8.6 ArrayInitializeは毎Tick実行しても問題ありませんか?
通常は 推奨されません。
理由
- 計算結果が毎Tickリセットされる
- EAロジックが正常に動作しない可能性
- パフォーマンス低下
多くの場合、次のタイミングで実行します。
OnInit()- 計算開始前
- バッファリセット時
8.7 ArrayInitializeの戻り値は何ですか?
ArrayInitializeは 配列の要素数を返します。
例
int size = ArrayInitialize(buffer,0);
この場合 size には 配列サイズが入ります。
ただし、実務では戻り値を使用するケースはあまり多くありません。
8.8 ArrayInitializeを使わない場合どうなりますか?
配列を宣言しただけでは、値が保証されない可能性があります。
例
double buffer[100];
この状態では
- 未定義値が入る
- 過去データが残る
- 計算結果が壊れる
可能性があります。
そのため、配列を使用する前に
ArrayInitialize(buffer,0);
のように 明示的に初期化することが安全なプログラム設計になります。