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

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

MQL5におけるCustomRatesUpdateは、「カスタム銘柄(Custom Symbol)」の価格ヒストリー(バーデータ)を追加または更新するための関数です。

MT5(MetaTrader 5)の最大の強みの一つは、標準的な通貨ペア以外に、自分自身で定義した独自のチャートデータを作成できることです。例えば、「日経225とTOPIXの差分チャート」や「仮想通貨取引所の外部データを取り込んだチャート」などを作成する際、この関数を使って過去データを流し込みます。

実務での活用シーン

  • 合成チャートの作成: 複数通貨を組み合わせたインデックスのバックテスト。
  • 外部データのインポート: CSVなどで取得した他社レートや、オプション価格などの非標準データの可視化。
  • バックテストの精度向上: 特殊な期間区切りや、独自のフィルタリングをかけたバーデータでの検証。

初心者が特につまずきやすいのは、「既存の業者提供銘柄(例:USDJPY)のデータを上書きしようとして失敗する」点です。この関数はあくまでCustomSymbolCreateで作成した「カスタム銘柄」に対してのみ有効であることを覚えておいてください。


2. 構文と戻り値

CustomRatesUpdate関数の基本的な構文は以下の通りです。

int CustomRatesUpdate(
   const string           symbol,       // カスタム銘柄名
   const MqlRates&        rates[],      // 更新するレートデータの配列
   uint                   count=WHOLE_ARRAY // 更新するデータの個数
);

パラメーター解説

  1. symbol: データを更新したいカスタム銘柄の名称です。
  2. rates[]: MqlRates構造体の配列です。ここにtime(時間)、openhighlowclosetick_volumespreadreal_volumeを格納して渡します。
  3. count: 配列のうち、何個のデータを使用するかを指定します。デフォルトのWHOLE_ARRAYは配列の全要素を意味します。

戻り値

  • 成功時: カスタム銘柄のヒストリーに追加・更新されたバーの数が返されます。
  • 失敗時: -1が返されます。エラーの詳細はGetLastError()で確認可能です。

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

以下は、EURUSDのデータを元に「MY_EURUSD」というカスタム銘柄を作成し、過去データをコピーする実践的なスクリプト例です。

//+------------------------------------------------------------------+
//| カスタム銘柄の作成とデータ更新のサンプル                              |
//+------------------------------------------------------------------+
void OnStart()
{
    string customSymbolName = "MY_EURUSD"; // 作成するカスタム銘柄名
    string sourceSymbol = "EURUSD";      // 元にする銘柄名

    // 1. カスタム銘柄が存在しない場合は作成する
    if(!SymbolInfoInteger(customSymbolName, SYMBOL_EXIST))
    {
        if(!CustomSymbolCreate(customSymbolName, "Custom\\Forex", sourceSymbol))
        {
            Print("カスタム銘柄の作成に失敗しました。エラーコード:", GetLastError());
            return;
        }
    }

    // 2. 元となる銘柄からヒストリーデータを取得する
    MqlRates rates[];
    ArraySetAsSeries(rates, false);
    int copiedBars = CopyRates(sourceSymbol, PERIOD_M1, 0, 1000, rates);

    if(copiedBars <= 0)
    {
        Print("元データのコピーに失敗しました。");
        return;
    }

    // 3. カスタム銘柄にデータを流し込む
    // CustomRatesUpdateは、同じ時間のデータがあれば更新、なければ追加を行います
    int updatedCount = CustomRatesUpdate(customSymbolName, rates);

    if(updatedCount > 0)
    {
        Print(customSymbolName, " に ", updatedCount, " 本のバーを正常に更新しました。");

        // チャートに表示させるためにカスタム銘柄を選択状態にする
        SymbolSelect(customSymbolName, true);
    }
    else
    {
        Print("データの更新に失敗しました。エラーコード:", GetLastError());
    }
}

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

① 同時実行のタイミング(同期処理)

CustomRatesUpdateは非同期的に処理される場合があります。大量のデータを更新した直後にそのデータを参照しようとすると、まだMT5側でのデータベース反映が終わっていないことがあります。更新直後のデータ取得には注意が必要です。

② MqlRates構造体の不備

MqlRates配列を渡す際、time(時間)が昇順(古い順)に並んでいることを確認してください。また、カスタム銘柄のプロパティ(桁数やスプレッド設定)が正しく設定されていないと、不自然なチャートが表示される原因になります。

③ 既存データとの重複

CustomRatesUpdateは、すでに存在する時間のバーに対しては「上書き」を行います。もし特定の期間のデータを完全に削除してから入れ替えたい場合は、CustomRatesDelete関数を併用する必要があります。

④ メモリ負荷

数万本単位のバーを頻繁に更新すると、PCのメモリやCPUを大量に消費します。リアルタイムでの更新を行う場合は、必要な分(最新の数本)だけを渡すように設計しましょう。


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

アルゴリズムトレードの世界では、プログラムのロジックと同じか、それ以上に「実行環境」が勝敗を分けます。CustomRatesUpdateを使いこなし、高度なシグナルを生成できたとしても、それを実行する環境が自宅のPCや一般的な光回線であれば、プロのクオンツ勢には到底太刀打ちできません。

FXの自動売買において、注文が取引所のサーバーに届くまでの数ミリ秒(レイテンシ)の遅延は、スリッページを増大させ、期待利得を劇的に押し下げます。特に指標発表時やボラティリティが高い局面では、家庭用回線の不安定さは致命的な損失に直結します。プロレベルの約定スピードと24時間365日の安定稼働を実現するには、ブローカーのデータセンターに物理的に近い場所に設置された「専用のVPS(仮想専用サーバー)」の利用が不可欠です。ネットワーク遅延を極限まで排除した環境を整えることは、手法を磨くこと以前の、トレーダーとしての最低限のたしなみと言えるでしょう。

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

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

コメント

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