はじめに
MQL5では公式に1次元目が動的な最大4次元までの配列しかサポートされていませんが、構造体のネスト(入れ子構造)を使うことで、すべての次元を動的かつ5次元以上の疑似多次元配列を実現することができます。
この記事では、構造体ネストを使った高次元配列の実装方法を詳しく解説します。

WAN
発想力でMQLの限界を超えるのだ(‘ω’)
MQL5の配列制限について
公式の制限
MQL5では以下のような制限があります:

// MQL5公式サポート: 最大4次元まで
double matrix[][10][20][5]; // これが最大
ArrayResize(matrix, 3);
// 5次元以上は直接サポートされていない
// double invalid_matrix[][][][][][]; // エラー

WAN
さらに動的といっても1次元目のみ動的で、それ以降の次元数は静的であるのが原則。
今回紹介する方法を使えば、2次元目以降も動的な設定が可能だよ(‘ω’)
なぜ高次元配列が必要なのか?
複雑な金融データ分析では、以下のような多次元データを扱う必要があります:
- 通貨ペア × 時間足 × 指標 × 期間 × 値の種類
- ポートフォリオ × 資産 × リスク指標 × 時系列 × シナリオ
これらを効率的に管理するために、高次元配列が有効です。
構造体ネストによる解決方法
基本的な構造体定義
//+------------------------------------------------------------------+
//| 5次元配列のための構造体定義 |
//+------------------------------------------------------------------+
struct Level1
{
string data[]; // 最内層:データ配列
};
struct Level2
{
Level1 rows[]; // 2次元:行の配列
};
struct Level3
{
Level2 pages[]; // 3次元:ページの配列
};
struct Level4
{
Level3 volumes[]; // 4次元:ボリュームの配列
};
struct Level5
{
Level4 books[]; // 5次元:ブックの配列
};
5次元配列の実装例
//+------------------------------------------------------------------+
//| 5次元配列の実装と使用例 |
//+------------------------------------------------------------------+
void OnStart()
{
Level5 array_5d;
Print("=== 5次元配列の実装例 ===");
// 配列サイズの定義: [2][3][4][5][6]
int book_size = 2;
int volume_size = 3;
int page_size = 4;
int row_size = 5;
int data_size = 6;
// 最外層から順番に配列を初期化
ArrayResize(array_5d.books, book_size);
for(int book = 0; book < book_size; book++)
{
ArrayResize(array_5d.books[book].volumes, volume_size);
for(int volume = 0; volume < volume_size; volume++)
{
ArrayResize(array_5d.books[book].volumes[volume].pages, page_size);
for(int page = 0; page < page_size; page++)
{
ArrayResize(array_5d.books[book].volumes[volume].pages[page].rows, row_size);
for(int row = 0; row < row_size; row++)
{
ArrayResize(array_5d.books[book].volumes[volume].pages[page].rows[row].data, data_size);
// データを設定
for(int col = 0; col < data_size; col++)
{
array_5d.books[book].volumes[volume].pages[page].rows[row].data[col] =
StringFormat("B%dV%dP%dR%dC%d", book, volume, page, row, col);
}
}
}
}
Comment("初期化進行中: ", book * 100 / book_size, "%");
}
Print("5次元配列初期化完了");
// データアクセス例
Print("array_5d[0][1][2][3][4] = ", array_5d.books[0].volumes[1].pages[2].rows[3].data[4]);
// データ変更例
array_5d.books[0].volumes[1].pages[2].rows[3].data[4] = "変更されたデータ";
Print("変更後: ", array_5d.books[0].volumes[1].pages[2].rows[3].data[4]);
}

WAN
構造体のメンバー変数配列を巧みに使うことで、柔軟な配列を実現することができるんだ(‘ω’)
まとめ
構造体ネストを使用することで、MQL5の4次元制限を超えた動的な高次元配列を実現できます。
メリット
- 柔軟性: 任意の次元数に対応可能
- 型安全性: 構造体による明確なデータ構造
- 拡張性: 段階的な機能追加が容易
デメリット
- パフォーマンス: 公式4次元配列より遅い
- メモリ効率: 分散配置によるオーバーヘッド
- 複雑性: コードの可読性の低下
適用場面
- 複雑な金融データ分析
- 多通貨ペア・多時間足分析
- 機械学習用特徴量管理
- リスク管理システム
この手法を活用することで、より高度で包括的なトレーディング分析システムを構築できるでしょう。ただし、メモリ使用量とパフォーマンスには十分注意して実装することが重要です。
この記事が皆さんのMQL5プログラミングの参考になれば幸いです。質問やコメントがございましたら、お気軽にお聞かせください。