【移植#105】同じ高値が並んだら — iHighestの同値選択を実測する¶

この記事の3行まとめ
iHighest()が返すのは最大値の位置ですが、公式リファレンスは同値最大が複数ある場合の選び方を定めていません。- MT5 Build 6230の合成データでは、同じ最高値が3本あるとき shift 1(最新)が返りました。
- 最新か最古かを仕様として固定したいなら、配列を自分で走査して一致条件を書くのが確実です。
元記事で気になった点¶
2010年6月10日の記事「バイアスラインを引く。」では、日中高値・安値からラインを作る考え方に加え、同じ高値が複数あるときの扱いにも触れています。元記事の説明では、MQL4の iHighest() が検索範囲内の古い高値を返すことがあり、最新の高値が必要なら自前で探す、という注意でした。
ただし、この選択規則はAPIの仕様として明記されているのでしょうか。MQL5公式リファレンスでは、検索対象・本数・開始位置と「最大値を持つバーのインデックス」は説明されていますが、最大値が複数ある場合の優先順位は説明されていません。そこで、結果を決めつけず、同じデータを使ってMT5上の挙動を確かめます。
同じ最高値を3本置いて試す¶
監査用EAは注文を出さず、専用の合成銘柄にM1バーを8本作ります。最高値 1.20000 は、最新側から数えて shift 1、3、6 の3本に設定しました。shift 0が最新バーです。
| 確認項目 | 結果 |
|---|---|
| 合成バー数 | 8 |
| 最高値 | 1.20000 |
| 同値の位置 | shift 1、3、6 |
iHighest() の戻り値 | shift 1 |
| 自前走査(最新優先) | shift 1 |
| 自前走査(最古優先) | shift 6 |
MT5 Build 6230では、この条件で組み込み関数は最新側の同値を返しました。古いMQL4環境についての元記事の観察と同じ結果になるとは限りません。MT4/MT5の違いや端末ビルドをまたいで同値選択を前提にせず、必要な選び方をコードに表すのが安全です。
最新または最古を明示して探す¶
時系列配列を 0 が最新となる向きで扱う場合、最新優先なら先頭から、最古優先なら末尾から走査します。対象範囲が start から count 本であるとき、概念的には次のようになります。
int FindHighest(const double &values[], const int start,
const int count, const bool newest_first)
{
if(count <= 0)
return -1;
double maximum = values[start];
int selected = start;
int end = start + count;
for(int i = start + 1; i < end; ++i)
{
if(values[i] > maximum ||
(newest_first && values[i] == maximum))
{
maximum = values[i];
selected = i;
}
}
return selected;
}
この例は「最新優先」のとき同値が見つかるたび位置を更新します。一方、最古優先は > のときだけ更新するため、走査順に対して最初に見つけた位置を保ちます。配列の向きが逆なら、走査方向も逆にしてください。実運用の配列では start + count が範囲内か、値が有効かも呼び出し側で確認します。
ダウンロードできるEAは iHighest() の戻り値と両方の明示走査を画面・CSVへ出力します。合成バーを更新するため CustomRatesUpdate() を使い、実際の相場履歴には依存しません。
今回わかったことと限界¶
- MT5 Build 6230のこのテストでは、同値最大のうち最新側が返りました。
- 公式のMQL5リファレンスは同値時の優先順位を保証していません。今回の観測を他ビルド、MT4、すべての端末へ一般化できません。
- 元記事の「バイアスライン」は作者自身が計算式を推測として説明しており、5本のラインの再現に必要な定義も確定できません。今回はそこを完全再現したとは扱わず、原文にある同値高値の注意を独立した検証題材にしました。
- 合成データによるAPI挙動の確認であり、売買成績や相場での有効性を示すものではありません。
同値のどちらを選ぶべきかは、ラインの定義や検出したいイベントによって変わります。重要なのは「たまたま返った位置」を暗黙に使わず、最新・最古など必要な規則を自分で決めておくことです。
参考資料¶
前後の記事¶
前: 【移植#104】前日の高値・安値・中間値を引く — 確定日足の3本線
次: 【移植#106】ブレークポイントで値を追う — PT Multistation記事からMT5デバッガへ