1. CopyHigh関数の概要と実務での活用法
MQL5のCopyHigh関数は、指定した通貨ペアおよび時間足の「高値(High)」データを取得し、配列に格納するための非常に重要な関数です。MQL4ではiHigh関数を使って1本ずつ取得するのが一般的でしたが、MQL5ではCopyHighを使って一定期間のデータをまとめて配列にコピーする手法が標準となっています。
実務においては、主に以下のようなシーンで活用されます。
– ブレイクアウト戦略: 直近数本のローソク足の最高値を更新したかどうかの判定。
– トレーリングストップ: 過去N日間の高値を基準にした損切りラインの引き上げ。
– カスタムインジケータ: ドンチャンチャネル(ハイローバンド)などの計算。
初心者が特につまずきやすいのは、「配列の並び順」と「データの同期」です。MQL5の動的配列はデフォルトでは「古い順(左から右)」に格納されますが、チャートの感覚(右端が最新)で扱おうとするとインデックスの指定ミスが発生します。また、ヒストリカルデータが読み込まれていない状態で呼び出すと、期待したデータが取得できずロジックが破綻するリスクがあります。
2. 構文と戻り値
CopyHigh関数には、取得方法の違いにより3つのオーバーロード(定義)が存在しますが、最も汎用的な「開始位置と個数を指定する方法」の構文は以下の通りです。
int CopyHigh(
string symbol_name, // 通貨ペア名(NULLで現在のチャート)
ENUM_TIMEFRAMES timeframe, // 時間足(PERIOD_CURRENTで現在の足)
int start_pos, // 開始位置(0が最新の足)
int count, // コピーする個数
double high_array[] // コピー先の配列(double型)
);
戻り値
- 成功時: コピーされた要素の個数を返します。
- 失敗時:
-1を返します。
取得に失敗した場合は、GetLastError()関数を呼び出すことで「データがまだ準備できていない(4401エラー等)」などの具体的な原因を特定できます。
3. 具体的な使い方・実践サンプルコード
以下は、直近3本のローソク足の高値を取得し、現在の価格がその最高値を上回った場合にログ出力するシンプルなEAの例です。
void OnTick()
{
// 高値を格納するための動的配列
double highValues[];
// 配列を時系列順(最新の足がインデックス0)に設定
ArraySetAsSeries(highValues, true);
// 現在の通貨ペア、現在の時間足で、最新(0)から3本分の高値を取得
int copied = CopyHigh(_Symbol, _Period, 0, 3, highValues);
// データの取得に失敗した場合は処理を中断
if(copied < 3)
{
Print("データの取得に失敗しました。エラーコード:", GetLastError());
return;
}
// 1本前、2本前、3本前の高値を取得(0は現在の形成中の足)
double lastHigh1 = highValues[1];
double lastHigh2 = highValues[2];
double lastHigh3 = highValues[3];
// 直近3本の最高値を算出
double maxHigh = MathMax(lastHigh1, MathMax(lastHigh2, lastHigh3));
// 現在価格(Bid)を取得
double currentBid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
// ブレイクアウト判定
if(currentBid > maxHigh)
{
Print("直近3日間の最高値を更新しました! 現在値:", currentBid, " 最高値:", maxHigh);
}
}
4. 使用上の注意点とよくあるエラー
1. ArraySetAsSeriesの忘れ
MQL5の配列は、デフォルトでは [0] が最も古いデータになります。チャートの「右端から数える」感覚でプログラミングを行う場合は、必ず ArraySetAsSeries(array, true) を実行して、インデックス0が最新の足になるように設定してください。
2. 配列外参照(アウトオブバウンド)
CopyHighで指定した個数分、実際にデータがコピーされたか必ず戻り値を確認してください。ヒストリーデータが不足している場合、指定した個数よりも少ない数しかコピーされず、配列の存在しないインデックスにアクセスしてEAが強制停止する原因になります。
3. 初期化時の空振り
EAの起動直後は、ターミナルがヒストリカルデータをサーバーからダウンロードしている最中のことがあります。このとき CopyHigh は -1 や 0 を返すため、エラーハンドリングを適切に行い、データが準備できるまで待機するロジックが必要です。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、CopyHighなどで算出された「価格の優位性」を利益に変えるためには、ロジックと同じくらい「執行環境」が重要です。多くの開発者が自宅のPCでMT5を稼働させますが、これはプロの視点から見ると非常にリスクが高い行為です。家庭用インターネット回線は、ブローカーの取引サーバーとの間に数百ミリ秒単位の物理的な距離(ネットワーク遅延)を生じさせます。
この遅延(レイテンシ)は、注文を出してから約定するまでの間に価格が滑る「スリッページ」の直接的な原因となります。特にボラティリティが高い局面では、せっかくCopyHighで精緻に計算したエントリポイントも、手元に届く情報の遅れと注文の遅れによって、致命的な損失を生むノイズへと変わります。極限まで約定スピードを高め、エッジを維持するには、取引サーバーに物理的に近いデータセンターに設置された専用VPS(仮想専用サーバー)の利用が不可欠です。インフラを軽視するエンジニアが、シビアなクオンツの世界で生き残ることは困難です。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント