Чтение данных из *.csv в MT4

 

Добрый день,

подскажите пожалуйста, в МТ5 вот такой код у меня работает и все считывает и отрисовывает:

void Draw_Line(datetime Date1,double Price1,datetime Date2,double Price2)

{

string Line_="ZZ_"+TimeToString(Date2);

ObjectCreate(0,Line_,OBJ_TREND,0,Date1,Price1,Date2,Price2);


int OnInit()

{

handle=FileOpen("My_file.csv",FILE_READ|FILE_CSV|FILE_ANSI);

.........

.........


for(int i=0;i<30;i++)

{

Date1=StringToTime(FileReadString(handle));

Date2=StringToTime(FileReadString(handle));

Price1=StringToDouble(FileReadString(handle));

Price2=StringToDouble(FileReadString(handle));

Draw_Line(Date1,Price1,Date2,Price2);

}

FileClose(handle);

return(0);

}

Файл My_file.csv состоит из четырех колонок две даты и две цены соответственно.

когда я переношу в МТ4 то

Price1=StringToDouble(FileReadString(handle));

не считывает цену... в лучшем случае удалось(при выставлении фиксированной цены Price1=Price2=1.5555 ) и оставлении в файле My_file.csv только двух колонок с датами получить отрезок с датами первой строки. Но дальше цикл не идет. И следующие даты тоже не считывает.

Тоже самое было и в МТ5 пока не добавил "|FILE_ANSI", но в МТ4 такого нет. Экспериментировал и с разными кодировками и *.txt и *.htm итак и сяк. Подскажите пожалуйста что делаю не так?. Опыт программирования небольшой.

 
Учебник в помощь -->Оператор циклa for .
 

У меня вопрос не по оператору цикла, извиняюсь если задал вопрос не корректно. Не работает:

Price1=StringToDouble(FileReadString(handle));

Даже если я в файле оставлю одну цену без оператора "for" и пытаюсь её считать - не получается. Т.е считывание данных, я так понимаю происходит, но в каком-то другом формате и FileReadStrig указатель не перемещает до следующего разделителя или достигнув конца строки - в начало следующей. Я так понимаю в МТ4 нужно делать по другому, но как не знаю...

 

Откройте файл с правильными ключами https://docs.mql4.com/ru/files/FileOpen

Если вы открываете файл для записи чтения то FileReadString не будет передвигать файловый указатель, если только для чтения, то будет.

кроме того указатель будет передвигаться до разделителя (если указали "правильный" разделитель), или до конца строки (если "не правильный").

 

Следующий код чертит отрезок:

Date1=D'2012.02.27 00:00';

Date2=D'2012.02.29 00:00';

Price1=1.5555;

Price2= Price1;

Draw_Line(Date1,Price1,Date2,Price2);



Следующий код не чертит отрезок:

Date1=D'2012.02.27 00:00';

Date2=D'2012.02.29 00:00';

Price1=StringToDouble(FileReadString(handle));

Price2= Price1;

Draw_Line(Date1,Price1,Date2,Price2);

В файле My_file.csv одно единственное число 1.5555. Где собака зарыта?

 
Внимательно курим ДОКУ : StrToDouble
 

FAQ:
Внимательно курим ДОКУ : StrToDouble

Невкурил...

например:

string s= FileReadString(handle);

s должна содержать "1.5555"(если в файле My_file.csv одно единственное число 1.5555) соответственно:

Price1=StringToDouble(s);

Price1 теперь должна содержать число в формате Double. Я не программист и не могу понять в чем ошибка: "Price1=StringToDouble(FileReadString(handle));" Ткните носом пожалуйста.

 

StringToDouble В MQL4 называется StrToDouble(string), а еще желательно ее перед применением пронормализировать : NormaliseDouble(StrToDouble(string),Digits)

ВНИМАТЕЛЬНО ЧИТАЕМ ДОКУ - ТАМ ВСЕ НА РУССКОМ...

 

Да... Надо было в тексте файла в конце строки тоже ставить - ';'. У меня было: "дата;цена;дата;цена" а надо было: "дата;цена;дата;цена;".

FAQ:

Откройте файл с правильными ключами https://docs.mql4.com/ru/files/FileOpen

Если вы открываете файл для записи чтения то FileReadString не будет передвигать файловый указатель, если только для чтения, то будет.

кроме того указатель будет передвигаться до разделителя (если указали "правильный" разделитель), или до конца строки (если "не правильный").

СПАСИБО БОЛЬШОЕ за помощь! Очень помогло!
Причина обращения: