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

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

MQL5におけるCopyRates関数は、指定した通貨ペアや時間足のヒストリカルデータ(始値、高値、安値、終値、時間、スプレッド、ティックボリュームなど)を取得し、MqlRates構造体の配列にコピーするための非常に重要な関数です。

実務開発において、MT5のEA(エキスパートアドバイザー)やインジケーターを作成する際、現在の価格だけでなく「過去数本前のローソク足の形状」や「上位足のトレンド」を確認するプロセスは不可欠です。CopyRatesは、単一の価格データだけでなく、ローソク足に含まれる全ての情報をパッケージで取得できるため、テクニカル指標の計算や独自のロジック判定の基盤となります。

初心者が特につまずきやすいのは、「データの同期(準備)」「配列の並び順」です。MT5はメモリ節約のために必要なデータしかロードしないため、関数を呼び出した瞬間にデータが準備できていない場合があります。また、取得した配列が「古い順」なのか「新しい順」なのかを正しく制御しないと、インデックスの指定ミスによる誤発注を招くことになります。


2. 構文と戻り値

CopyRatesには、取得方法の違いにより3つのオーバーロード(書き方)が存在します。最も一般的に使われるのは「開始位置と個数を指定する方法」です。

基本的な構文(開始位置と個数を指定する場合)

int  CopyRates(
   string           symbol_name,       // 通貨ペア名(NULLで現在のチャート)
   ENUM_TIMEFRAMES  timeframe,         // 時間足(PERIOD_CURRENTで現在の時間足)
   int              start_pos,         // 開始インデックス(0が最新のバー)
   int              count,             // コピーする個数
   MqlRates         rates_array[]      // 格納先のMqlRates型配列
   );

戻り値

  • 成功時: コピーされた要素の数(int型)を返します。
  • 失敗時: -1 を返します。詳細なエラー内容は GetLastError() 関数で確認できます。

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

以下は、最新のローソク足3本分を取得し、直近の終値をログに出力する実用的なコード例です。

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   // MqlRates構造体の配列を宣言
   MqlRates rates[];

   // 配列を時系列順(インデックス0を最新のバー)に設定
   ArraySetAsSeries(rates, true);

   // データのコピー(現在の通貨ペア、現在の時間足、最新から3本分)
   int copied = CopyRates(_Symbol, _Period, 0, 3, rates);

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

   // 取得したデータの活用例
   double lastClose = rates[0].close;    // 最新の確定(または形成中)の終値
   double prevClose = rates[1].close;    // 1本前の終値
   datetime lastTime = rates[0].time;    // 最新バーの時間

   // ログ出力
   PrintFormat("最新バー時刻: %s, 現在の終値: %.5f, 1本前の終値: %.5f", 
               TimeToString(lastTime), lastClose, prevClose);

   // ロジック例:1本前の終値が2本前より高ければ買い検討など
   if(rates[1].close > rates[2].close)
   {
      // ここにエントリーロジックを記述
   }
}

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

1. ArraySetAsSeriesを忘れない

デフォルトの状態では、配列のインデックス [0] は最も古いデータ(過去)を指します。MT4の感覚で「[0] が最新のバー」として扱うには、必ず ArraySetAsSeries(rates, true) を実行して配列の順序を反転させる必要があります。

2. 履歴データの不足

EAの起動直後や、バックテストの開始直後は、指定した期間のデータがローカルPCにダウンロードされていないことがあります。この場合、CopyRatesは -1 を返すか、要求した数よりも少ない数しかコピーしません。実運用では copied < count の場合に処理をスキップするなどのガードが必要です。

3. メモリ消費の管理

毎ティック数万本のデータを CopyRates で取得するのは非効率です。必要な本数(例えば移動平均線の期間分 + 数本程度)だけを取得するように設計しましょう。

4. 実行エラー 4401 (ERR_HISTORY_NOT_FOUND)

これはヒストリーデータが準備できていない際に出る代表的なエラーです。チャートを手動でスクロールしてデータを読み込ませるか、プログラム側で数回リトライする処理を検討してください。


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

アルゴリズムトレードにおいて、CopyRatesで完璧なロジックを組んだとしても、実行環境が適切でなければ「絵に描いた餅」に終わります。多くの開発者が陥る致命的な罠が、自宅のPCや一般的な光回線での運用です。FXの世界では1ミリ秒(1000分の1秒)の遅延が、本来得られるはずだった有利な価格(約定レート)を逃し、スリッページによる損失を蓄積させます。

特にMT5はマルチスレッドで動作し、高速なデータ処理が可能ですが、ネットワークの物理的な距離(レイテンシ)だけはソフトウェア側で解決できません。東京の自宅からロンドンやニューヨークにあるブローカーのサーバーへ注文を出す際、家庭用回線ではジッター(遅延の揺らぎ)が激しく、相場急変時の絶好のチャンスで約定拒否や大きなスリッページを招くリスクが極めて高いのが現実です。プロのクオンツエンジニアが例外なく専用のVPS(仮想専用サーバー)を利用するのは、物理的な距離を縮め、24時間365日、ミリ秒単位で安定した約定スピードを確保することが「勝つための最低条件」であることを知っているからです。本格的なシストレ運用を目指すなら、ネットワーク遅延という技術的負債を解消するVPSの導入は、戦略構築と同じくらい優先すべき投資と言えるでしょう。

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

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

コメント

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