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を使わないと、このロジックは再現できません。

コメント