MQL4MQL5 スクリプト ファイル・データ保存
ローソク足のデータを CSV に書き出したい
結論:FileOpen() に FILE_WRITE | FILE_CSV を付けて開き、FileWrite() で1行ずつ書き、最後に FileClose() します。
考え方
MT4・MT5 のチャートのデータを CSV に書き出すと、Excel や Python で分析できます。FileWrite() は値を区切り文字でつないで1行書き、改行も自動で付けます。ここでは直近 N 本の時刻・4本値・出来高を CSV に書き出すスクリプトを例にしています。ファイルは MQL4(MQL5)フォルダの中の Files フォルダに保存されます。
- FileOpen(ファイル名, FILE_WRITE | FILE_CSV | FILE_ANSI, ',') でカンマ区切りの CSV を開く
- 見出しの行を書き、古い足から順に1行ずつ FileWrite() で書く
- FileClose() で閉じる
そのまま使えるコード
MetaEditor の「新規作成」で「スクリプト」を選び、できたファイルの中身をすべてこのコードに置き換えてコンパイル(F7)します。ファイルは Scripts フォルダに保存され、ナビゲーターからチャートにドラッグして使います。
MQL4・MQL5 共通
#property strict
#property script_show_inputs
// 直近 N 本のローソク足を CSV に書き出すスクリプト
input int InpBars = 1000; // 書き出す本数
void OnStart()
{
string file = _Symbol + "_" + EnumToString((ENUM_TIMEFRAMES)_Period) + ".csv";
int h = FileOpen(file, FILE_WRITE | FILE_CSV | FILE_ANSI, ',');
if(h == INVALID_HANDLE)
{
Print("ファイルを開けません error=", GetLastError());
return;
}
FileWrite(h, "time", "open", "high", "low", "close", "volume");
int n = MathMin(InpBars, iBars(_Symbol, PERIOD_CURRENT) - 1);
for(int i = n; i >= 1; i--) // 古い足から順に(確定足だけ)
FileWrite(h, TimeToString(iTime(_Symbol, PERIOD_CURRENT, i)),
DoubleToString(iOpen(_Symbol, PERIOD_CURRENT, i), _Digits),
DoubleToString(iHigh(_Symbol, PERIOD_CURRENT, i), _Digits),
DoubleToString(iLow(_Symbol, PERIOD_CURRENT, i), _Digits),
DoubleToString(iClose(_Symbol, PERIOD_CURRENT, i), _Digits),
iVolume(_Symbol, PERIOD_CURRENT, i));
FileClose(h);
Print(n, " 本を Files フォルダの ", file, " に書き出しました(ファイル→データフォルダを開く で確認)");
}MT4 版・MT5 版とも MetaEditor でコンパイル(エラー・警告なし)を確認済みです。実際の口座で使う前に、デモ口座やストラテジーテスターで動作を確かめてください。
カスタマイズのポイント
- Excel で文字化けしないよう FILE_ANSI(Shift_JIS)にしています。UTF-8 にしたいときは FILE_ANSI を外し、FileOpen の最後の引数に CP_UTF8 を指定します。
- 追記したいときは FILE_READ | FILE_WRITE で開き、FileSeek(h, 0, SEEK_END) で末尾に移動してから書きます。
注意点
- Files フォルダの外(デスクトップなど)には直接書き込めません。
- ストラテジーテスターでは、テスター専用の Files フォルダに保存されます。
このコードで使っている関数
うまく動かないときに出やすいエラー
あわせて読みたいレシピ
「ファイル・データ保存」のレシピ一覧
- ローソク足のデータを CSV に書き出したい
- CSV ファイルを読み込みたい
- ターミナルを再起動しても値を残したい
- エントリーしたときのチャートを画像で残したい












