PR

【MQL5裏技】動的かつ5次元以上の配列を作成する方法-構造体ネスト

オリジナル関数

はじめに

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

この記事では、構造体ネストを使った高次元配列の実装方法を詳しく解説します。

WAN
WAN

発想力でMQLの限界を超えるのだ(‘ω’)

MQL5の配列制限について

公式の制限

MQL5では以下のような制限があります:

// MQL5公式サポート: 最大4次元まで
double matrix[][10][20][5]; // これが最大
ArrayResize(matrix, 3);

// 5次元以上は直接サポートされていない
// double invalid_matrix[][][][][][]; // エラー
WAN
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
WAN

構造体のメンバー変数配列を巧みに使うことで、柔軟な配列を実現することができるんだ(‘ω’)

まとめ

構造体ネストを使用することで、MQL5の4次元制限を超えた動的な高次元配列を実現できます。

メリット

  • 柔軟性: 任意の次元数に対応可能
  • 型安全性: 構造体による明確なデータ構造
  • 拡張性: 段階的な機能追加が容易

デメリット

  • パフォーマンス: 公式4次元配列より遅い
  • メモリ効率: 分散配置によるオーバーヘッド
  • 複雑性: コードの可読性の低下

適用場面

  • 複雑な金融データ分析
  • 多通貨ペア・多時間足分析
  • 機械学習用特徴量管理
  • リスク管理システム

この手法を活用することで、より高度で包括的なトレーディング分析システムを構築できるでしょう。ただし、メモリ使用量とパフォーマンスには十分注意して実装することが重要です。


この記事が皆さんのMQL5プログラミングの参考になれば幸いです。質問やコメントがございましたら、お気軽にお聞かせください。

タイトルとURLをコピーしました