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

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

CustomTicksDeleteは、MQL5で作成したカスタムシンボル(ユーザー独自の通貨ペア)のティックデータを、指定した時間範囲で削除するための関数です。

実務開発において、この関数は主に「カスタムデータのクリーニング」や「シミュレーション環境の再構築」に利用されます。例えば、外部からインポートしたヒストリカルデータに異常値(スパイク)が含まれていた場合や、特定の期間のテストデータをやり直したい場合に、古いデータを物理的に取り除くことができます。

初心者が特につまずきやすい点は、この関数が「ブローカーから提供される通常の通貨ペア(USDJPYなど)には一切通用しない」という点です。あくまで自分で作成したカスタムシンボル専用の操作であるため、バックテスト専用の独自インデックス作成や、他市場のデータをMQL5に取り込んで分析するクオンツ的なアプローチにおいて真価を発揮します。

2. 構文と戻り値

CustomTicksDelete関数の仕様は以下の通りです。

long  CustomTicksDelete(
   string           symbol,       // カスタムシンボル名
   long             from_msc,     // 削除開始日時(ミリ秒単位)
   long             to_msc        // 削除終了日時(ミリ秒単位)
   );

パラメーター

  • symbol: データを削除したいカスタムシンボルの名前を指定します。
  • from_msc: 削除する範囲の開始時間を、1970年1月1日からの経過ミリ秒数(Epochミリ秒)で指定します。
  • to_msc: 削除する範囲の終了時間を、ミリ秒単位で指定します。

戻り値

  • 成功した場合:実際に削除されたティックの数が返されます。
  • 失敗した場合:-1が返されます。エラーの詳細は GetLastError() 関数で確認できます。

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

以下は、作成済みのカスタムシンボル「MyCustomFX」から、特定の1時間分のティックデータを削除する実践的なスクリプトの例です。

//+------------------------------------------------------------------+
//| カスタムシンボルのティック削除サンプル                                     |
//+------------------------------------------------------------------+
void OnStart()
{
   string customSymbolName = "MyCustomFX"; // 対象のカスタムシンボル名

   // 削除したい範囲を指定(例:2023年10月1日 00:00:00 ~ 01:00:00)
   datetime fromDate = D'2023.10.01 00:00:00';
   datetime toDate   = D'2023.10.01 01:00:00';

   // MQL5のdatetime(秒単位)をミリ秒単位に変換
   long fromMsc = (long)fromDate * 1000;
   long toMsc   = (long)toDate * 1000;

   // 実行前にユーザーへ確認ログを出力
   PrintFormat("シンボル %s のデータを削除中: %s から %s", 
               customSymbolName, TimeToString(fromDate), TimeToString(toDate));

   // ティック削除の実行
   long deletedCount = CustomTicksDelete(customSymbolName, fromMsc, toMsc);

   // 結果の判定
   if(deletedCount >= 0)
   {
      PrintFormat("成功:合計 %d 件のティックを削除しました。", deletedCount);

      // チャートの表示を更新するためにシンボルを再スキャン
      SymbolInfoSessionQuote(customSymbolName, DAY_OF_WEEK_MONDAY, 0, fromMsc, toMsc);
   }
   else
   {
      int errorCode = GetLastError();
      PrintFormat("エラー:データの削除に失敗しました。コード: %d", errorCode);
   }
}

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

開発時に注意すべきポイントがいくつかあります。

  1. 時間の単位(ミリ秒)に注意:
    MQL5の標準的な datetime 型は「秒単位」ですが、この関数は「ミリ秒単位」を要求します。サンプルコードのように * 1000 を忘れると、意図しない太古の昔のデータ範囲を指定することになり、削除件数が0件のままになります。

  2. カスタムシンボルの選択:
    「気配値表示」ウィンドウに表示されている通常の通貨ペアに対して実行すると、エラー(5040:ERR_CUSTOM_SYMBOL_NOT_FOUNDなど)が発生します。必ず CustomSymbolCreate で作成したシンボルを使用してください。

  3. UIへの反映遅延:
    CustomTicksDelete でデータを削除しても、MT5のチャート表示が即座に更新されないことがあります。この場合、時間足(タイムフレーム)を切り替えるか、シンボルを再読込させる処理が必要になる場合があります。

  4. 削除範囲の重複:
    開始時間(from_msc)が終了時間(to_msc)よりも大きい場合、関数は失敗します。常に過去から未来への範囲を指定してください。

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

アルゴリズムトレードにおいて、ロジックの正確さと同じか、それ以上に重要なのが「実行環境のレイテンシ(遅延)」です。どれほど高度なクオンツ分析を用いてミリ秒単位のティックデータを精査しても、注文を出す環境が自宅のPCであれば、その努力は水の泡になる可能性が高いです。家庭用インターネット回線は、プロバイダー経由の複雑な経路を通るため、証券会社のサーバーに注文が届くまでに数十から数百ミリ秒の遅延が発生し、その間に有利な価格は消滅してしまいます。

FX自動売買で安定した利益を追求するには、証券会社の取引サーバーと同じ、あるいは極めて物理的距離が近いデータセンター内に設置された「専用のVPS(仮想専用サーバー)」の導入が必須です。専用VPSを利用することで、ネットワーク経路が最短化され、スリッページを最小限に抑えた超高速な約定が可能になります。プロのトレーダーにとって、VPSは単なるツールではなく、戦場で勝つための最低限のインフラであることを忘れないでください。

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

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

コメント

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