1. CopyOpen関数の概要と実務での活用法
CopyOpen関数は、指定した通貨ペアや時間足の「始値(Open Price)」を、過去に遡って配列に取得するためのMQL5組み込み関数です。
実務開発において、始値のデータは非常に重要です。なぜなら、多くの自動売買アルゴリズム(EA)は「ローソク足が確定した瞬間(=新しい足の始値が決定した瞬間)」にエントリーや決済の判断を行うためです。終値(Close)は刻一刻と変化しますが、始値は一度決まればその足の間は固定されるため、バックテストとリアルトレードの乖離(カーブフィッティング)を抑えるためのトリガーとして多用されます。
初心者が特につまずきやすいのは、「配列の並び順(時系列)」と「データの同期」です。これを正しく扱えないと、過去のデータを見ているつもりが最新のデータを見ていた、あるいはデータが取得できていないのに計算を行ってエラーになるといったトラブルを招きます。
2. 構文と戻り値
CopyOpen関数には、取得方法の違いによって3つのオーバーロード(書き方)がありますが、最も一般的に使われる「開始位置と個数を指定する方法」の構文は以下の通りです。
int CopyOpen(
string symbol_name, // 通貨ペア(NULLで現在のチャート)
ENUM_TIMEFRAMES timeframe, // 時間足(PERIOD_CURRENTで現在の時間足)
int start_pos, // 開始位置(0が最新の足)
int count, // 取得する個数
double open_array[] // コピー先の動的配列
);
パラメーター
- symbol_name: 対象の通貨ペア。
_SymbolやNULLを指定すると現在のチャートになります。 - timeframe:
PERIOD_M15(15分足)やPERIOD_H1(1時間足)など。 - start_pos: どの足からコピーを開始するか。
0は現在形成中の足、1は一つ前の確定足です。 - count: 何本分の始値を取得するか。
- open_array[]: 取得したデータを格納する
double型の配列。
戻り値
- 成功した場合:コピーされた要素の数。
- 失敗した場合:
-1。エラーの詳細はGetLastError()関数で確認します。
3. 具体的な使い方・実践サンプルコード
以下は、最新のローソク足3本分(現在足+過去2本)の始値を取得し、簡単なトレンド判定を行うサンプルコードです。
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// 始値を格納するための動的配列
double openPrices[];
// 配列を時系列(最新がインデックス0)に設定
ArraySetAsSeries(openPrices, true);
// 現在の通貨ペア・時間足で、最新から3本分の始値をコピー
int copied = CopyOpen(_Symbol, _Period, 0, 3, openPrices);
// データ取得に成功したかチェック
if(copied < 3)
{
Print("データ取得失敗: ", GetLastError());
return;
}
// 各インデックスのデータ内容:
// openPrices[0] : 現在形成中の足の始値
// openPrices[1] : 1本前の確定足の始値
// openPrices[2] : 2本前の確定足の始値
// 実践的な活用例:単純な上昇傾向の判定
if(openPrices[0] > openPrices[1] && openPrices[1] > openPrices[2])
{
Print("始値が切り上がっています。");
}
// デバッグ出力
Comment("現在の始値: ", openPrices[0]);
}
4. 使用上の注意点とよくあるエラー
1. ArraySetAsSeriesを忘れない
MQL5のデフォルトでは、配列のインデックス[0]は「最も古いデータ」を指します。しかし、トレード戦略では「[0]を最新の足」として扱う方が直感的です。ArraySetAsSeries(open_array, true)を実行し忘れると、インデックスの指定ミスによる誤発注の原因となります。
2. 配列は必ず「動的配列」を使う
double openPrices[10];のようにサイズを固定した配列ではなく、double openPrices[];と宣言した動的配列を渡してください。CopyOpenは内部で配列サイズを自動的にリサイズします。
3. データ不足(履歴の同期)
MT5を起動した直後や、新しい時間足のデータを初めて取得する場合、ターミナル内に履歴データが準備できていないことがあります。この場合、CopyOpenは期待した数(count)を返しません。必ず戻り値がcountと一致しているか確認する処理を入れてください。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、CopyOpenなどで正確なロジックを組むことは入り口に過ぎません。シストレエンジニアが直面する最大の壁は「ネットワーク遅延(レイテンシ)」です。自宅のPC環境からトレードを行う場合、ブローカーのサーバーとの通信に数十〜数百ミリ秒の遅延が発生します。このわずかな遅延が、相場急変時のスリッページを引き起こし、期待した価格での約定を妨げ、理論上の利益を削り取ってしまいます。
特にティック単位で判断を行うMQL5の世界では、物理的な距離によるタイムロスは致命的です。プロレベルの約定スピードを確保し、ロジック通りのパフォーマンスを発揮させるためには、取引サーバーに物理的に近いデータセンターに設置された「専用のVPS(仮想専用サーバー)」の使用が不可欠です。安定した24時間稼働と極限の低レイテンシ環境を整えることは、手法の開発以上に、勝ち続けるための前提条件と言えるでしょう。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント