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株式会社代表取締役。