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 // 更新するデータの個数
);
パラメーター解説
- symbol: データを更新したいカスタム銘柄の名称です。
- rates[]:
MqlRates構造体の配列です。ここにtime(時間)、open、high、low、close、tick_volume、spread、real_volumeを格納して渡します。 - 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を使わないと、このロジックは再現できません。

コメント