1. ArrayMinimum関数の概要と実務での活用法
MQL5のArrayMinimumは、指定した配列の中から最も小さい値(最小値)を持つ要素の「インデックス(番号)」を探し出すための関数です。
実務レベルのEA(エキスパートアドバイザー)開発において、この関数は非常に頻繁に使われます。例えば、「過去20本足の最安値をストップロスの基準にする」「一定期間内のRSIの底を確認して逆張りのトリガーにする」といったロジックを組む際に必須となります。
初心者が特につまずきやすいポイントは、この関数が「最小値そのもの」ではなく「最小値がある場所(インデックス)」を返すという点です。また、時系列配列(チャートの右側から左へ数える設定)の状態によって、返ってくる番号の意味が変わるため、配列の性質を正しく理解して活用する必要があります。
2. 構文と戻り値
ArrayMinimum関数の基本的な構文は以下の通りです。
int ArrayMinimum(
const void& array[], // 検索対象の配列
int start=0, // 検索を開始するインデックス
int count=WHOLE_ARRAY // 検索する要素の数(デフォルトは全て)
);
パラメーター解説
- array[]: 検索したいデータが入った配列です。double型(価格など)やint型の配列が一般的です。
- start: 検索を始める位置を指定します。「最新の足から3本目以降を探したい」といった場合に調整します。
- count: 検索する範囲(個数)です。例えば「最新20本分だけ」なら20を指定します。
戻り値
- 見つかった最小値のインデックス番号を返します。
- エラーが発生した(配列が空など)場合は
-1を返します。
3. 具体的な使い方・実践サンプルコード
以下のコードは、直近20本のローソク足の中から最安値を探し出し、その価格をチャート上に表示する実践的な例です。
void OnTick()
{
double lowPrices[]; // 安値を格納するための配列
// 時系列(最新の足がインデックス0)として扱う設定
ArraySetAsSeries(lowPrices, true);
// 直近20本分の安値データをコピー
if(CopyLow(_Symbol, _Period, 0, 20, lowPrices) < 20)
{
Print("データの取得に失敗しました");
return;
}
// 20本の中から最小値(最安値)のインデックスを取得
int minIndex = ArrayMinimum(lowPrices, 0, 20);
if(minIndex != -1)
{
double minValue = lowPrices[minIndex]; // インデックスを使って実際の価格を取得
Comment("直近20本の最安値は: ", minValue, " (インデックス: ", minIndex, ")");
}
}
このコードでは、まずCopyLowで価格データを取得し、その後にArrayMinimumを使って「どこが一番安いか」を特定しています。その特定されたインデックスを使って、実際の価格(lowPrices[minIndex])にアクセスするのが定石です。
4. 使用上の注意点とよくあるエラー
開発中に陥りやすいミスがいくつかあります。
-
「値」が返ってくると勘違いする:
double min = ArrayMinimum(array);と書いてしまうと、得られるのは要素番号(0, 1, 2…)であり、価格ではありません。必ずarray[minIndex]のように配列を参照し直してください。 -
ArraySetAsSeriesの影響:
ArraySetAsSeriesをtrueにしている場合とfalseの場合では、インデックス0が指す場所(最新の足か、一番古いデータか)が逆になります。これを確認せずに使うと、意図しない範囲を検索することになります。 -
配列が空の状態での実行:
CopyBufferやCopyLowなどでデータを入れる前にArrayMinimumを実行すると、エラーの原因になります。必ずデータの取得が成功したかチェックする処理を入れましょう。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムのロジックが完璧であっても、それを実行する「環境」が貧弱であれば、勝てる戦略も損失に変わります。特にMQL5でミリ秒単位の優位性を競う場合、自宅PCからの稼働は大きなリスクを伴います。家庭用インターネット回線は、プロバイダーを経由する際に避けられない「ネットワーク遅延(レイテンシ)」が発生し、EAが注文を出してから取引所のサーバーに届くまでに決定的なタイムラグが生じるからです。
この遅延は「スリッページ」を誘発し、バックテストでは利益が出ていたポイントでも実運用では不利な価格で約定してしまう原因となります。極限まで約定スピードを高め、スリッページを最小限に抑えるには、取引サーバーに物理的に近いデータセンター内に設置された「専用のVPS(仮想専用サーバー)」での稼働が必須です。24時間安定した電源供給と高速なバックボーン回線を備えたVPS環境を構築することこそが、クオンツエンジニアとして最初に取り組むべきリスク管理と言えるでしょう。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント