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

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

MQL5において、ティックデータ(価格の最小変動単位)を取得するための核となるのがCopyTicks関数です。Pythonなどの外部ライブラリではcopy_ticks_fromという名称で馴染みがあるかもしれませんが、MQL5のEA開発においてはCopyTicks関数がその役割を担います。

この関数は、指定した銘柄の過去のティック履歴を「MqlTick構造体」の配列として一括取得するものです。

実務での活用法と「つまずきポイント」

通常のシストレでは「1分足の終値」などでロジックを組みますが、スキャルピングやHFT(高頻度取引)、または詳細なバックテスト分析を行うクオンツ的なアプローチでは、ローソク足に集約される前の生の値動き(ティック)が不可欠です。

実務開発で多くのエンジニアがつまずくのは、以下の2点です。
1. データ量の制御: ティックデータは膨大です。数日分取得しようとするだけでメモリを圧迫し、ターミナルの動作を重くします。
2. 同期のタイムラグ: 履歴サーバーからデータをダウンロードする際、データが準備できていないと空の配列が返ることがあります。

これらを理解し、適切に「必要な分だけ」を取得して処理することが、プロレベルのEA開発への第一歩となります。


2. 構文と戻り値

MQL5におけるティック取得関数の基本的な構文は以下の通りです。

int  CopyTicks(
   string           symbol_name,           // 銘柄名
   MqlTick&         ticks_array[],         // データを格納する配列
   uint             flags=COPY_TICKS_ALL,  // 取得するデータの種類
   ulong            from=0,                // 開始日時(ミリ秒単位)
   uint             count=0                // 取得するティック数
   );

パラメーター解説

  • symbol_name: “USDJPY”などの通貨ペア名。_Symbolで現在のチャート銘柄を指定できます。
  • ticks_array[]: MqlTick型の動的配列。ここに取得したデータが格納されます。
  • flags: 取得したいデータの種類。通常は COPY_TICKS_ALL(全データ)を使用しますが、COPY_TICKS_INFO(Bid/Askのみ)など制限をかけることで高速化も可能です。
  • from: 取得を開始する時間をミリ秒(1970/1/1からの経過時間)で指定します。
  • count: 取得したいティックの個数。fromと組み合わせて、ある時点から「何個分」を取得するかを決定します。

戻り値

  • 成功時: 配列にコピーされたティックの個数を返します。
  • 失敗時: -1を返します。失敗の理由はGetLastError()関数で確認できます。

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

以下に、最新の100ティックを取得し、直近の価格変動を分析するための実用的なテンプレートコードを示します。

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

// ティックデータを表示するだけの簡単なEA例
void OnTick()
{
   // MqlTick構造体の動的配列を宣言
   MqlTick tick_array[];

   // 取得したい銘柄と個数を設定
   string symbol = _Symbol;
   uint   count  = 100; // 直近100ティック

   // CopyTicksを呼び出す(フラグにCOPY_TICKS_ALLを指定)
   // 戻り値は実際に取得できたティック数
   int copied = CopyTicks(symbol, tick_array, COPY_TICKS_ALL, 0, count);

   // データの取得に成功したかチェック
   if(copied > 0)
   {
      // 例として、最新のティックと100個前のティックの価格差を計算
      double price_diff = tick_array[copied-1].bid - tick_array[0].bid;

      PrintFormat("%s: %d 個のティックを取得。直近Bid: %.3f, 変動幅: %.3f", 
                  symbol, copied, tick_array[copied-1].bid, price_diff);

      // tick_array[copied-1] が最新のデータ
      // tick_array[0]        が指定範囲の中で最も古いデータ
   }
   else
   {
      // 取得失敗時のエラーハンドリング
      Print("ティックデータの取得に失敗しました。エラーコード: ", GetLastError());
   }
}

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

① 配列の時系列順序に注意

CopyTicksで取得される配列は、[0]が最も古く、[末尾]が最新のデータになります。CopyRates(ローソク足取得)などでArraySetAsSeriesを使っている場合、混乱が生じやすいため、常にインデックスと時間の関係を意識してください。

② 履歴の同期待ち

MT5を起動した直後や、新しい銘柄のティックを取得しようとする際、ローカルPCにデータが存在しない場合があります。この場合、関数を呼び出しても戻り値が0になることがあります。実運用では「取得できるまで数回リトライする」か「次回のオンティックで再試行する」ロジックが必要です。

③ メモリ管理

countに大きな値を指定しすぎると、EAのメモリ消費が劇的に増加します。特にバックテストではなくリアルタイム動作用のEAでは、必要な最小限のティック数(例:直近1,000件など)に絞って取得するのがクオンツエンジニアとしての鉄則です。


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

ティック単位の緻密なアルゴリズムを組み上げたとしても、それを実行する「環境」が貧弱であれば、その努力はすべて水泡に帰します。FXの自動売買において、最も致命的なリスクは戦略のミスではなく「ネットワーク遅延(レイテンシ)」です。

自宅のPCから一般的なインターネット回線を通じて注文を出す場合、数ミリ秒から数百ミリ秒の遅延が発生します。ティックが激しく動くボラティリティの高い局面では、このわずかな遅延の間に価格が滑り(スリッページ)、バックテストでは利益が出ていたロジックが現実には損失を積み上げる「負のスパイラル」に陥ります。約定スピードを極限まで高め、物理的な距離による損失を回避するには、取引サーバーの至近距離に配置された専用のVPS(仮想専用サーバー)の利用が必須です。プロのクオンツ環境において、VPSは単なる「便利ツール」ではなく、勝つための「必須装備」であることを忘れないでください。

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

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

コメント

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