【MQL5】ArraySort関数の使い方と自動売買実装コード

1. ArraySort関数の概要と実務での活用法

MQL5のArraySortは、数値配列の要素を昇順(値が小さい順)に並び替えるための組み込み関数です。

実務レベルのEA(エキスパートアドバイザー)開発において、この関数は単に数字を並べるためだけではなく、以下のようなシーンで頻繁に活用されます。

  • 強弱分析: 複数の通貨ペアの騰落率を配列に格納し、強い通貨と弱い通貨を特定する。
  • 統計的アプローチ: 過去一定期間のボラティリティをソートし、現在のボラティリティが上位何%に位置するかを算出する。
  • 注文管理: 複数の待機注文(Limit/Stop)を価格順に整理し、ロジック内で優先順位を決定する。

初心者が特につまずきやすい点は、「降順(大きい順)にソートする専用の引数が存在しない」という点です。MQL5のArraySortは基本的に昇順専用であるため、大きい順に並べたい場合は、後述する「配列のインデックス順序を反転させる手法」を組み合わせるのが実務上の定石です。

2. 構文と戻り値

ArraySort関数の構造は非常にシンプルです。

bool ArraySort(
   void& array[]      // ソート対象の配列(数値型であること)
);

パラメーター

  • array[]: 並び替えたい配列を指定します。double, int, float, long などの数値型の配列である必要があります。多次元配列の場合、第一次元(最初のインデックス)に基づいてソートされます。

戻り値

  • true: ソートが正常に完了した場合。
  • false: 失敗した場合(配列が動的配列でなかったり、非対応の型であった場合など)。

3. 具体的な使い方・実践サンプルコード

以下は、複数のRSI(相対力指数)の値を配列に格納し、それらをソートして「最も低いRSI」と「最も高いRSI」を特定する実践的なスクリプト例です。降順に並び替えるテクニックも盛り込んでいます。

void OnStart()
{
   // 1. サンプルの数値データ(RSIの値など)を格納する配列を作成
   double rsiValues[] = {75.5, 21.2, 50.0, 12.8, 88.3, 45.6};

   // 配列の要素数を取得
   int size = ArraySize(rsiValues);
   Print("--- ソート前 ---");
   for(int i=0; i<size; i++) PrintFormat("Index[%d]: %.1f", i, rsiValues[i]);

   // 2. ArraySortを実行(デフォルトは昇順:小さい順)
   if(ArraySort(rsiValues))
   {
      Print("--- 昇順ソート後 ---");
      for(int i=0; i<size; i++) PrintFormat("Index[%d]: %.1f", i, rsiValues[i]);

      // 最小値はインデックス0、最大値は最後のインデックスになる
      PrintFormat("最小値: %.1f, 最大値: %.1f", rsiValues[0], rsiValues[size-1]);
   }

   // 3. 【応用】降順(大きい順)にしたい場合
   // ArraySetAsSeriesを使用して、配列のインデックス方向を逆転させる
   ArraySetAsSeries(rsiValues, true);

   Print("--- 降順(大きい順)として扱う ---");
   for(int i=0; i<size; i++) PrintFormat("Index[%d]: %.1f", i, rsiValues[i]);
   // これにより、Index[0]が最大値になる
}

4. 使用上の注意点とよくあるエラー

開発時にハマりやすいポイントを整理しました。

  1. 文字列(string)配列はソート不可
    ArraySortは数値型専用です。通貨ペア名などの文字列をアルファベット順に並べたい場合は、自作のソートアルゴリズム(バブルソートやクイックソートなど)を実装する必要があります。
  2. 多次元配列の挙動
    二次元配列(例:data[10][2])をソートすると、最初の次元([0][0], [1][0], [2][0]...)の値に基づいて行全体が移動します。特定の列を基準にしたい場合は、構造体(struct)配列の使用を検討してください。
  3. ArraySetAsSeriesの混同
    ArraySetAsSeriesは「物理的なデータの並び」を変えるのではなく、「インデックスの参照順」を変えるだけの関数です。ArraySortを実行した後にArraySetAsSeries(array, true)を呼び出すことで、擬似的に降順アクセスを実現するのが最も効率的です。
  4. 動的配列のメモリ確保
    要素がゼロの動的配列に対してArraySortを実行してもエラーにはなりませんが、当然結果は得られません。事前にArrayResizeや値の代入が行われているか確認してください。

5. 【重要】自動売買における約定スピードと環境の罠

どれほど優れたアルゴリズムをMQL5で組み上げ、ArraySortで高速にデータを処理したとしても、実行環境が「自宅のPC」であればその努力は水の泡になる危険性があります。FXの自動売買において、プログラムの計算速度以上に収益を左右するのが、ブローカーのサーバーまでのネットワーク遅延(レイテンシ)です。

自宅の一般的なネット回線では、数ミリ秒から数十ミリ秒の遅延が常に発生し、さらにOSのアップデートや急な通信不安定によるリスクを排除できません。相場急変時にコンマ数秒の注文遅延が発生すれば、本来得られるはずだった利益がスリッページによって削られ、最悪の場合は致命的な損失につながります。プロのクオンツエンジニアが共通して「VPS(仮想専用サーバー)」を利用するのは、物理的にブローカーのサーバーに近いデータセンターにEAを置くことで、約定スピードを極限まで高め、通信の安定性を確保するためです。本気で勝てるシステムを目指すなら、専用VPSの導入は避けて通れない必須条件と言えます。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

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