【移植#17】CSVスナップショット出力 — MT5の過去バーをExcelへ定期連携¶

この記事の3行まとめ
- DDEが得意な最新Tickではなく、直近100本のOHLCVをExcelで扱えるCSVへ書き出します
- ファイル全体を定期的に置き換えるため、追記式で起きやすい重複行や形成中バーの更新漏れを防げます
- EURUSD・1時間足の実MT5で、100行すべてが一意かつ時刻順に並ぶことを確認しました
今回の原典は「過去バーをExcelへ渡す」インジケータ¶
投稿日順では2009年12月29日にWindows用ユーティリティの紹介がありますが、MQLの移植対象ではないため、次のコード題材である12月30日の記事へ進みます。
原典が扱ったのは、MetaTraderの価格データをExcelへ渡す方法です。DDEはTickごとの最新値を受け取る用途には便利ですが、「5分足を過去100本」のようなまとまった時系列を渡す用途には向きません。そこで、指定本数のバーをCSVへ定期出力するインジケータが作られました。
今回のMQL5版では、その目的を保ちながら、ファイル更新とデータ確定の境界を明確にしました。
| 区分 | 内容 |
|---|---|
| 元記事の目的 | 指定本数の価格バーをCSVへ継続出力する |
| 元記事の設定 | 出力本数と、追加する2通貨ペアを指定できる |
| 今回の基本動作 | チャート通貨のOHLCVを一定秒数ごとに書き直す |
| 今回の追加 | 確定足/形成中バーの選択、共有フォルダ、UTF-8、入力検証、状態パネル |
| 重複対策 | 末尾へ追記せず、最新スナップショット全体で置き換える |
| 確認できること | CSVの行数、順序、一意性、画面とCSVの最新OHLCの一致 |
| 確認できないこと | Excel側の分析精度や、このデータを使った売買の収益性 |
DDEとCSVは得意な役割が違う¶
両者は競合するというより、渡したいデータの形が違います。
| 方法 | 得意なデータ | 長所 | 注意点 |
|---|---|---|---|
| DDE | BidやAskなどの最新値 | 更新が軽く、セルへ直接反映しやすい | まとまった過去バーの受け渡しには工夫が必要 |
| CSV | OHLCVの時系列 | Excel、Python、BIツールなどから読みやすい | ファイルの読み直しタイミングを決める必要がある |
今回のCSVは1通貨・1時間足につき1ファイルです。列は次の9項目に固定しました。
ファイル名には通貨ペアと時間足が入ります。EURUSD・1時間足なら、17_CSV_Updater_EURUSD_PERIOD_H1.csvです。
追記ではなく「スナップショット置換」にした理由¶
定期出力には、大きく2つの方式があります。
追記式¶
新しいバーだけをファイル末尾へ追加する方式です。書き込み量は少なくなりますが、再起動時に最後の時刻を正しく復元しないと重複しやすく、形成中バーを含める場合は同じ行を更新する処理も必要です。
スナップショット式¶
毎回、直近N本を古い順に書き直す方式です。今回は初期値が100本なので、5秒ごとの書き直しでも負荷は小さく、常に「指定本数・時刻順・重複なし」の形へ戻せます。
処理の流れは次のとおりです。
CopyRates()で直近N本を取得する- CSVを
FILE_WRITEで開き、既存内容を置き換える - ヘッダーと価格バーを古い順に書く
FileFlush()で書き込みを反映し、すぐ閉じる- タイマーで同じ処理を繰り返す
MQL5のFileOpen()はファイルサンドボックス内だけを扱い、FILE_COMMONを付けると複数のMT5から使える共通領域へ保存します。また、FileWrite()はCSVの区切り文字と改行を自動で追加します。
MQL5実装で押さえた6点¶
1. OnTimer()で相場のTick有無から切り離した¶
書き出しの契機はOnCalculate()だけに頼らず、EventSetTimer()とOnTimer()を使いました。相場のTickが少ない時間でも、設定した秒数で更新を試みます。
初回だけはOnCalculate()からも呼び、履歴準備後にすぐ最初のCSVを作ります。タイマー側は履歴取得が一時的に失敗しても、次回また試行します。
2. 初期値では確定足だけを出力した¶
InpIncludeCurrentBar=falseでは、CopyRates()の開始位置を1にします。バー0は形成中でOHLCや出来高が変化し続けるため、Excelで再現可能な分析をしたい場合は確定足が安全です。
ライブ監視で最新の形成中バーも必要なら、この入力をtrueに変更できます。スナップショット式なので、次回更新時に同じ時刻の行が新しい値へ置き換わります。
3. CopyRates()の取得件数を必ず確認した¶
要求した本数の履歴がまだ揃っていなくても、取得できた件数が1以上ならその分を出力します。0以下ならファイルを書き換えず、エラー番号をログと状態パネルへ残します。
これにより、履歴取得失敗時に正常だったCSVを空ファイルで上書きする事故を避けています。
4. 価格桁数を銘柄ごとに取得した¶
追加通貨を有効にすると、チャート通貨とは桁数が違う場合があります。各銘柄のSYMBOL_DIGITSを取得し、DoubleToString()でその桁数へ整形してから出力します。
USDJPYとEURUSDを同時出力しても、3桁・5桁の違いを保てます。
5. ファイルを短時間だけ開く¶
書き込み後はFileFlush()を呼び、直ちにFileClose()します。常時ハンドルを保持しないため、Excelなど別アプリがファイルを読む時間を長く確保できます。
ただし、Excelがファイルを排他的にロックしている間は更新に失敗する場合があります。その場合は、直接編集せず「データの取得」機能で読み込むか、Excel側で別ブックへ取り込んでください。
6. チャート上で動作状態を確認できるようにした¶
状態パネルには、ファイル名、行数、更新間隔、確定足モード、最新バー時刻、OHLC、成否を表示します。CSVを開かなくても、最後の更新が成功したかを確認できます。
専用MT5での動作確認¶
売買を行わない専用テストMT5へ配置し、実際に3回の更新を完了させました。
| 項目 | 設定・結果 |
|---|---|
| 通貨ペア・時間足 | EURUSD・1時間足 |
| 出力本数 | 100本 |
| 更新間隔 | 5秒 |
| バーモード | 確定足のみ |
| 実行中の更新成功 | 初回+タイマー2回 |
| CSVデータ行 | 100行 |
| 一意な時刻 | 100件 |
| 時刻順 | 全行が古い順に単調増加 |
| 最新バー | 2026年7月17日 22:00 |
| 最新OHLC | 1.14353 / 1.14414 / 1.14339 / 1.14408 |
| 読み込み済みバー | 10,000本 |
| キャプチャ | 成功、エラー0 |
| コンパイル | 0 errors / 0 warnings |
実際に生成された先頭と末尾は、次の形式でした。
Date,Time,Open,High,Low,Close,TickVolume,Spread,RealVolume
2026.07.13,19:00,1.14015,1.14026,1.13828,1.13887,4820,0,0
...
2026.07.17,22:00,1.14353,1.14414,1.14339,1.14408,1244,0,0
画像内の最新OHLCとCSV末尾が一致し、100件の時刻に重複がないことも別途検査しています。画像はMT5から直接取得したGreen on Blackの実チャートです。
パラメータ¶
| パラメータ | 初期値 | 説明 |
|---|---|---|
InpOutputBars | 100 | 1ファイルへ出力するバー本数 |
InpIncludeCurrentBar | false | 形成中バーを含めるか |
InpRefreshSeconds | 5 | CSVを書き直す間隔(秒) |
InpUseCommonFolder | true | 複数MT5で共通のFiles領域を使うか |
InpUseOutput1 | false | 追加通貨1の出力を有効にするか |
InpOutputPair1 | USDJPY | 追加通貨1 |
InpUseOutput2 | false | 追加通貨2の出力を有効にするか |
InpOutputPair2 | EURUSD | 追加通貨2 |
追加通貨も時間足はチャートと同じです。ブローカーが銘柄名へ接頭辞・接尾辞を付けている場合は、気配値表示と同じ名前を指定してください。
出力本数は1〜100,000、更新間隔は1〜3,600秒の範囲です。大量のバーを短い間隔で出力するとディスク負荷が増えるため、Excel分析なら100〜1,000本、5〜60秒程度から始めるのが無難です。
Excelでの読み込み方¶
ExcelではCSVをダブルクリックして直接編集するより、「データ」タブからテキスト/CSVとして取り込む方が、更新との相性がよくなります。
- MT5でインジケータをチャートへ適用する
- 状態パネルが
OKになったことを確認する - Excelの「データ」から対象CSVを選ぶ
- 必要ならクエリの更新間隔を設定する
CSVの日時は、MT5が保持するバー時刻です。日本時間へ変換する場合は、ブローカーのサーバー時刻と夏時間の扱いを別途確認してください。
ダウンロード¶
17_CSV_Snapshot_Exporter_v1_00.mq5 をダウンロード
MT5のIndicatorsへ保存してコンパイルし、出力したい通貨・時間足のチャートへ適用してください。初期値では共通のFiles領域へCSVを作成します。InpUseCommonFolder=falseにすると、そのMT5固有のMQL5/Filesへ保存します。
ロジック評価の結論¶
原典の「DDEでは渡しにくい過去バーをCSVで連携する」という考え方は、現在のMQL5でも実用的です。特に、ExcelやPython側で直近のOHLCVを定期集計したいとき、通信機能やDLLを追加せずに受け渡せるのが強みです。
今回の再構成では、追記量の少なさよりも、毎回同じ本数・古い順・重複なしへ戻ることを優先しました。100行を3回更新した実測でも、行数、時刻の一意性、並び順、最新OHLCの一致を確認できました。
これは価格データの受け渡しを安定させる道具です。CSVを使った指標や売買ルールの有効性は保証しないため、分析結果を取引へ使う場合は、時刻変換、欠損バー、スプレッド、手数料を含めて別途検証してください。
前後の記事¶
次: 【移植#18】FirstとPrevious — インジケータの参照順をMQL5で可視化