Русский

Справочник MQL4 Файловые операции FileWriteInteger

FileWriteInteger

Записывает в bin-файл значение параметра типа int с текущего положения файлового указателя.

uint  FileWriteInteger(
   int  file_handle,        // handle файла
   int  value,              // записываемое значение
   int  size=INT_VALUE      // кол-во байт
   );

Параметры

file_handle

[in]  Файловый описатель, возвращаемый функцией FileOpen().

value

[in]  Целое значение.

size=INT_VALUE

[in]  Количество байт (до 4 включительно), которые нужно записать. Предусмотрены соответствующие константы: CHAR_VALUE=1, SHORT_VALUE=2 и INT_VALUE(LONG_VALUE)=4, таким образом функция может записать целое значение типа char, uchar, short, ushort, int, uint или long.

Возвращаемое значение

В случае удачи функция возвращает количество записанных байт или 0 в случае ошибки. При успешном завершении количество записанных байт равно размеру указанного типа данных. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Файловый указатель перемещается на это же количество байт.

Пример:

//+------------------------------------------------------------------+
//|                                        Demo_FileWriteInteger.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- параметры для получения данных из терминала
input string             InpSymbolName="EURUSD";     // Валютная пара
input ENUM_TIMEFRAMES    InpSymbolPeriod=PERIOD_H1;  // Таймфрейм
//--- параметры для записи данных в файл
input string             InpFileName="Trend.bin";    // Имя файла
input string             InpDirectoryName="Data";    // Имя каталога
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double   close_buff[];
   datetime time_buff[];
   int      size;
//--- установка индексации как в таймсерии
   ArraySetAsSeries(close_buff,true);
   ArraySetAsSeries(time_buff,true);
//--- сбросим значение ошибки
   ResetLastError();
//--- скопируем цену закрытия для каждого бара
   if(CopyClose(InpSymbolName,InpSymbolPeriod,0,1000,close_buff)==-1)
     {
      PrintFormat("Не удалось скопировать значения цен закрытия. Код ошибки = %d",GetLastError());
      return;
     }
//--- скопируем время для каждого бара
   if(CopyTime(InpSymbolName,InpSymbolPeriod,0,1000,time_buff)==-1)
     {
      PrintFormat("Не удалось скопировать значения времени. Код ошибки = %d",GetLastError());
      return;
     }
//--- получим размер буфера
   size=ArraySize(close_buff);
//--- откроем файл для записи значений (если его нет, то создастся автоматически)
   ResetLastError();
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_BIN);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("Файл %s открыт для записи",InpFileName);
      PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
      //--- 
      uint byteswritten;// количество записанных байт
      int   up_down=0;  // флаг тенденции
      int   arr_size;   // размера массива arr
      uchar arr[];      // массив типа uchar
      //--- запишем значения времени в файл
      for(int i=0;i<size-1;i++)
        {
         //--- сравним цены закрытия на текущем и следующем барах
         if(close_buff[i]<=close_buff[i+1])
           {
            if(up_down!=1)
              {
               //--- запишем значение даты в файл, используя FileWriteInteger
               StringToCharArray(TimeToString(time_buff[i]),arr);
               arr_size=ArraySize(arr);
               //--- сначала запишем количество символов в массиве
               byteswritten=FileWriteInteger(file_handle,arr_size,INT_VALUE);
               //--- проверка количества записанных данных
               if(byteswritten!=sizeof(int))
                 {
                  PrintFormat("Ошибка записи данных. Код ошибки=%d",GetLastError());
                  //--- закрываем файл
                  FileClose(file_handle);
                  return;
                 }
               //--- запишем сами символы
               for(int j=0;j<arr_size;j++)
                 {
                  byteswritten=FileWriteInteger(file_handle,arr[j],CHAR_VALUE);
                  //--- проверка количества записанных данных
                  if(byteswritten!=sizeof(char))
                    {
                     PrintFormat("Ошибка записи данных. Код ошибки=%d",GetLastError());
                     //--- закрываем файл
                     FileClose(file_handle);
                     return;
                    }
                 }
               //--- изменим флаг тенденции
               up_down=1;
              }
           }
         else
           {
            if(up_down!=-1)
              {
               //--- запишем значение даты в файл, используя FileWriteInteger
               StringToCharArray(TimeToString(time_buff[i]),arr);
               arr_size=ArraySize(arr);
               //--- сначала запишем количество символов в массиве
               byteswritten=FileWriteInteger(file_handle,arr_size,INT_VALUE);
               //--- проверка количества записанных данных
               if(byteswritten!=sizeof(int))
                 {
                  PrintFormat("Ошибка записи данных. Код ошибки=%d",GetLastError());
                  //--- закрываем файл
                  FileClose(file_handle);
                  return;
                 }
               //--- запишем сами символы
               for(int j=0;j<arr_size;j++)
                 {
                  byteswritten=FileWriteInteger(file_handle,arr[j],CHAR_VALUE);
                  //--- проверка количества записанных данных
                  if(byteswritten!=sizeof(char))
                    {
                     PrintFormat("Ошибка записи данных. Код ошибки=%d",GetLastError());
                     //--- закрываем файл
                     FileClose(file_handle);
                     return;
                    }
                 }
               //--- изменим флаг тенденции
               up_down=-1;
              }
           }
        }
      //--- закрываем файл
      FileClose(file_handle);
      PrintFormat("Данные записаны, файл %s закрыт",InpFileName);
     }
   else
      PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
  }

Смотри также

IntegerToString(), StringToInteger(), Целые типы