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

1. MT5CopyRatesFrom関数の概要と実務での活用法

MQL5でシステムトレード(EA)を開発する際、最も頻繁に利用するのが価格データ(始値、高値、安値、終値、時間、スプレッド等)の取得です。その中核を担うのがCopyRates関数(およびPython等から操作する際のcopy_rates_from)です。

この関数は、指定した通貨ペアや時間足のヒストリカルデータを、構造体配列(MqlRates型)に一括してコピーする役割を持ちます。

実務での活用シーン

  • マルチタイムフレーム分析: 現在のチャートとは別の時間足(例:1分足のEAで1時間足のトレンドを確認する)のデータを取得する。
  • カスタムインジケーターの計算: 組み込みインジケーターを使わず、独自のロジックで過去n本分の価格推移を計算する。
  • 動的なボラティリティ判断: 直近の数本のロウソク足からATR(真の実質変動幅)に近い数値を自前で算出する。

実務でつまずきやすいポイント

初心者が最も苦労するのは、「データの同期」「配列の向き」です。MT5はメモリ節約のため、チャートに表示されていない過去データはサーバーから呼び出されるまで存在しません。関数を呼び出した瞬間にデータが準備できていないと、意図した本数が取得できず、計算エラーを引き起こす原因となります。


2. 構文と戻り値

MQL5におけるCopyRatesの代表的な構文は以下の通りです。

int  CopyRates(
   string           symbol_name,       // 通貨ペア名(NULLで現在のチャート)
   ENUM_TIMEFRAMES  timeframe,         // 周期(PERIOD_M15, PERIOD_H1など)
   datetime         start_time,        // コピー開始日(この時間から過去へ遡る)
   int              count,             // コピーする個数
   MqlRates         rates_array[]      // コピー先の構造体配列
   );

パラメーター解説

  1. symbol_name: “USDJPY”などの文字列。_Symbolを指定すると現在のチャートになります。
  2. timeframe: PERIOD_H1のように指定。_Periodで現在の時間足になります。
  3. start_time: どの時点からデータを取得したいかを指定します。
  4. count: 取得したいロウソク足の「本数」です。
  5. rates_array[]: MqlRatesという専用の型で宣言された配列を渡します。

戻り値

  • 成功時: コピーされた要素の数(通常はcountで指定した値)を返します。
  • 失敗時: -1 を返却します。エラーの詳細は GetLastError() 関数で確認できます。

3. 具体的な使い方・実践サンプルコード

以下は、現在のチャートにおける「1つ前の確定足」から「3本分」のデータを取得し、それぞれの終値を表示するEAのサンプルコードです。

//+------------------------------------------------------------------+
//|                                              SampleCopyRates.mq5 |
//+------------------------------------------------------------------+
#property strict

void OnTick()
{
    // 価格データを格納するための構造体配列を宣言
    MqlRates rates[];

    // 配列を時系列順(最新がインデックス0)に並び替える
    // これを行わないと、古い順([0]が最も過去)になるため注意
    ArraySetAsSeries(rates, true);

    // データのコピーを実行
    // 第3引数に TimeCurrent() を指定することで、現在の時刻から過去へコピーする
    int copied = CopyRates(_Symbol, _Period, TimeCurrent(), 3, rates);

    // エラーチェック
    if(copied <= 0)
    {
        Print("データの取得に失敗しました。エラーコード: ", GetLastError());
        return;
    }

    // データの読み取り例
    // rates[0] は現在形成中の足(未確定)
    // rates[1] は1つ前の確定足
    double lastClose = rates[1].close;
    double prevClose = rates[2].close;
    datetime lastTime = rates[1].time;

    PrintFormat("シンボル: %s | 確定足終値: %f | 1つ前の確定足終値: %f | 時刻: %s", 
                _Symbol, lastClose, prevClose, TimeToString(lastTime));
}

4. 使用上の注意点とよくあるエラー

① 配列の時系列フラグ(ArraySetAsSeries)

デフォルトの状態では、配列のインデックス [0] は取得した中で「最も古いデータ」を指します。MT4の感覚や一般的なテクニカル分析の考え方(最新が0)に合わせるには、必ず ArraySetAsSeries(rates, true) を実行してください。これを忘れると、最新足のデータを見ているつもりが数本前のデータを見ていた、というロジックミスに繋がります。

② ヒストリカルデータの不足

EAを稼働させた直後や、新しい時間足のデータを取得しようとした際、CopyRatesが期待した数(count)を返さないことがあります。これはMT5がバックグラウンドでデータをダウンロード中だからです。実戦的なEAでは、copied < count の場合に処理をスキップするか、リトライする処理を入れるのが定石です。

③ メモリ管理

大量のデータ(例:10万本など)を頻繁に CopyRates で取得すると、メモリを圧迫しPCの動作が重くなります。必要な本数だけを最小限に取得する設計を心がけてください。


5. 【重要】自動売買における約定スピードと環境の罠

自動売買プログラムにおいて、コードの最適化以上に収益を左右するのが「実行環境」です。自宅のデスクトップPCや一般的なノートPCでEAを稼働させることは、プロのクオンツの視点からは極めてリスクが高い行為と言わざるを得ません。家庭用インターネット回線は数ミリ秒〜数十ミリ秒のネットワーク遅延(レイテンシ)を抱えており、このわずかな遅れが「スリッページ」を引き起こし、バックテストでは勝てているロジックを実運用で破綻させます。

特に、相場急変時のボラティリティが高い局面では、ミリ秒単位の注文遅延が致命的な約定価格の乖離を招きます。また、Windowsの自動更新による予期せぬ再起動や停電、Wi-Fiの瞬断など、自宅環境には自動売買を停止させる物理的リスクが散在しています。プロレベルの約定スピードと24時間の安定稼働を確保するためには、取引サーバーに物理的に近いデータセンターに設置された「専用のVPS(仮想専用サーバー)」の利用が不可欠です。インフラへの投資を惜しむことは、シストレにおける期待値を自ら削る行為であると認識すべきです。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

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