MT4でCSVファイル読み込み
色々なことをやる・やらされると、すぐに色々忘れてしまうのが私です。
今回も、「MT4でのCSVファイルからの読み込み」と同様に、チョー基礎事項。。。
4時間足の本数が変わっていた場合に、CSVファイルから文字列を読み込みたい場合、どうするか。
最初は次のように書いてみた。
int fileHandle; int dailyBarNum = 0; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- fileHandle = FileOpen("test.csv", FILE_CSV|FILE_READ,","); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- FileClose(fileHandle); //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- if(dailyBarNum < iBars(NULL, PERIOD_H4)){ dailyBarNum = iBars(NULL, PERIOD_H4); while(!FileIsEnding(fileHandle)){ string str = FileReadString(fileHandle); Print("**************"+str+"*************"); } } //---- return(0); } //+------------------------------------------------------------------+
これだと、4時間足の本数が変化しても、初回のみ読み込まれて、それ以降は読み込まれない。なぜなら、初回の読み込みでファイルへのポインタが終端に移動しているから。
ローソク足の本数が変化した場合に、再度最初から読み込みたい場合は、FileSeekを使用して、一度読み込んだ後に、ポイントを最初に移動させておく。
int start() { //---- if(dailyBarNum < iBars(NULL, PERIOD_H4)){ dailyBarNum = iBars(NULL, PERIOD_H4); while(!FileIsEnding(fileHandle)){ string str = FileReadString(fileHandle); Print("**************"+str+"*************"); } //SEEK_SET(ファイルの先頭)から0バイトの位置にファイルポインタを移動させる。 FileSeek(fileHandle, 0, SEEK_SET); } //---- return(0); }
これだと、ファイル終端をPrintしてしまうから、ファイルポインタを先頭に移動させるタイミングは変更しないとイケナイ。というわけでこうした。
int start() { //---- if(dailyBarNum < iBars(NULL, PERIOD_H4)){ dailyBarNum = iBars(NULL, PERIOD_H4); while(true){ string str = FileReadString(fileHandle); if(FileIsEnding(fileHandle)) break; Print("**************"+str+"*************"); } } //---- return(0);