MT4を使ってプログラムを書いているときに、外部confファイルから文字列を読み込んでプログラムに反映したい時があります。
そんな時は以下がサンプルになりそうです。
[ファイルを開く時の処理の流れ]
1.ファイルを開く → 2.ファイルの読み書きなどの処理 → 3.ファイルを閉じる
1.ファイルを開く
FileOpen関数を利用できます。
FileOpen(ファイル名, モード, 区切り文字)
参考→http://docs.mql4.com/files/fileopen (メタトレーダホームページより)
ちなみに、フォルダ体系は ¥experts¥files の中のファイル以外は利用できないので注意が必要です。
また、モードは、ファイルの形式と、読み書きの指定です。モードの指定は以下の4つがあります。
FILE_BIN :バイナリファイル
FILE_CSV : CSV ファイル
FILE_READ :読み込み
FILE_WRITE :書き込み ( 新規作成、追加 )
読み込みと書き込みは同時に設定することが可能です。
書き込み時のFILE_WRITE はファイルが存在しない場合は、指定のファイル名で新規作成してくれます。
区切り文字は、CSVファイルの時のみ有効で、未指定の場合 , が自動的に設定されます。
そしてこの関数を使用することにより、ファイルの番号が取得できるので、その番号を覚えておく変数を指定して使用します。
以下例:
int filehandle=FileOpen(filename,FILE_WRITE|FILE_CSV);
if(filehandle<0)
{
Print("うまく開けない ");
Print("Error codeはこちら: ",GetLastError());
}
2.ファイルの読み書きなどの処理
FileWrite関数が利用できます。以下例
FileWrite(filehandle,TimeCurrent(),Symbol(),PERIOD_CURRENT);
http://docs.mql4.com/files/filewrite
ファイルの読み取りはもう少し複雑です。
読み取る対象のデータが文字列なのか、数値なのかで使う関数が分かれています。
A.数値の場合 → FileReadNumber(filehandle) 戻り値が読みだしたデータになります。
B.文字列の場合→ FileReadString(filehandle, int length=0) 同上.
文字列の場合はlengthに読み出す文字列の最大値を設定しておきます。
では例文。
//csv かつ fileの読み込み。 かつ は パイプ 「|」 を利用します。
int filehandle = FileOpen("file1.csv",FILE_CSV | FILE_READ , ',' );
int x = FileReadNumbver(filehandle);
double y = FileReadNumber(filehandle);
string s = FileReadString(filehandle);
FileClose(filehandle);
3.ファイルクローズ
FileClose(filehandle);
常にfilehandleを利用して読み書きするところがコツ。
<<追記>>
Windows 7 の場合、外部ファイルの場所がexpert\filesではない場合があるみたいです。
私の場合以下でした。
C:\Users\user\AppData\Roaming\MetaQuotes\Terminal\9E530F0D9ED94EDA29D4132137F69589\tester\files
tester使ってテストしているためかもしれません。
そんな時は以下がサンプルになりそうです。
[ファイルを開く時の処理の流れ]
1.ファイルを開く → 2.ファイルの読み書きなどの処理 → 3.ファイルを閉じる
1.ファイルを開く
FileOpen関数を利用できます。
FileOpen(ファイル名, モード, 区切り文字)
参考→http://docs.mql4.com/files/fileopen (メタトレーダホームページより)
ちなみに、フォルダ体系は ¥experts¥files の中のファイル以外は利用できないので注意が必要です。
また、モードは、ファイルの形式と、読み書きの指定です。モードの指定は以下の4つがあります。
FILE_BIN :バイナリファイル
FILE_CSV : CSV ファイル
FILE_READ :読み込み
FILE_WRITE :書き込み ( 新規作成、追加 )
読み込みと書き込みは同時に設定することが可能です。
書き込み時のFILE_WRITE はファイルが存在しない場合は、指定のファイル名で新規作成してくれます。
区切り文字は、CSVファイルの時のみ有効で、未指定の場合 , が自動的に設定されます。
そしてこの関数を使用することにより、ファイルの番号が取得できるので、その番号を覚えておく変数を指定して使用します。
以下例:
int filehandle=FileOpen(filename,FILE_WRITE|FILE_CSV);
if(filehandle<0)
{
Print("うまく開けない ");
Print("Error codeはこちら: ",GetLastError());
}
2.ファイルの読み書きなどの処理
FileWrite関数が利用できます。以下例
FileWrite(filehandle,TimeCurrent(),Symbol(),PERIOD_CURRENT);
http://docs.mql4.com/files/filewrite
ファイルの読み取りはもう少し複雑です。
読み取る対象のデータが文字列なのか、数値なのかで使う関数が分かれています。
A.数値の場合 → FileReadNumber(filehandle) 戻り値が読みだしたデータになります。
B.文字列の場合→ FileReadString(filehandle, int length=0) 同上.
文字列の場合はlengthに読み出す文字列の最大値を設定しておきます。
では例文。
//csv かつ fileの読み込み。 かつ は パイプ 「|」 を利用します。
int filehandle = FileOpen("file1.csv",FILE_CSV | FILE_READ , ',' );
int x = FileReadNumbver(filehandle);
double y = FileReadNumber(filehandle);
string s = FileReadString(filehandle);
FileClose(filehandle);
3.ファイルクローズ
FileClose(filehandle);
常にfilehandleを利用して読み書きするところがコツ。
<<追記>>
Windows 7 の場合、外部ファイルの場所がexpert\filesではない場合があるみたいです。
私の場合以下でした。
C:\Users\user\AppData\Roaming\MetaQuotes\Terminal\9E530F0D9ED94EDA29D4132137F69589\tester\files
tester使ってテストしているためかもしれません。