1. MQL5のArrayResizeとは何か
1.1 ArrayResizeの役割
ArrayResize は、MQL5で配列のサイズ(要素数)を変更するための関数です。
MQL5では、プログラムの実行中にデータ量が変化するケースが多いため、配列のサイズを動的に変更できる仕組みが用意されています。
配列とは、同じ型のデータを連続して格納するデータ構造です。
例えば、価格データやインジケーター値、トレード履歴などをまとめて保存する際に使われます。
MQL5では配列には次の2種類があります。
| 種類 | 特徴 |
|---|---|
| 静的配列 | サイズが固定(プログラム実行中に変更できない) |
| 動的配列 | サイズを変更できる |
ArrayResizeが使えるのは動的配列のみです。
例えば次のようなコードがあります。
double data[];
この配列はサイズが未定義の動的配列です。
この状態ではまだ要素数が確保されていないため、次のようにArrayResizeでサイズを指定します。
ArrayResize(data,10);
これにより、配列 data は 10個の要素を持つ配列になります。
data[0]
data[1]
data[2]
...
data[9]
このように、ArrayResizeは
- 配列のメモリを確保する
- 配列サイズを拡張する
- 配列サイズを縮小する
といった用途で使われます。
特にEA(自動売買プログラム)やインジケーターでは、次のような処理で頻繁に使用されます。
- インジケーターの計算結果を保存
- CopyBufferのデータ格納
- Tickデータの保存
- トレード履歴の配列管理
つまり ArrayResizeはMQL5の配列管理の基本関数と言えます。
1.2 MQL5で配列サイズ変更が必要になる場面
MQL5のプログラムでは、実行中にデータ数が変化する処理が非常に多くあります。
そのため、配列サイズを動的に変更する必要があります。
代表的な例をいくつか見てみましょう。
① インジケーターデータの取得
テクニカル指標の値を取得する場合、配列を使って保存することが一般的です。
例:移動平均の値を取得
double ma[];
ArrayResize(ma,100);
CopyBuffer(handle,0,0,100,ma);
この場合
- 100本分のインジケーターデータ
- 配列に格納
という処理になります。
② Tickデータの保存
EAではTick(価格更新)ごとにデータを保存することがあります。
double ticks[];
ArrayResize(ticks,count+1);
ticks[count] = SymbolInfoDouble(_Symbol,SYMBOL_BID);
このように、データが増えるたびに配列サイズを拡張する処理が必要になります。
③ トレード履歴の保存
EAでトレード結果を統計処理する場合、配列で履歴を保存することがあります。
例
- 利益履歴
- エントリー価格
- 決済価格
double profits[];
ArrayResize(profits,total_trades);
初心者がよくつまずくポイント
MQL5でよく発生するエラーの一つが
array out of range
です。
これは 配列サイズより大きいインデックスにアクセスした場合に発生します。
例
double data[];
data[0] = 1.0;
このコードはエラーになります。
なぜなら、ArrayResizeで配列サイズを確保していないためです。
正しいコードは次の通りです。
double data[];
ArrayResize(data,1);
data[0] = 1.0;
つまり
配列にデータを入れる前に必ずArrayResizeが必要
という点が重要です。
1.3 ArrayResizeの基本構文
ArrayResizeの基本構文は次の通りです。
int ArrayResize(
void& array[],
int new_size,
int reserve_size=0
);
各引数の意味は次の通りです。
| 引数 | 説明 |
|---|---|
| array | サイズ変更する配列 |
| new_size | 新しい配列サイズ |
| reserve_size | 追加メモリ確保(省略可能) |
基本的な使用例
double prices[];
ArrayResize(prices,10);
これにより
- prices配列のサイズは10
- インデックスは0〜9
になります。
戻り値(重要)
ArrayResizeは戻り値を返す関数です。
| 戻り値 | 意味 |
|---|---|
| 新しい配列サイズ | 成功 |
| -1 | 失敗 |
安全なコードを書く場合は、戻り値を確認することが推奨されます。
if(ArrayResize(prices,10) < 0)
{
Print("Array resize failed");
}
初心者のよくある失敗
① 静的配列にArrayResizeを使う
double data[10];
ArrayResize(data,20); // エラー
静的配列はサイズ変更できません。
② 配列サイズ確保前にアクセス
double arr[];
arr[0] = 1.0; // エラー
必ず
ArrayResize(arr,1);
が必要です。
③ サイズ縮小でデータ消失
ArrayResize(arr,5);
この場合
arr[5]
arr[6]
arr[7]
などの要素は削除されます。
2. ArrayResizeの基本的な使い方(配列サイズ変更の実装)
2.1 ArrayResizeの基本コード
ArrayResizeは、動的配列の要素数を変更するための関数です。
MQL5では、配列を宣言しただけではメモリは確保されないため、実際に使う前にArrayResizeでサイズを設定する必要があります。
基本的な使い方は次の通りです。
double data[];
ArrayResize(data,5);
このコードの意味は以下の通りです。
| 内容 | 説明 |
|---|---|
| data[] | 動的配列 |
| ArrayResize(data,5) | 要素数5の配列を作成 |
これにより、配列のインデックスは次のようになります。
data[0]
data[1]
data[2]
data[3]
data[4]
その後、配列に値を格納できます。
double data[];
ArrayResize(data,5);
data[0] = 1.0;
data[1] = 2.0;
data[2] = 3.0;
data[3] = 4.0;
data[4] = 5.0;
2.2 配列サイズを拡張する方法
ArrayResizeは、既存の配列を拡張(要素数を増やす)こともできます。
例えば次のコードを見てください。
double data[];
ArrayResize(data,3);
data[0] = 10;
data[1] = 20;
data[2] = 30;
ArrayResize(data,5);
この場合
data[0] = 10
data[1] = 20
data[2] = 30
data[3] = 0
data[4] = 0
のようになります。
重要なポイントは次の通りです。
- 既存データは保持される
- 新しい要素は 初期値(0)になる
数値型配列の場合、通常は 0 で初期化されます。
2.3 配列サイズを縮小する方法
ArrayResizeでは、配列サイズを小さくする(縮小する)ことも可能です。
double data[];
ArrayResize(data,5);
data[0] = 10;
data[1] = 20;
data[2] = 30;
data[3] = 40;
data[4] = 50;
ArrayResize(data,3);
この場合、配列は次の状態になります。
data[0] = 10
data[1] = 20
data[2] = 30
以下のデータは削除されます。
data[3]
data[4]
つまり
ArrayResizeで縮小すると、削除されたデータは復元できません。
そのため、重要なデータを扱う場合は注意が必要です。
2.4 ループ処理と組み合わせた実用例
ArrayResizeは、ループ処理と組み合わせて使うことが非常に多いです。
例えば、一定数のデータを配列に格納する場合です。
double prices[];
ArrayResize(prices,10);
for(int i=0;i<10;i++)
{
prices[i] = i * 1.5;
}
このコードの処理は次の通りです。
- 配列サイズを10に設定
- ループで値を代入
結果
prices[0] = 0
prices[1] = 1.5
prices[2] = 3.0
prices[3] = 4.5
...
このように、配列サイズを先に確保しておくことで、ループ処理が安全に実行できます。
2.5 初心者がよくやるミス
ArrayResizeの使用で初心者がよくつまずくポイントをまとめます。
ミス① 配列サイズを確保せずに代入
次のコードはエラーになります。
double data[];
data[0] = 10;
理由
array out of range
というエラーが発生するためです。
正しい書き方
double data[];
ArrayResize(data,1);
data[0] = 10;
ミス② ループサイズと配列サイズが一致していない
double data[];
ArrayResize(data,5);
for(int i=0;i<10;i++)
{
data[i] = i;
}
この場合
data[5]
data[6]
data[7]
data[8]
data[9]
にアクセスするためエラーになります。
安全なコード
for(int i=0;i<ArraySize(data);i++)
{
data[i] = i;
}
ArraySize() は 配列の要素数を取得する関数です。
ミス③ 静的配列にArrayResizeを使う
次のコードはエラーです。
double data[10];
ArrayResize(data,20);
理由
静的配列はサイズ変更できないためです。
2.6 ArrayResizeを使うときの基本ルール
安全に使うための基本ルールをまとめます。
① 配列使用前に必ずArrayResize
ArrayResize(array,size);
② ループはArraySizeを使う
for(int i=0;i<ArraySize(array);i++)
③ 静的配列には使えない
double data[];
のような宣言が必要です。
3. ArrayResizeの第3引数「reserve_size」とパフォーマンス最適化
3.1 reserve_sizeとは何か
ArrayResizeには、第3引数として reserve_size というオプションがあります。
これは配列の拡張時に追加のメモリ領域を事前確保するためのパラメータです。
基本構文は次の通りです。
int ArrayResize(
void& array[],
int new_size,
int reserve_size = 0
);
各引数の意味を整理すると次の通りです。
| 引数 | 説明 |
|---|---|
| array | サイズ変更する配列 |
| new_size | 新しい配列サイズ |
| reserve_size | 追加確保するメモリ(任意) |
通常の使用例
double data[];
ArrayResize(data,100);
reserve_sizeを使う場合
double data[];
ArrayResize(data,100,1000);
このコードでは
- 実際の配列サイズ:100
- 内部確保メモリ:1100程度
になります。
つまり reserve_size は
将来の配列拡張を想定してメモリを先に確保する仕組み
です。
3.2 なぜreserve_sizeが必要なのか
配列サイズを頻繁に変更すると、メモリ再確保(reallocation)が発生します。
メモリ再確保は次の処理を伴います。
- 新しいメモリを確保
- 既存データをコピー
- 古いメモリを解放
この処理はCPU負荷が比較的大きいため、頻繁に発生するとEAのパフォーマンスに影響する可能性があります。
例えば次のようなコードを考えます。
double ticks[];
for(int i=0;i<10000;i++)
{
ArrayResize(ticks,i+1);
ticks[i] = i;
}
このコードでは
- 10000回ArrayResize
- 10000回メモリ再確保
が発生する可能性があります。
その結果
- 処理速度低下
- メモリ負荷増加
が起きる場合があります。
3.3 reserve_sizeを使った最適化例
先ほどのコードを、reserve_sizeを使って改善すると次のようになります。
double ticks[];
ArrayResize(ticks,1,10000);
for(int i=0;i<10000;i++)
{
ArrayResize(ticks,i+1);
ticks[i] = i;
}
このコードでは
- 最初に10000分のメモリを確保
- その後の拡張ではメモリ再確保が発生しない
可能性が高くなります。
その結果
- メモリ再割当の回数削減
- EA処理速度の改善
につながります。
特に次のケースではreserve_sizeの利用が推奨されます。
| ケース | 理由 |
|---|---|
| Tickデータ保存 | データ数が増え続ける |
| ログ収集 | 配列拡張が頻繁 |
| トレード履歴保存 | データ数が予測できる |
| バックテストデータ | 大量データ |
3.4 reserve_sizeを使うときの注意点
reserve_sizeは便利ですが、使い方を誤ると無駄なメモリ消費になることがあります。
例えば次のコードです。
double data[];
ArrayResize(data,10,1000000);
この場合
- 実際のデータ:10
- 確保メモリ:100万
となり、メモリを大きく消費します。
特にVPSや低スペック環境では注意が必要です。
3.5 初心者がよくやる失敗
① reserve_sizeを誤解している
初心者がよく勘違いするのは
reserve_size = 配列サイズ
と思ってしまうことです。
しかし実際は
reserve_size = 追加確保メモリ
です。
② 毎回reserve_sizeを指定する
次のようなコードは意味がありません。
ArrayResize(data,100,1000);
ArrayResize(data,200,1000);
ArrayResize(data,300,1000);
reserve_sizeは最初の確保時に意味を持つことが多く、毎回指定しても効果が小さい場合があります。
③ 無制限にメモリ確保
極端なreserve_sizeは
- メモリ浪費
- VPSクラッシュ
につながる可能性があります。
環境によって動作が異なる場合もあるため、必要な範囲で確保することが重要です。
3.6 実務でよく使う安全パターン
EA開発でよく使われるパターンを紹介します。
double data[];
int capacity = 1000;
ArrayResize(data,0,capacity);
for(int i=0;i<capacity;i++)
{
ArrayResize(data,i+1);
data[i] = i;
}
この方法では
- 最初に十分なメモリ確保
- 必要に応じて配列サイズ拡張
という形になります。
結果として
- メモリ再確保の削減
- 安定した処理速度
が期待できます。
4. ArrayResizeとArraySizeの関係(安全な配列管理)
4.1 ArraySizeとは何か
ArraySize は、配列の現在の要素数を取得するための関数です。
MQL5では、配列サイズを直接管理するのではなく、この関数を使って安全に要素数を確認します。
基本構文
int ArraySize(array);
戻り値は 配列の要素数(int型) です。
例えば次のコードを見てください。
double prices[];
ArrayResize(prices,5);
int size = ArraySize(prices);
Print(size);
この場合、出力は次のようになります。
5
つまり
ArrayResize→ 配列サイズを変更するArraySize→ 配列サイズを取得する
という役割の違いがあります。
配列を扱うプログラムでは、この2つの関数は必ずセットで使用されることが多いです。
4.2 ループ処理ではArraySizeを使う
配列を処理するとき、最も安全な方法は ArraySizeを使ったループ処理です。
例
double prices[];
ArrayResize(prices,5);
for(int i=0;i<ArraySize(prices);i++)
{
prices[i] = i * 10;
}
このコードの処理は次の通りです。
| インデックス | 値 |
|---|---|
| prices[0] | 0 |
| prices[1] | 10 |
| prices[2] | 20 |
| prices[3] | 30 |
| prices[4] | 40 |
ここで重要なのは
i < ArraySize(prices)
という条件です。
この書き方をすると
- 配列サイズが変わっても安全
- エラーが発生しにくい
というメリットがあります。
4.3 固定値ループは危険
初心者がよくやる失敗が、固定値ループです。
例
double prices[];
ArrayResize(prices,5);
for(int i=0;i<10;i++)
{
prices[i] = i;
}
このコードは次のインデックスにアクセスします。
prices[5]
prices[6]
prices[7]
prices[8]
prices[9]
しかし配列サイズは5なので
array out of range
エラーが発生します。
これはMQL5で最も多いエラーの一つです。
4.4 安全な配列処理パターン
EA開発では、次のパターンがよく使われます。
double data[];
ArrayResize(data,100);
int size = ArraySize(data);
for(int i=0;i<size;i++)
{
data[i] = i;
}
この方法のメリット
- 配列サイズ変更に強い
- 可読性が高い
- エラーが発生しにくい
特に大規模EAでは、配列サイズを変数に保存しておくことも多いです。
4.5 配列サイズ拡張とArraySize
ArrayResizeで配列を拡張すると、ArraySizeの戻り値も変わります。
例
double data[];
ArrayResize(data,3);
Print(ArraySize(data));
出力
3
その後
ArrayResize(data,10);
Print(ArraySize(data));
出力
10
つまり
ArrayResizeの結果はArraySizeに反映される
という関係になります。
4.6 配列を1要素ずつ追加するパターン
EAでは、配列にデータを追加していくケースがあります。
例
double ticks[];
for(int i=0;i<5;i++)
{
int size = ArraySize(ticks);
ArrayResize(ticks,size+1);
ticks[size] = i;
}
処理の流れ
- 現在サイズ取得
- サイズ+1に拡張
- 新しい要素に値代入
結果
ticks[0] = 0
ticks[1] = 1
ticks[2] = 2
ticks[3] = 3
ticks[4] = 4
この方法は
- Tick保存
- ログ収集
- トレード履歴
などでよく使われます。
4.7 初心者がつまずきやすいポイント
① ArraySizeを使わない
固定値ループはエラー原因になります。
安全な書き方
for(int i=0;i<ArraySize(array);i++)
② インデックスを1から始める
MQL5配列は 0始まり です。
例
array[0]
array[1]
array[2]
そのため
for(int i=1;i<=ArraySize(array);i++)
のようなコードはエラーの原因になります。
③ ArrayResize後のサイズ確認を忘れる
ArrayResizeは失敗する可能性があります。
安全なコード
if(ArrayResize(data,10) < 0)
{
Print("Resize failed");
}
環境やメモリ状況によって結果が異なる場合があります。
5. ArrayResizeの実践コード(EA開発でよく使うパターン)
5.1 配列にデータを追加していく基本パターン
EAやインジケーターでは、新しいデータを配列に追加していく処理がよく使われます。
例えば、Tick価格や計算結果を順番に保存する場合です。
基本パターンは次の通りです。
double data[];
for(int i=0;i<5;i++)
{
int size = ArraySize(data);
ArrayResize(data,size+1);
data[size] = i * 10;
}
処理の流れは次のようになります。
| 手順 | 処理 |
|---|---|
| 1 | 現在の配列サイズ取得 |
| 2 | サイズを1増やす |
| 3 | 新しい要素に値を格納 |
結果
data[0] = 0
data[1] = 10
data[2] = 20
data[3] = 30
data[4] = 40
この方法は
- Tickデータ保存
- トレード履歴保存
- 計算結果ログ
などでよく使われます。
ただし注意点があります。
頻繁なArrayResizeは処理負荷が高くなる可能性があります。
そのため、大量データではreserve_sizeを併用することが推奨されます。
5.2 Tickデータを保存する例
EAでは、Tick価格を配列に保存することがあります。
例
double ticks[];
void OnTick()
{
int size = ArraySize(ticks);
ArrayResize(ticks,size+1);
ticks[size] = SymbolInfoDouble(_Symbol,SYMBOL_BID);
}
このコードの動作
- 現在の配列サイズ取得
- サイズ+1で拡張
- 最新のBid価格を保存
このようにして、Tickデータを時系列で保存できます。
配列状態のイメージ
ticks[0] = 150.25
ticks[1] = 150.27
ticks[2] = 150.24
ticks[3] = 150.30
ただし、長時間稼働するEAでは
- 配列が非常に大きくなる
- メモリ消費が増える
可能性があります。
そのため実務では
- 一定サイズを超えたら古いデータ削除
- 配列をリングバッファ化
などの対策を行う場合もあります。
5.3 インジケーターデータ保存の例
MQL5では、インジケーターの値を配列で扱うことが一般的です。
例:移動平均データ取得
double ma[];
int handle;
handle = iMA(_Symbol,PERIOD_CURRENT,20,0,MODE_SMA,PRICE_CLOSE);
ArrayResize(ma,100);
CopyBuffer(handle,0,0,100,ma);
処理内容
| 処理 | 説明 |
|---|---|
| iMA | 移動平均インジケーター作成 |
| ArrayResize | 配列サイズ確保 |
| CopyBuffer | インジケーターデータ取得 |
配列のイメージ
ma[0] = 最新MA
ma[1] = 1本前
ma[2] = 2本前
ここで重要なのは
CopyBufferを使う前にArrayResizeが必要
という点です。
もし配列サイズを確保していない場合
array out of range
エラーになる可能性があります。
5.4 トレード履歴を保存する例
EAでは、トレード結果を配列で管理することもあります。
例
double profits[];
void AddProfit(double p)
{
int size = ArraySize(profits);
ArrayResize(profits,size+1);
profits[size] = p;
}
呼び出し例
AddProfit(10.5);
AddProfit(-5.2);
AddProfit(20.3);
結果
profits[0] = 10.5
profits[1] = -5.2
profits[2] = 20.3
このデータを使って
- 勝率計算
- 平均利益
- ドローダウン分析
などを行うことができます。
5.5 初心者がやりがちな失敗
① ArrayResizeをループ内で多用
次のコードはパフォーマンスが悪くなる可能性があります。
for(int i=0;i<10000;i++)
{
ArrayResize(data,i+1);
}
この場合、メモリ再確保が大量に発生します。
改善方法
ArrayResize(data,10000);
② 配列サイズチェックをしない
次のコードは危険です。
data[10] = 5;
配列サイズが10未満の場合
array out of range
になります。
安全なコード
if(ArraySize(data) > 10)
{
data[10] = 5;
}
③ 配列初期化を忘れる
動的配列は、初期状態では
サイズ = 0
です。
そのため
data[0]
はアクセスできません。
必ず
ArrayResize(data,1);
が必要です。
5.6 実務でよく使う安全テンプレート
EA開発では次のパターンが安全です。
double data[];
void AddValue(double v)
{
int size = ArraySize(data);
if(ArrayResize(data,size+1) < 0)
{
Print("Array resize failed");
return;
}
data[size] = v;
}
このコードは
- 配列サイズ確認
- Resizeエラー確認
- 安全な代入
をすべて含んでいます。
6. ArrayResize使用時に発生しやすいエラーと対策
6.1 「array out of range」エラーの原因
MQL5で配列を扱う際、最も頻繁に発生するエラーが array out of range です。
これは 配列の範囲外のインデックスにアクセスした場合 に発生します。
例えば次のコードを見てください。
double data[];
ArrayResize(data,5);
data[5] = 10;
このコードでは、配列サイズは 5 です。
配列のインデックスは次の範囲になります。
data[0]
data[1]
data[2]
data[3]
data[4]
しかし
data[5]
は存在しないため、次のエラーが発生します。
array out of range
このエラーは EA・インジケーター開発で最も多いバグの一つです。
6.2 配列サイズ未確保のエラー
初心者がよくやるミスが、ArrayResize前に配列へアクセスすることです。
誤ったコード
double data[];
data[0] = 1.0;
この場合、配列サイズは 0 です。
つまり、存在するインデックスはありません。
サイズ = 0
そのためエラーになります。
正しいコード
double data[];
ArrayResize(data,1);
data[0] = 1.0;
このように 配列使用前に必ずArrayResizeを行う必要があります。
6.3 ループ条件ミスによるエラー
ループ処理でもエラーは発生しやすいです。
例
double data[];
ArrayResize(data,10);
for(int i=0;i<=10;i++)
{
data[i] = i;
}
このコードでは
i = 10
のとき
data[10]
にアクセスします。
しかし配列は
data[0] ~ data[9]
までしか存在しません。
正しい書き方
for(int i=0;i<10;i++)
または
for(int i=0;i<ArraySize(data);i++)
です。
特に後者の書き方は 配列サイズ変更に強いコードになります。
6.4 静的配列でArrayResizeを使うエラー
ArrayResizeは 動的配列専用です。
次のコードはエラーになります。
double data[10];
ArrayResize(data,20);
理由
静的配列は コンパイル時にサイズが固定されるためです。
ArrayResizeを使う場合は、次のように宣言する必要があります。
double data[];
6.5 ArrayResize失敗のケース
ArrayResizeは、メモリ確保に失敗するとエラーになります。
戻り値は次の通りです。
| 戻り値 | 意味 |
|---|---|
| 配列サイズ | 成功 |
| -1 | 失敗 |
安全なコード例
if(ArrayResize(data,100) < 0)
{
Print("ArrayResize failed");
}
メモリ確保失敗は通常あまり起きませんが、次の環境では発生する可能性があります。
- VPSメモリ不足
- 非常に巨大な配列
- 長時間稼働EA
そのため 戻り値チェックを入れることが推奨されます。
6.6 reserve_sizeによるメモリ問題
reserve_sizeを極端に大きくすると、メモリ不足が発生する場合があります。
例
ArrayResize(data,10,100000000);
このコードでは、非常に大きなメモリ確保が行われます。
その結果
- メモリ不足
- EA停止
- VPS負荷増加
などが起こる可能性があります。
reserve_sizeは 必要な範囲に限定することが重要です。
6.7 エラーを防ぐ基本ルール
ArrayResize関連のバグを防ぐための基本ルールをまとめます。
① 配列使用前に必ずArrayResize
ArrayResize(array,size);
② ループ条件はArraySizeを使う
for(int i=0;i<ArraySize(array);i++)
③ 配列インデックスは0から
array[0]
④ ArrayResize戻り値を確認
if(ArrayResize(array,size) < 0)
⑤ reserve_sizeは必要最小限
極端なメモリ確保を避けます。
これらを守ることで、MQL5配列バグの大半は回避できます。
7. MQL5 ArrayResizeに関するよくある質問(FAQ)
7.1 ArrayResizeとは何ですか?
ArrayResizeは、MQL5で動的配列のサイズを変更する関数です。
プログラム実行中に配列の要素数を増減させることができます。
主な用途
- インジケーターデータ保存
- Tickデータ保存
- トレード履歴管理
- 計算結果の格納
動的配列は、次のように宣言します。
double data[];
その後、ArrayResizeで配列サイズを設定します。
ArrayResize(data,10);
7.2 ArrayResizeは静的配列にも使えますか?
使えません。
ArrayResizeは 動的配列専用の関数です。
次の配列は静的配列です。
double data[10];
この場合、サイズはコンパイル時に固定されるため変更できません。
ArrayResizeを使用する場合は、次のように宣言します。
double data[];
7.3 ArrayResizeで配列サイズを小さくするとどうなりますか?
配列サイズを縮小すると、削除された要素のデータは失われます。
例
ArrayResize(data,5);
配列状態
data[0]
data[1]
data[2]
data[3]
data[4]
その後
ArrayResize(data,3);
結果
data[0]
data[1]
data[2]
data[3] と data[4] は削除されます。
7.4 ArrayResizeの戻り値は何ですか?
ArrayResizeは 新しい配列サイズを返します。
戻り値
| 値 | 意味 |
|---|---|
| 新しいサイズ | 成功 |
| -1 | 失敗 |
安全なコード例
if(ArrayResize(data,100) < 0)
{
Print("Resize failed");
}
通常の環境では失敗は少ないですが、メモリ不足などで失敗する可能性があります。
7.5 reserve_sizeとは何ですか?
reserve_size は 追加メモリを事前確保するためのパラメータです。
構文
ArrayResize(array,new_size,reserve_size);
例
ArrayResize(data,100,1000);
この場合
- 実際の配列サイズ → 100
- 内部メモリ確保 → 約1100
になります。
目的
- メモリ再確保回数削減
- パフォーマンス改善
特に
- Tick保存
- 大量データ処理
で有効です。
7.6 ArrayResizeとArraySizeの違いは何ですか?
役割が異なります。
| 関数 | 役割 |
|---|---|
| ArrayResize | 配列サイズ変更 |
| ArraySize | 配列サイズ取得 |
例
ArrayResize(data,10);
int size = ArraySize(data);
結果
size = 10
ArraySizeは、ループ処理でよく使われます。
7.7 「array out of range」エラーの原因は何ですか?
これは 配列の範囲外にアクセスした場合に発生します。
例
double data[];
ArrayResize(data,5);
data[5] = 10;
配列の範囲
data[0] ~ data[4]
しかし
data[5]
にアクセスしているためエラーになります。
安全な書き方
for(int i=0;i<ArraySize(data);i++)
7.8 配列に要素を追加する方法は?
次の方法が一般的です。
double data[];
int size = ArraySize(data);
ArrayResize(data,size+1);
data[size] = value;
処理手順
- 現在サイズ取得
- サイズを1増やす
- 新しい要素に代入
この方法は
- Tickログ
- トレード履歴
- 計算データ
の保存でよく使われます。