mql5 配列 コピーを正しく理解すると、インジケーターやEAの処理効率、保守性、バグ回避が一気に向上します。とはいえ、単純代入と関数によるコピーの違い、時系列配列の扱い、動的配列のサイズ調整などで迷う方は少なくありません。この記事では、MQL5で配列をコピーする方法を実例付きで整理し、実務でつまずきやすいポイントまでわかりやすく解説します。
MQL5で配列コピーを理解する重要性
単純代入だけでは足りない場面がある
MQL5では、配列の値を別の配列へ移したい場面が頻繁にあります。たとえば、価格データの退避、計算用バッファの複製、フィルター処理前のバックアップなどです。
このとき、mql5 配列 コピーの考え方を曖昧なまま使うと、意図した範囲だけを移せなかったり、サイズ不足でエラーになったり、時系列の向きが想定と違って結果が崩れたりします。
特にEAやインジケーターでは、1回のミスが売買ロジックや描画結果に直結します。だからこそ、mql5 配列 コピーの基本を早い段階で押さえておくことが大切です。
MQL5で使える配列コピーの主な方法
ArrayCopyと代入の違いを押さえる
mql5 配列 コピーでまず知っておきたいのが、配列同士の代入とArrayCopy関数の違いです。用途に応じて使い分けることで、コードが読みやすくなり、意図しない挙動も減らせます。
代表的な方法を表で整理します。
| 方法 | 用途 | 特徴 | 注意点 |
|---|---|---|---|
| 配列同士の代入 | 同型配列を丸ごと複製したい場合 | 記述が簡潔 | 部分コピーの制御には不向き |
| ArrayCopy | 開始位置や件数を指定したい場合 | 柔軟に範囲指定できる | コピー元とコピー先の添字を意識する必要がある |
| ループ処理 | 条件付きで加工しながら複製したい場合 | 自由度が高い | 記述量が増えやすい |
単純に全要素を複製するだけなら代入でも対応できますが、実務では一部だけコピーしたいケースが多く、mql5 配列 コピーではArrayCopyが非常によく使われます。
ArrayCopyの基本構文
ArrayCopyの代表的な使い方は次のとおりです。
double src[] = {1.1, 2.2, 3.3, 4.4};
double dst[];
ArrayResize(dst, 4);
int copied = ArrayCopy(dst, src, 0, 0, WHOLE_ARRAY);
Print("copied=", copied);
この例では、srcの内容をdstへコピーしています。mql5 配列 コピーで重要なのは、コピー先のサイズを必要に応じて確保しておくことです。
また、戻り値として実際にコピーされた要素数を受け取れるため、想定通りの件数が移ったかを確認しやすい点も便利です。
ArrayCopyの実践パターン
配列全体をコピーする
最も基本的なmql5 配列 コピーは、配列全体の複製です。計算前のバックアップや、別ロジックへ渡すための複製でよく使います。
double source[] = {10, 20, 30, 40, 50};
double target[];
ArrayResize(target, ArraySize(source));
ArrayCopy(target, source);
この形ならシンプルで、可読性も高くなります。コピー先の要素数はArraySizeで合わせるのが定番です。
一部の範囲だけコピーする
mql5 配列 コピーでは、特定の範囲だけ抜き出したい場面も多いです。たとえば直近20本のバーだけ別配列に保存したいケースが該当します。
double source[] = {10,20,30,40,50,60};
double target[];
ArrayResize(target, 3);
ArrayCopy(target, source, 0, 2, 3);
この例では、sourceのインデックス2から3要素分をtargetへコピーします。結果は30,40,50になります。
部分コピーができることは、mql5 配列 コピーを実務レベルで使いこなすうえで非常に重要です。
コピー先の途中位置へ書き込む
既存配列の途中にデータを移したい場合もあります。たとえば、前半は固定値、後半だけ別配列から差し込みたいときです。
double source[] = {100, 200, 300};
double target[] = {1, 2, 3, 4, 5, 6};
ArrayCopy(target, source, 2, 0, 3);
この場合、targetのインデックス2からsourceの値が入ります。結果としてtargetは1,2,100,200,300,6となります。
このようにmql5 配列 コピーでは、コピー元だけでなくコピー先の開始位置も指定できるため、配列編集の幅が広がります。
時系列配列と通常配列で注意したい点
ArraySetAsSeriesの影響を理解する
MQL5では、価格データやインジケーターバッファで時系列配列を扱うことがあります。ここでmql5 配列 コピーを行う際は、ArraySetAsSeriesの設定を必ず確認してください。
時系列配列では、最新データがインデックス0になるため、通常配列とは見え方が逆になります。つまり、同じArrayCopyでも、どの位置から何件取るかの感覚がずれやすいのです。
double price_buffer[];
ArraySetAsSeries(price_buffer, true);
この設定後は、price_buffer[0]が最新値です。mql5 配列 コピーで「先頭3件」と考えたとき、それが最新3本を意味するのか、古い順の3件を意味するのかを明確にしておく必要があります。
CopyCloseなどの取得関数との違い
MQL5には、CopyClose、CopyOpen、CopyRatesといった時系列データ取得用の関数もあります。これらは市場データを配列へ読み込むための関数であり、既存配列同士のmql5 配列 コピーとは役割が異なります。
たとえば、まずCopyCloseで終値を取得し、その後にArrayCopyで必要範囲を別配列へ移す、という流れはよくあります。
double closes[];
CopyClose(_Symbol, PERIOD_H1, 0, 100, closes);
double recent20[];
ArrayResize(recent20, 20);
ArrayCopy(recent20, closes, 0, 0, 20);
このように取得と複製は別工程として考えると、コードの整理がしやすくなります。
エラーや不具合を防ぐチェックポイント
サイズ不足と型の不一致を避ける
mql5 配列 コピーで多い失敗のひとつが、コピー先サイズの不足です。動的配列ならArrayResizeで事前に十分なサイズを確保しましょう。
また、int配列とdouble配列のように型が異なる場合、意図しない変換や制限が発生することがあります。配列の型はできるだけ揃えるのが安全です。
int src[] = {1,2,3};
int dst[];
ArrayResize(dst, 3);
ArrayCopy(dst, src);
このように、同じ型でそろえたmql5 配列 コピーはトラブルが少なく、保守もしやすくなります。
戻り値を確認して想定件数を検証する
ArrayCopyはコピーできた件数を返します。これを無視すると、実際には一部しかコピーされていないのに気づけないことがあります。
int result = ArrayCopy(dst, src, 0, 0, 10);
if(result != 10)
{
Print("コピー件数が不足しています: ", result);
}
特にmql5 配列 コピーをループ内やOnCalculate内で使う場合、想定件数の確認はバグの早期発見に役立ちます。
実務で役立つ配列コピーの活用例
インジケーター計算用の退避配列を作る
インジケーター開発では、元データを残したまま別の計算を試したいことがあります。そんなとき、mql5 配列 コピーで退避配列を作っておくと安心です。
double ma_buffer[];
double work_buffer[];
CopyBuffer(handle, 0, 0, 100, ma_buffer);
ArrayResize(work_buffer, 100);
ArrayCopy(work_buffer, ma_buffer);
この形なら、work_bufferに対して平滑化や条件分岐の加工を加えても、元のma_bufferは保持されます。
売買シグナル判定用に直近データだけ抜き出す
EAでは、全履歴ではなく直近数本だけで判定することが多いです。mql5 配列 コピーを使えば、必要最小限のデータだけを扱えます。
double close_all[];
CopyClose(_Symbol, PERIOD_M15, 0, 200, close_all);
double recent5[];
ArrayResize(recent5, 5);
ArrayCopy(recent5, close_all, 0, 0, 5);
このように直近5本の終値だけを別配列へ切り出せば、ロジックが明確になり、不要な処理も減らせます。
ループコピーとの使い分けを考える
条件付きで値を加工しながら移す場合は、ArrayCopyよりループのほうが向いています。たとえば、負の値を0へ変換しながらコピーしたいケースです。
for(int i=0; i<ArraySize(src); i++)
{
dst[i] = (src[i] < 0) ? 0 : src[i];
}
つまり、mql5 配列 コピーは「そのまま移す」処理に強く、加工を伴うならループと組み合わせるのが実践的です。
読みやすく保守しやすいコードにするコツ
コピーの目的をコメントで明確にする
配列は中身が見えにくいため、なぜコピーしているのかが後から分かりにくくなります。mql5 配列 コピーを使う箇所には、退避用、比較用、直近データ抽出用など目的を書いておくと保守性が高まります。
たとえば「元データ保護のため複製」「直近20本のみ抽出」といったコメントがあるだけで、後から見直したときの理解速度が大きく変わります。
関数化して再利用する
同じmql5 配列 コピー処理を何度も書くなら、関数化がおすすめです。特に範囲コピーやサイズ調整を毎回記述すると、修正漏れが起きやすくなります。
int CopyRecent(double &src[], double &dst[], int count)
{
ArrayResize(dst, count);
return ArrayCopy(dst, src, 0, 0, count);
}
このようにまとめれば、呼び出し側はシンプルになります。コードレビューでも意図が伝わりやすくなります。
まとめ
正しい配列コピーを覚えればMQL5開発はもっと安定する
mql5 配列 コピーは、単なるデータ移動ではなく、EAやインジケーターの品質を支える重要な技術です。
ArrayCopyを使えば、全体コピーだけでなく部分コピーや途中位置への書き込みも柔軟に行えます。一方で、時系列配列の向き、配列サイズ、戻り値の確認といった注意点を押さえないと、思わぬ不具合につながります。
まずは全体コピーと部分コピーの2パターンを手元で試し、次に時系列配列やCopyCloseと組み合わせた実装へ進んでみてください。mql5 配列 コピーを使いこなせれば、あなたのMQL5コードはもっと読みやすく、もっと堅牢になります。ぜひ今日から実装に取り入れてみましょう。









コメント