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

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: 対象の通貨ペア。_SymbolNULLを指定すると現在のチャートになります。
  • 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を使わないと、このロジックは再現できません。

コメント

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