コンテンツにスキップ

【移植#44】Homeキー連打を卒業 — MT5のM1履歴を3通貨ずつ順番に同期する

EURUSDのH1チャート上でEURUSD・GBPUSD・USDJPYのM1履歴を順番に同期し3件完了したMT5画面

この記事の3行まとめ

  • MT4時代のHomeキー疑似連打を、MT5のCopyRates()による履歴要求へ置き換えました
  • 3通貨を同時に走らせず、1件ずつ同期してバー数・同期状態・失敗をパネル表示します
  • MT5実機では8回の要求で3/3通貨が完了し、最少6,440本のM1履歴を確認できました

今回の原典は「仮想洗濯ばさみ」のEA版

投稿日順で次に当たる2010年2月2日の記事は、MT4で1分足履歴を効率よく取得するHistoryDownloaderEAを紹介していました。

元記事「1分足を効率よくDLするHistoryDownloaderEA/洗濯ばさみ再考。」を読む

当時の発想は、Homeキーを一定間隔で押し続け、チャートを過去へスクロールさせることで履歴を取得するというものです。「仮想洗濯ばさみ」という呼び名どおり、キーを押しっぱなしにする操作をプログラムへ任せていました。

原典では、スクリプト版をEAへ作り直すことでProfileへ保存しやすくし、大量のチャートを扱う場合は1枚ずつ順番に処理しています。表示される主な情報は、取得バー数、キー操作回数、停止判定までのカウント、経過時間、時間足でした。

キー入力に頼る実装は少々力技ですが、次の設計は現在でも参考になります。

  • 進捗を数値で見えるようにする
  • 複数の対象を一度に動かさず、1件ずつ処理する
  • 一定の完了条件を満たしたら自動で次へ進む
  • 更新が止まった対象をいつまでも待ち続けない

今回はこの骨格を残し、履歴取得部分をMT5の標準APIへ置き換えました。


MT5では画面操作ではなく時系列APIへ要求する

MT5では、プログラムから必要な通貨と時間足のデータを要求できます。

MQL5公式のCopyRates()資料では、指定した通貨・時間足の価格データがローカルにない場合、サーバーからのダウンロードや時系列構築が開始されると説明されています。

そのため、Homeキーを押してチャートを左へ送る必要はありません。今回の中心処理は次の1行です。

C++
const int copied =
   CopyRates(symbol_name, InpTargetPeriod, 0, InpTargetBars, rates);

ただし、インジケーターから呼び出した場合、履歴がまだ準備できていなければすぐに必要本数が返るとは限りません。要求を送ったあと、ターミナル側の同期が進み、次回以降の呼び出しで取得数が増える場合があります。

そこで配布版は、1秒タイマーで同じ対象を再確認します。Sleep()でインジケーター全体を止めるのではなく、短い処理を繰り返す形です。


履歴取得の前にMarket Watchへ追加する

別通貨の履歴を要求する前に、対象通貨を利用可能な状態にします。

C++
if(!SymbolSelect(symbol_name, true))
{
   g_last_errors[index] = GetLastError();
   g_states[index] = STATE_FAILED;
}

SymbolSelect()の公式資料では、trueを指定すると通貨をMarket Watchへ追加するとされています。

配布版では、まず入力された名前と完全一致する通貨を探します。見つからなければ全通貨からベース名を含むものを探すため、EURUSD.amEURUSDのような一般的な接頭辞・接尾辞にも対応できます。

解決した実際の通貨名はパネルへ表示します。自動検出に任せきりにせず、意図した銘柄が選ばれたか目で確認できるようにしました。


「取得できた」と「同期済み」を分けて確認する

要求本数が返っただけで完了にせず、次の3条件を確認します。

  1. CopyRates()の取得数が目標本数以上
  2. SERIES_BARS_COUNTが目標本数以上
  3. SERIES_SYNCHRONIZEDが真

履歴状態はSeriesInfoInteger()の公式資料にあるプロパティで取得します。

C++
SeriesInfoInteger(symbol_name, InpTargetPeriod,
                  SERIES_BARS_COUNT, bars_value);
SeriesInfoInteger(symbol_name, InpTargetPeriod,
                  SERIES_SYNCHRONIZED, synchronized_value);

さらに初期値では、3条件が2回連続で成立してからREADYへ進めます。一瞬だけ条件を満たした状態を拾うのではなく、短い安定確認を挟むためです。


1件ずつ進める状態機械

初期設定の対象は次の3通貨です。

Text Only
EURUSD,GBPUSD,USDJPY

各対象は次の4状態を持ちます。

状態 意味
PENDING まだ処理していません
SYNCING 履歴を要求し、同期状態を確認中です
READY 目標本数と同期条件を満たしました
FAILED 通貨選択失敗または試行上限に達しました

現在の対象がREADYまたはFAILEDになってから、次の通貨へ進みます。複数通貨へ同時に重い要求を投げない点は、原典の「片方がダウンロード中なら、もう片方は待つ」という考え方を引き継ぎました。

最大試行回数も設けています。接続切れやサーバー側の履歴不足があっても、永久待機にはなりません。


同じ通貨・同じ時間足への装着を避ける

MQL5公式の時系列データアクセス解説では、インジケーターが自分自身と同じ通貨・同じ時間足の履歴更新を要求することは望ましくないと説明されています。履歴更新とインジケーター処理が同じスレッドで動くためです。

配布版はM1履歴を要求する初期設定なので、M1以外のチャートへ装着してください。今回の検証ではEURUSDのH1チャートを使いました。

もしEURUSDのM1チャートへ装着したまま、対象にEURUSD、時間足にM1を指定すると、初期化を拒否します。動くかもしれない状態へ賭けず、危険な組み合わせを明示的に止める設計です。


入力パラメーター

パラメーター 初期値 役割
InpSymbolsCSV EURUSD,GBPUSD,USDJPY カンマ区切りの対象通貨、最大8件
InpTargetPeriod PERIOD_M1 同期する時間足
InpTargetBars 5000 各通貨で必要な最低取得本数
InpStableChecks 2 完了条件を連続確認する回数
InpMaxAttemptsPerSymbol 60 1通貨あたりの最大試行回数
InpShowPanel true 進捗パネルの表示

対象通貨を増やすほど完了まで時間がかかります。最初は3通貨程度で動きを確認し、必要な通貨だけに絞るのがおすすめです。


MT5実機で3通貨を検証

専用MT5へ配布インジケーターと独立検証EAを配置し、コンパイルから画面取得まで通して確認しました。

コンパイル結果

対象 エラー 警告
配布インジケーター 0 0
独立検証EA 0 0

実行条件

項目
MT5 Build 5836
装着チャート EURUSD H1
同期対象 EURUSD / GBPUSD / USDJPY
対象時間足 M1
目標本数 各5,000本
安定確認 2回

実測結果

通貨 構築済みM1バー CopyRates()取得 同期
EURUSD 10,005本 5,000本 YES
GBPUSD 6,440本 5,000本 YES
USDJPY 7,609本 5,000本 YES

全体では、対象3件、完了3件、同期3件、Market Watch選択3件、失敗0件でした。履歴要求は合計8回、完了判定まで8秒で、3通貨中の最少バー数は6,440本です。

画面撮影は完了判定後に行っているため、パネル上の経過表示は9秒になっています。実行ログと画面の1秒差は撮影待ちによるものです。

この結果は、検証時の接続先から取得できた履歴です。ほかの業者や口座でも同じ本数になることを保証するものではありません。


パネルの読み方

各通貨の行には、次の順で情報を表示します。

Text Only
入力名 -> 解決後の通貨名  bars=構築済み本数  copied=取得数  sync=同期  状態

確認したいポイントは次のとおりです。

  • 解決後の通貨名が意図した銘柄か
  • copiedが目標本数へ達しているか
  • sync=YESになっているか
  • 最終状態がREADY
  • PROGRESSが対象件数と一致しているか
  • FAILEDが発生していないか

一部だけFAILEDになる場合は、その通貨名が存在するか、接続中か、サーバーに十分な履歴があるかを確認してください。


ダウンロードと使い方

44_MT5_M1_History_Sync_Monitor_v1_00.mq5 をダウンロード

MT5のIndicatorsへ保存してコンパイルし、M1以外のチャートへ適用してください。初期設定のままなら、EURUSDのH1チャートで確認できます。

必要に応じて対象通貨、時間足、目標本数を変更します。通貨はカンマで区切り、最大8件まで指定できます。

パネルがALL TARGET HISTORIES READYになれば、指定本数の取得と同期確認が完了です。Market Watchへ追加した通貨は自動削除しないため、不要なら確認後に手動で整理してください。


使えないこと・注意点

  • サーバーが保有していない過去データを作り出すことはできません。
  • 取得可能な本数は、業者、口座、接続状態、ターミナル設定によって変わります。
  • CopyRates()の要求本数より多く履歴が構築される場合があります。
  • 自動検出はベース名を含む最初の候補を選びます。似た銘柄が複数ある場合は正確な通貨名を入力してください。
  • 対象通貨はMarket Watchへ追加されますが、終了時に削除しません。
  • CSVや旧MT4のHSTファイルを書き出すツールではありません。
  • Tick履歴ではなく、指定時間足のバー履歴を対象にしています。
  • 大量の通貨や本数を一度に指定すると、通信・メモリ・ディスク負荷が増えます。
  • 売買処理はなく、履歴同期が取引成績を改善することを示すものではありません。

ロジック評価の結論

原典の「仮想洗濯ばさみ」は、画面操作しか入口がなかった時代に、面倒な履歴取得を自動化する工夫でした。キーを連打する部分だけを見ると古く感じますが、進捗表示、順番待ち、自動停止という設計は今でも実用的です。

MT5では、同じ目的を標準の時系列APIで実現できます。画面がどこまでスクロールしたかではなく、取得数と同期フラグを直接確認できるため、完了条件も明確になりました。

今回の移植で残したいのは、「古い操作を忠実に再現すること」ではありません。元の工夫が解決していた問題を見つけ、現在のプラットフォームが持つ狭く安定したAPIへ置き換えることです。洗濯ばさみの役目は終わっても、1件ずつ丁寧に進める考え方は、そのまま使えました。


前後の記事

前: 【移植#43】プロファイル指定でMT5を起動 — ワークスペースを8項目で監査する

次: 【移植#45】MTF補間を確定足だけで再設計 — 30分足バンドを5分足へ滑らかに投影する

— SPONSORED —