Скачать MetaTrader 5

Чтение из файла

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Artem Mordvinkin
1092
Artem Mordvinkin 2013.08.12 21:43 
Всем привет! Прошу помощи: можно ли прочитать из файла значения (числа) и присвоить эти значения переменным? Если можно, то как (загрузка через "Параметры" не в счет)?
Anatoli Kazharski
58031
Anatoli Kazharski 2013.08.12 21:49  
Forex_Noob:
Всем привет! Прошу помощи: можно ли прочитать из файла значения (числа) и присвоить эти значения переменным? Если можно, то как (загрузка через "Параметры" не в счет)?
Например, вот так: Рецепты MQL5 - Разработка мультивалютного эксперта с неограниченным количеством параметров
Artem Mordvinkin
1092
Artem Mordvinkin 2013.08.12 22:36  
Artem Mordvinkin
1092
Artem Mordvinkin 2013.08.16 14:06  

Есть проблема: не читает в массив double per[1000] числа с запятой.. ну например 0.62 игнорируется:(

Сейчас приведу пример кода (по частям):

double per[1000];
.......

//--- Откроем файл для чтения из общей папки терминала
      int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName4,FILE_READ|FILE_WRITE|FILE_ANSI|FILE_COMMON);
//--- Если хэндл файла получен
   if(file_handle!=INVALID_HANDLE)
     {
      ulong  offset =0; // Смещение для определения положения файлового указателя
      string text ="";  // В эту переменную будем записывать прочитанную строку
      //--- Читать, пока текущее положение файлового указателя не окажется в конце файла или программа не будет удалена
      while(!FileIsEnding(file_handle) || !IsStopped())
        {
         //--- Читать до конца строки или пока программа не будет удалена
         while(!FileIsLineEnding(file_handle) || !IsStopped())
           {
            //--- Прочитаем всю строку
            text=FileReadString(file_handle);
            //--- Получим положение указателя
            offset=FileTell(file_handle);
            //--- Переход на другую строку, если это не конец файла
            //    Для этого увеличим смещение указателя файла
            if(!FileIsEnding(file_handle))
               offset++;
            //--- Переведем его на следующую строку
            FileSeek(file_handle,offset,SEEK_SET);
            //--- Если строка не пустая
            if(text!="")
              {
               //--- Увеличим счетчик строк
               strings_count++;
               //--- Увеличим размер массива строк,
               ArrayResize(temporary_symbols,strings_count);
               //--- Запишем прочитанную строку в текущий индекс
               temporary_symbols[strings_count-1]=text;
              }
            //--- Выйдем из вложенного цикла
            break;
           }
         //--- Если это конец файла прервем основной цикл
         if(FileIsEnding(file_handle))
            break;
        }
      //--- Закроем файл
      FileClose(file_handle);}
 
//------------------Присваиваем элементам массива значения.......
  int h;
   for (h=0;h<strings_count;h++)
{per[h]=temporary_symbols[h];}

 

 Сами значения из файла выглядят так:

 62

0.62

62

0.62

62

0.62

62

0.62 

Так вот, при работе с этими значениями, десятичные проглатываются, т.е. происходит не последовательное присвоение значений, а распознаются только целые. Такое впечатление, что они не читаются при открытии файла... Но, если записать значения массива в другой текстовый файл, то десятичные там присутствуют...  Может они не распознаются как числа, а остаются текстом??? Вообщем где-то трабла... Хелп

Документация по MQL5: Основы языка / Операции и выражения / Операции присваивания
Документация по MQL5: Основы языка / Операции и выражения / Операции присваивания
  • www.mql5.com
Основы языка / Операции и выражения / Операции присваивания - Документация по MQL5
Igor Konyashin
3122
Igor Konyashin 2013.08.16 14:10  
temporary_symbols какого типа?
Andrew Petras
4672
Andrew Petras 2013.08.16 14:12  
StringToDouble?
Igor Konyashin
3122
Igor Konyashin 2013.08.16 14:13  
Silent:
StringToDouble?
Да, ее надо юзать.
Artem Mordvinkin
1092
Artem Mordvinkin 2013.08.16 14:16  
i_logic:
Да, ее надо юзать.
  int h;
   for (h=0;h<strings_count;h++)
{per[h]=StringToDouble(temporary_symbols[h]);}

Так?

ЗЫ  temporary_symbols символьная

Igor Konyashin
3122
Igor Konyashin 2013.08.16 14:18  
Forex_Noob:

Так?

ЗЫ  temporary_symbols символьная

Да, я уже догадался что  temporary_symbols это массив строк.

Кстати, думаю можно одним массивом per обойтись, без temporary_symbols. Сразу считывайте строку, ковертируйте ее с помощью StringToDouble, и пишите в массив per.

Artem Mordvinkin
1092
Artem Mordvinkin 2013.08.16 14:20  
i_logic:

Да, я уже догадался что  temporary_symbols это массив строк.

Кстати, думаю можно одним массивом per обойтись, без temporary_symbols.

Не фига не получается... :( Т.е. теперь десятичные стали не с точкой, а с запятой, но резалт тот же... Эти десятичные - параметры индюков... И индюки их не видят:(
Igor Konyashin
3122
Igor Konyashin 2013.08.16 14:21  
Forex_Noob:
Не фига не получается... :( Т.е. теперь десятичные стали не с точкой, а с запятой, но резалт тот же... Эти десятичные - параметры индюков... И индюки их не видят:(
По поводу десятичного разделителя вот не знаю... Это надо идти в Панели Управления в винде настраивать (точку ставить вместо запятой) или где в MQL можно задать десятичный разделитель. В американском стандарте десятичный разделитель это точка.
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий