2024.10
林貴晴/AMSER Inc.
MetaTrader 5(MT5)は、使用している証券会社の過去データを自動でインストールされるため、利便性が大幅に向上しています。複雑な過去データのインポート作業が不要で、データの信頼性も向上が期待できます。
一方、MetaTrader 4(MT4)にはCSV形式で過去データをエクスポートする機能があります。これにより、任意のタイミングでデータを取り出し、外部ツールを使って独自の分析を行うことができます。残念ながら、MT5にはこのエクスポート機能が搭載されていないため、出力方法が必要です。
MT4からエクスポートしたデータは、ExcelやPythonで多様な分析に活用可能です。Excelを使用すると時系列分析や基本的な統計指標の計算が手軽に行え、データをグラフ化することで視覚的に理解を深めやすくなります。また、Pythonを使えばより詳細な解析が可能で、「TA-Lib」などのライブラリを用いることで、KAMAやMAMAといった高度なテクニカルインジケーターを使用したテクニカル分析が実現できます。
MT5で四本値(始値、高値、安値、終値)とボリュームをCSVで書き出す方法
今回は、MT5で四本値とボリュームをCSVで書き出す方法について解説します。
MT5やMT4ではボリュームとしてティックボリュームが提供されているため、実際の取引量ではなく「ティック数」を示している点に注意が必要です。
input datetime Start = D'2024.01.01 00:00'; // 開始日時 input datetime End = D'2024.1.31 23:59'; // 終了日時 void OnInit() { // 出力ファイル名 通貨ペア 期間 拡張子 string FileName = (string)_Symbol + "_" + (string)_Period + ".csv"; // ファイルを開く int Handle = FileOpen(FileName, FILE_WRITE | FILE_CSV | FILE_ANSI); // CSVのヘッダー書き込み FileWrite(Handle, "Time,Open,High,Low,Close,Volume"); // ヒストリカルデータ格納用変数を配列で宣言 MqlRates rates[]; // rates変数にヒストリカルデータをコピー int bars = CopyRates(_Symbol, _Period, Start, End, rates); // ファイルの書き込み for(int i = 0; i < bars; i++) { FileWrite(Handle, StringFormat("%s,%f,%f,%f,%f,%d", TimeToString(rates[i].time, TIME_DATE | TIME_MINUTES), rates[i].open, rates[i].high, rates[i].low, rates[i].close, rates[i].tick_volume)); } // 終了処理 FileClose(Handle); Print("作成完了:ファイル(F) -> データフォルダーを開く(D) MQL5 / Files /" + FileName); ExpertRemove(); }
特定のタスクやアクションを一度だけ実行したい場合には、スクリプトを使用します。
しかし、スクリプトではinputのようなパラメーター変更ができないため、今回のコードはEAとして作成しました。
出力するファイル名は通貨ペア名と時間足で構成しています。
MT5の時間足はMT4と異なり、単純な「分」の数で表されていません。
分単位(M1~M30)は分の数で表されますが、時間足や日足(H1~D1)は「16384+時間」、週足は32769、月足は49153といった数字になります。
その理由は二進数に変換するとわかりやすくなります。最初の2桁で分、時間、週、月を管理しているからです。
例)
M1 | 0000 0000 0000 0001 = 1 |
H1 | 0100 0000 0000 0001 = 16385 (16384 + 1) |
D1 | 0100 0000 0001 1000 = 16408 (16384 +24) |
W1 | 1000 0000 0000 0001 = 32769 (32768 + 1) |
M1 | 1100 0000 0000 0001 = 49153 (49152 + 1) |
時間換算表
MT4 | MT5 | |
---|---|---|
M1 | 1 | 1 |
M2 | 2 | |
M3 | 3 | |
M4 | 4 | |
M5 | 5 | 5 |
M6 | 6 | |
M10 | 10 | |
M12 | 12 | |
M15 | 15 | 15 |
M20 | 20 | |
30 | 30 | |
H1 | 60 | 16385 |
H2 | 16386 | H3 | 16387 |
H4 | 240 16388||
H6 | 16390 | |
H8 | 16392 | |
H12 | 16396 | |
Daily | 144 | 16408 |
Weekly | 10080 | 32769 |
Monyhly | 43200 | 49153 |
MQL5の特徴的な使い方として、MqlRates構造体でrates[]配列を宣言し、CopyRates()関数を使用してfrom_dateからto_dateまでの四本値とボリュームをすべて配列に代入しています。
MqlRates構造体は以下のメンバーになります。
struct MqlRates { datetime time; double open; double high; double low; double close; long tick_volume; int spread; long real_volume; };
CSVの作成には行数の制限がないため、時間はかかりますが、20年分の1分足データのような大量のデータでも書き込むことが可能です。AccessやPower Query、Pythonではそのまま扱えますが、Excelには約104万行の上限があるため、上限を超える場合は新しいデータが読み込まれません。特に、長期間の1分足や5分足データでは上限を超えることがあるため注意が必要です。
今回のコード例では、MT5で四本値とティックボリュームをCSVに出力する方法と、MT5の時間足の数字がMT4とは異なる設計である理由について解説しました。MQL5では構造体の配列に過去データを一括で代入できるため、使い方を理解すれば、MQL4よりも非常に簡単に扱えます。本記事が、MT4からMT5への移行や活用のための実践的な手引きとして、読者の取引環境の改善に役立つことを願っています。
林 貴晴(AMSER株式会社代表取締役)
内資系薬品会社で約10年勤務の後、
外資系製薬会社(現IQVIA及びGSK)で合計約10年を勤務
その後EA AMSERを開発し、その成績を評価され、株式会社ゴゴジャンの部長として抜擢。
現在はAMSER株式会社代表取締役。