Mql4 дописать в файл
Программы на MQL4 позволяют работать со звуковыми и графическими файлами:
• PlaySound() воспроизводит звуковой файл;
• ObjectCreate() позволяет с помощью графических объектов OBJ_BITMAP и OBJ_BITMAP_LABEL создавать пользовательские интерфейсы.
FileReadInteger
int FileReadInteger(int handle, int size=LONG_VALUE)
Функция читает целое число из текущей позиции бинарного файла. Размер целого числа может быть 1, 2 или 4 байта. Если размер числа не указан, система пытается прочитать как 4-байтовое целое число.
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметры:
handle — Файловый описатель, возвращаемый функцией FileOpen().
size — Формата числа. Может быть CHAR_VALUE(1 байт), SHORT_VALUE(2 байта) или LONG_VALUE(4 байта).
Пример:
Объявление константы
Идентификатор константы подчиняется тем же правилам, что и для имен переменных. Значение может быть любого типа:
Имя ресурса
Необходимо отметить, что при установке объектам OBJ_BITMAP и OBJ_BITMAP_LABEL изображения из ресурса, значение свойства OBJPROP_BMPFILE уже нельзя менять вручную. Например, пусть мы используем для создания OBJ_BITMAP_LABEL ресурсы файлов euro.bmp и dollar.bmp.
Тогда при просмотре свойств этого объекта мы увидим, что свойства BitMap File (On) и BitMap File (Off) имеют серый цвет и недоступны для изменения вручную:
FileReadArray
int FileReadArray(int handle, void array[], int start, int count)
Функция читает указанное число элементов из двоичного файла в массив. Перед чтением данных массив должен быть достаточного размера. Функция возвращает количество фактически прочитанных элементов.
Для того чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметры:
handle — Файловый описатель, возвращаемый функцией FileOpen().
array[] — Массив, куда данные будут загружены.
start — Стартовая позиция для записи в массив.
count — Количество элементов для чтения.
Пример:
Использование ресурсов других mql4-программ
Использование ресурсов имеет и другое преимущество – в любой mql4-программе можно использовать ресурсы из любого файла EX4. Таким образом, ресурсы из одного файла EX4 можно использовать во многих других mql4-программах.
Для того чтобы использовать имя ресурса из стороннего файла, его нужно указать в виде ::. Например, пусть в скрипте Draw_Triangles_Script.mq5 указан ресурс на картинку в файле triangle.bmp:
Тогда его имя для использования в самом скрипте будет выглядеть как "Files\triangle.bmp", а для использования к имени ресурса нужно добавить специальный признак "::".
//--- использование ресурса в самом скрипте
ObjectSetString (0,my_bitmap_name, OBJPROP_BMPFILE ,0, "::Files\\triangle.bmp" );
Чтобы использовать этот же ресурс из другой программы, например, эксперта, нужно к имени ресурса дополнительно добавить путь к EX4-файлу относительно папки каталог_данных_терминала\MQL4\ и имя EX4-файла этого скрипта - Draw_Triangles_Script.ex4 . Пусть скрипт лежит в стандартной папке каталог_данных_терминала\MQL4\ Scripts\, тогда вызов нужно написать таким образом:
//--- использование ресурса скрипта в эксперте
ObjectSetString (0,my_bitmap_name, OBJPROP_BMPFILE ,0, "\\Scripts\\Draw_Triangles_Script.ex4::Files\\triangle.bmp" );
Если при обращении к ресурсу в другом EX4-файле не указать путь к этому исполняемому файлу, то исполняемый файл ищется в той же папке, где находится и обратившаяся за ресурсом программа. Это означает, что если в советнике запрашивается ресурс из файла Draw_Triangles_Script.ex4 без указания пути, например, так:
//--- запрос ресурса скрипта в эксперте без указания пути
ObjectSetString (0,my_bitmap_name, OBJPROP_BMPFILE ,0, "Draw_Triangles_Script.ex4::Files\\triangle.bmp" );
то файл будет искаться в папке каталог_данных_терминала\MQL4\ Experts\, если сам советник находится в папке каталог_данных_терминала\MQL4\ Experts\.
FileWriteDouble
int FileWriteDouble(int handle, double value, int size=DOUBLE_VALUE)
Параметры:
handle — Файловый описатель, возвращаемый функцией FileOpen().
value — Значение двойной точности.
size — Дополнительный флаг формата. Может быть любой из следующих величин:
DOUBLE_VALUE (8 байтов, по умолчанию)
FLOAT_VALUE (4 байта).
Пример:
Работа с пользовательскими индикаторами, подключенными в качестве ресурсов
Для работы mql4-программ может потребоваться один или несколько пользовательских индикаторов, все они могут быть включены в код исполняемой mql4-программы. Включение индикаторов в качестве ресурсов позволяет упростить распространение программ.
Пример подключения и использования пользовательского индикатора SampleIndicator.ex4, расположенного в папке: каталог_данных_терминала \MQL4\Indicators\:
Случай, когда пользовательский индикатор в функции OnInit() создает одну или несколько копий себя, требует отдельного рассмотрения. Напомним, что для использования ресурса из mql4-программы его необходимо указывать в виде: :: .
Например, если индикатор SampleIndicator.ex4 включается в советник SampleEA.ex4 в качестве ресурса, то путь к самому себе, указанный при вызове iCustom() в функции инициализации пользовательского индикатора, будет выглядеть следующим образом: "\\Experts\\SampleEA.ex4::Indicators\\SampleIndicator.ex4". При явном указании данного пути пользовательский индикатор SampleIndicator.ex4 будет жестко привязан к советнику SampleEA.ex4 и теряет способность самостоятельной работы.
Путь до самого себя можно получить при помощи функции GetRelativeProgramPath(), пример использования которой приведен ниже:
Существует три каталога (с подкаталогами), в которых могут располагаться рабочие файлы:
- /HISTORY/ — специально для функции FileOpenHistory;
- /EXPERTS/FILES — общий случай;
- /TESTER/FILES — специально для тестирования.
Работа с файлами из других каталогов пресекается.
Использование ресурсов
Включение ресурсов в исполняемые файлы при компиляции mql4-программ
Файлы в формате BMP и WAV перед включением в исполняемый EX4 файл автоматически сжимаются. Это означает, что использование ресурсов не только позволяет создавать полноценные программы на MQL4, но и уменьшает общий размер требуемых терминалу файлов при использовании графики и звука по сравнению с обычным способом написания mql4-программ.
Размер файла ресурса не может быть больше 16 Mb.
FileTell
int FileTell(int handle)
Функция возвращает смещение текущей позицию файлового указателя от начала файла.
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметры:
handle — Файловый описатель, возвращаемый функцией FileOpen().
Пример:
FileSeek
bool FileSeek(int handle, int offset, int origin)
Функция перемещает файловый указатель на новую позицию, которая является смещением в байтах от начала, конца или текущей позиции файла. Следующее чтение или запись происходят с новой позиции.
Если перемещение файлового указателя прошло успешно, функция возвращает TRUE, иначе возвращает FALSE. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметры:
handle — Файловый описатель, возвращаемый функцией FileOpen().
offset — Смещение в байтах.
origin — Начальное положение. Величина может быть одной из этих констант:
SEEK_CUR — от текущего положения,
SEEK_SET — от начала,
SEEK_END — от конца файла.
Пример:
PlaySound()
Пример вызова функции PlaySound():
В данном примере показано как проигрывать звуки из файлов Ok.wav и timeoit.wav, входящих в стандартную поставку терминала. Эти файлы находятся в папке каталог_терминала\Sounds . Здесь каталог_терминала означает папку, из которой запущен клиентский терминал MetaTrader 4. Программным путем из mql4-программы каталог терминала можно узнать следующим образом:
//--- Папка, в которой хранятся данные терминала
string terminal_path= TerminalInfoString ( TERMINAL_PATH );
Можно использовать звуковые файлы не только из папки каталог_терминала\Sounds , но и из любой подпапки, находящейся в папке каталог_данных_терминала\MQL4. Расположение каталога данных терминала на компьютере можно выяснить через меню терминала "Файл"-"Открыть каталог данных" или программным путем:
//--- Папка, в которой хранятся данные терминала
string terminal_data_path= TerminalInfoString ( TERMINAL_DATA_PATH );
Например, если звуковой файл Demo.wav лежит в папке каталог_данных_терминала\MQL4\Files, то вызов PlaySound() должен быть записан таким образом:
//--- проиграем звуковой файл Demo.wav из папки каталог_данных_терминала\MQL4\Files\Demo.wav
PlaySound ( "\\Files\\Demo.wav" );
Обратите внимание на то, что в комментарии путь к файлу написан с использованием символа "\", а в самой функции для разделения папок в пути используется последовательность "\\".
При указании пути всегда используйте только двойную обратную косую черту в качестве разделителя, так как одиночная обратная черта является управляющим символом для компилятора при разборе константных строк и символьных констант в исходном коде программы.
Для остановки воспроизведения файла нужно вызвать функцию PlaySound() с параметром NULL:
//--- вызов PlaySound с параметром NULL останавливает воспроизведение звука
PlaySound ( NULL );
FileReadString
string FileReadString(int handle, int length=0)
Функция читает строку с текущей позиции файла. Применяется как к CSV, так и к двоичным файлам. Для текстовых файлов строка будет прочитана до разделителя. Для бинарных файлов в строку будет прочитано указанное количество символов.
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметры:
handle — Файловый описатель, возвращаемый функцией FileOpen().
length — Количество символов для чтения.
Пример:
FileReadNumber
double FileReadNumber(int handle)
Чтение числа с текущей позиции файла CSV до разделителя. Применяется только для файлов CSV.
Для того чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметры:
handle — Файловый описатель, возвращаемый функцией FileOpen().
Пример:
FileFlush
void FileFlush(int handle)
Сброс на диск всех данных, оставшихся в файловом буфере ввода-вывода.
Замечания: функцию FileFlush() необходимо вызывать между операциями чтения из файла и записи в файл.
При закрытии файла данные сбрасываются на диск автоматически, поэтому нет необходимости вызывать функцию FileFlush() перед вызовом функции FileClose().
Параметры:
handle — Файловый описатель, возвращаемый функцией FileOpen().
Пример:
FileClose
void FileClose(int handle)
Закрытие файла, ранее открытого функцией FileOpen().
Параметры:
handle — Файловый описатель, возвращаемый функцией FileOpen().
Пример:
ObjectCreate()
Пример эксперта, который с помощью функции ObjectCreate() создает объект "Графическая метка" (OBJ_BITMAP_LABEL).
string label_name= "currency_label" ; // имя объекта OBJ_BITMAP_LABEL
string euro = "\\Images\\euro.bmp" ; // путь к файлу каталог_данных_терминала\MQL4\Images\euro.bmp
string dollar = "\\Images\\dollar.bmp" ; // путь к файлу каталог_данных_терминала\MQL4\Images\dollar.bmp
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit ()
<
//--- создадим кнопку OBJ_BITMAP_LABEL, если ее еще нет
if ( ObjectFind (0,label_name) <0)
<
//--- попробуем создать объект OBJ_BITMAP_LABEL
bool created= ObjectCreate (0,label_name, OBJ_BITMAP_LABEL ,0,0,0);
if (created)
<
//--- привяжем кнопку к правому верхнему углу графика
ObjectSetInteger (0,label_name, OBJPROP_CORNER , CORNER_RIGHT_UPPER );
//--- теперь настроим свойства объекта
ObjectSetInteger (0,label_name, OBJPROP_XDISTANCE ,100);
ObjectSetInteger (0,label_name, OBJPROP_YDISTANCE ,50);
//--- сбросим код последней ошибки в 0
ResetLastError ();
//--- загрузим картинку для состояния кнопки "Нажата"
bool set= ObjectSetString (0,label_name, OBJPROP_BMPFILE ,0,euro);
//--- проверим результат
if (!set)
<
PrintFormat ( "Не удалось загрузить картинку из файла %s. Код ошибки %d" ,euro, GetLastError ());
>
ResetLastError ();
//--- загрузим картинку для состояния кнопки "Отжата"
set= ObjectSetString (0,label_name, OBJPROP_BMPFILE ,1,dollar);
if (!set)
<
PrintFormat ( "Не удалось загрузить картинку из файла %s. Код ошибки %d" ,dollar, GetLastError ());
>
//--- отдадим графику команду на обновление, чтобы кнопка появилась сразу же, не дожидаясь тика
ChartRedraw (0);
>
else
<
//--- объект создать не удалось, сообщим об этом
PrintFormat ( "Не удалось создать объект OBJ_BITMAP_LABEL. Код ошибки %d" , GetLastError ());
>
>
//---
return ( INIT_SUCCEEDED );
>
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
<
//--- удалим объект с графика
ObjectDelete (0,label_name);
>
Создание и настройка графического объекта с именем currency_label происходят в функции OnInit(). Пути к загружаемым графическим файлам заданы в глобальных переменных euro и dollar , в качестве разделителя использована двойная обратная косая черта:
string euro = "\\Images\\euro.bmp" ; // путь к файлу каталог_данных_терминала\MQL4\Images\euro.bmp
string dollar = "\\Images\\dollar.bmp" ; // путь к файлу каталог_данных_терминала\MQL4\Images\dollar.bmp
Сами файлы при этом находятся в папке каталог_данных_терминала\ MQL4\Images.
Объект OBJ_BITMAP_LABEL фактически представляет собою кнопку, которая в зависимости от состояния (нажата или отжата) может отображать одну из двух картинок: euro.bmp или dollar.bmp.
Размеры кнопки с графическим интерфейсом автоматически устанавливаются под размер отображаемой картинки. Смена изображения производится при нажатии левой кнопкой мышки на объекте OBJ_BITMAP_LABEL ( в свойствах должен быть выбрано "Отключить выделение" ). Объект OBJ_BITMAP создается аналогичным образом и предназначен для создания фона с требуемым рисунком.
Значение свойства OBJPROP_BMPFILE, которое отвечает за вид объектов OBJ_BITMAP и OBJ_BITMAP_LABEL , можно менять динамически. Это позволяет создавать разнообразные интерактивные пользовательские интерфейсы для mql4-программ.
FileWriteArray
int FileWriteArray(int handle, object array[], int start, int count)
Параметры:
handle — Файловый описатель, возвращаемый функцией FileOpen().
array[] — Массив для записи.
start — Начальный индекс в массиве (номер первого записываемого элемента).
count — Количество записываемых элементов.
Пример:
PlaySound()
Пример вызова функции PlaySound():
В данном примере показано как проигрывать звуки из файлов Ok.wav и timeoit.wav, входящих в стандартную поставку терминала. Эти файлы находятся в папке каталог_терминала\Sounds . Здесь каталог_терминала означает папку, из которой запущен клиентский терминал MetaTrader 4. Программным путем из mql4-программы каталог терминала можно узнать следующим образом:
//--- Папка, в которой хранятся данные терминала
string terminal_path= TerminalInfoString ( TERMINAL_PATH );
Можно использовать звуковые файлы не только из папки каталог_терминала\Sounds , но и из любой подпапки, находящейся в папке каталог_данных_терминала\MQL4. Расположение каталога данных терминала на компьютере можно выяснить через меню терминала "Файл"-"Открыть каталог данных" или программным путем:
//--- Папка, в которой хранятся данные терминала
string terminal_data_path= TerminalInfoString ( TERMINAL_DATA_PATH );
Например, если звуковой файл Demo.wav лежит в папке каталог_данных_терминала\MQL4\Files, то вызов PlaySound() должен быть записан таким образом:
//--- проиграем звуковой файл Demo.wav из папки каталог_данных_терминала\MQL4\Files\Demo.wav
PlaySound ( "\\Files\\Demo.wav" );
Обратите внимание на то, что в комментарии путь к файлу написан с использованием символа "\", а в самой функции для разделения папок в пути используется последовательность "\\".
При указании пути всегда используйте только двойную обратную косую черту в качестве разделителя, так как одиночная обратная черта является управляющим символом для компилятора при разборе константных строк и символьных констант в исходном коде программы.
Для остановки воспроизведения файла нужно вызвать функцию PlaySound() с параметром NULL:
//--- вызов PlaySound с параметром NULL останавливает воспроизведение звука
PlaySound ( NULL );
Поиск компилятором указанных ресурсов
Длина константной строки не должна превышать 63 символа.
Имена всех файлов и каталогов, включаемых в ресурсы, должны быть на английском языке.
Компилятор ищет ресурс по указанному пути в следующей последовательности:
• если в начале пути стоит разделитель обратная косая черта "\" (пишется "\\"), то ресурс ищется относительно каталога каталог_данных_терминала \MQL4\,
• если обратной косой черты нет, то ресурс ищется относительно расположения исходного файла, в котором этот ресурс прописывается.
В пути ресурса недопустимо использовать подстроки "..\\" и ":\\".
Примеры включения ресурсов:
FileSize
int FileSize(int handle)
Функция возвращает размер файла в байтах.
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметры:
handle — Файловый описатель, возвращаемый функцией FileOpen().
Пример:
FileDelete
void FileDelete(string filename)
Удаление указанного файла. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Файлы могут быть удалены только в том случае, если они расположены в папке каталог_терминала\experts\files (каталог_терминала\tester\files в случае тестирования эксперта) или ее подпапках.
Параметры:
filename — Имя файла.
Пример:
FileReadDouble
double FileReadDouble(int handle, int size=DOUBLE_VALUE)
Функция читает число двойной точности с плавающей точкой (double) из текущей позиции бинарного файла. Размер числа может быть 8 байтов (double) или 4 байта (float).
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметры:
handle — Файловый описатель, возвращаемый функцией FileOpen().
size — Формат числа. Может быть DOUBLE_VALUE (8 байтов) или FLOAT_VALUE (4 байта).
Пример:
FileWrite
int FileWrite(int handle, …)
Функция предназначена для записи данных в файл CSV, разделитель между данными включается автоматически. После записи в файл добавляется признак конца строки «\r\n». При выводе числовые данные преобразуются в текстовый формат (см. функцию Print()).
Возвращает количество записанных символов или отрицательное значение, если происходит ошибка .
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметры:
handle — Файловый описатель, возвращаемый функцией FileOpen().
… — Данные, разделенные запятыми. Может быть не больше 63 параметров.
Данные типов double, int автоматически преобразовываются в строку, данные типов color, datetime и bool воспринимаются как целыечисла (тип int), данные типа string выводятся как есть, без преобразования.
В качестве параметра нельзя передать массивы, массивы могут быть выведены поэлементно.
Пример:
FileWriteInteger
int FileWriteInteger(int handle, int value, int size=LONG_VALUE)
Функция записывает значение целого числа в двоичный файл. Если размер — SHORT_VALUE, значение будет записано как 2-байтовое целое число (тип short), если размер — CHAR_VALUE, значение будет записано как 1-байтовое целое число (тип char), если размер — LONG_VALUE, значение будет записано как 4-байтовое целое число (тип long int).
Возвращает число фактически записанных байтов или отрицательное значение в случае ошибки.
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметры:
handle — Файловый описатель, возвращаемый функцией FileOpen().
value — Значение для записи.
size — Дополнительный флаг формата. Может быть любой из следующих величин:
CHAR_VALUE (1 байт),
SHORT_VALUE (2 байта),
LONG_VALUE (4 байта, по умолчанию).
Пример:
FileWriteString
int FileWriteString(int handle, string value, int size)
Функция записывает строку в двоичный файл с текущей позиции.
Возвращает число фактически записанных байтов или отрицательное значение в случае ошибки.
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметры:
handle — Файловый описатель, возвращаемый функцией FileOpen().
value — Записываемая строка.
size — Длина записываемой строки. Если строка длиннее, чем указанное значение, то она будет усечена. Если строка короче, то она будет добавлена двоичными 0 до указанной длины.
Назначение препроцессора — обработка исходного текста программы до ее компиляции. Таким образом он занимается предварительной подготовкой исходного текста программы непосредственно перед ее компиляцией.
Препроцессор позволяет улучшить читаемость исходного кода. Структурирование кода может быть достигнуто путем включения отдельных файлов с исходными кодами MQL4-программ. Улучшению читаемости кода способствует и возможность присвоения мнемонических имен отдельным константам.
Препроцессор позволяет также определять специфические параметры MQL4-программ.
Специальные параметры
Константа | Тип | Описание |
link | string | ссылка на сайт компании-производителя |
copyright | string | название компании-производителя |
stacksize | int | размер стека для рекурсивных вызовов |
library | библиотека; не назначается никакой стартовой функции, не удаляются функции, которые не вызываются из других функций | |
indicator_chart_window | void | выводить индикатор в окно графика |
indicator_separate_window | void | выводить индикатор в отдельное окно |
indicator_buffers | int | количество буферов для расчета индикатора, максимум до 8 |
indicator_minimum | double | нижнее ограничение шкалы отдельного окна индикатора |
indicator_maximum | double | верхнее ограничение шкалы отдельного окна индикатора |
indicator_colorN | color | цвет для вывода линии N, где N от 1 до 8 |
indicator_widthN | int | толщина линии N, где N от 1 до 8 |
indicator_styleN | int | стиль линии N, где N от 1 до 8 |
indicator_levelN | double | горизонтальный уровень N в отдельном окне индикатора, где N от 1 до 8 |
indicator_levelcolor | color | цвет горизонтальных уровней индикатора |
indicator_levelwidth | int | толщина горизонтальных уровней индикатора |
indicator_levelstyle | int | стиль горизонтальных уровней индикатора |
show_confirm | void | выводить окно подтверждения перед запуском скрипта |
show_inputs | void | выводить окно со свойствами перед запуском скрипта и запретить вывод окна подтверждения |
Примеры:
Компилятор сохранит в настройках выполняемого модуля объявленные значения.
Импорт функций
Все импортируемые функции должны иметь уникальные имена. Недопустимо одновременно импортировать из разных модулей одноимённые функции. Также импортируемые функции не должны иметь имен, совпадающих с именами встроенных функций.
Так как импортируемые функции находятся вне вашего модуля, то компилятор не может проверить корректность передаваемых параметров. Поэтому, во избежание ошибок выполнения, необходимо точно описывать состав и порядок параметров, передаваемых в импортируемые функции. Параметры, передаваемые в импортируемые функции (как из EX4, так и из DLL-модулей), не могут иметь значения по умолчанию.
Примеры:
Для импорта функций во время выполнения mql4-программы используется так называемое позднее связывание. Это значит, что пока не вызвана импортируемая функция, соответствующий модуль (ex4 или dll) не загружается.
Не рекомендуется использовать полностью квалифицированное имя загружаемого модуля вида Drive:\Directory\FileName.Ext. Библиотеки MQL4 загружаются из папки terminal_dir\experts\libraries. Если библиотека не была найдена, то производится попытка загрузить библиотеку из папки terminal_dir\experts
Функция открывает файл с указанным именем и указанными флагами.
int FileOpen (
string file_name , // имя файла
int open_flags , // комбинация флагов
short delimiter=';' , // разделитель
uint codepage=CP_ACP // кодовая страница
);
[in] Имя открываемого файла, может содержать подпапки. Если файл открывается для записи, то указанные подпапки будут созданы в случае их отсутствия.
[in] комбинация флагов, определяющая режим работы с файлом. Флаги определены следующим образом:
FILE_READ файл открывается для чтения
FILE_WRITE файл открывается для записи
FILE_BIN двоичный режим чтения-записи (без преобразования из строки и в строку)
FILE_CSV файл типа csv (все записанные элементы преобразуются к строкам соответствующего типа, unicode или ansi, и разделяются разделителем)
FILE_TXT простой текстовый файл (тот же csv, однако разделитель не принимается во внимание)
FILE_ANSI строки типа ANSI (однобайтовые символы)
FILE_UNICODE строки типа UNICODE (двухбайтовые символы)
FILE_SHARE_READ совместный доступ по чтению со стороны нескольких программ
FILE_SHARE_WRITE совместный доступ по записи со стороны нескольких программ
FILE_COMMON расположение файла в общей папке всех клиентских терминалов \Terminal\Common\Files
[in] значение, используемое в качестве разделителя в txt или csv-файле. Если для csv-файла разделитель не указан, то по умолчанию используется ";". Если для txt-файла разделитель не указан, то никакой разделитель не используется. Если в качестве разделителя явно задано значение 0, то никакой разделитель не используется.
[in] Необязательный параметр. Значение кодовой страницы. Для наиболее употребимых кодовых страниц предусмотрены соответствующие константы.
В случае успешного открытия функция возвращает хэндл файла, который затем используется для доступа к данным файла. В случае неудачи возвращает INVALID_HANDLE.
Из соображений безопасности в языке MQL4 строго контролируется работа с файлами. Файлы, с которыми проводятся файловые операции средствами языка MQL4, не могут находиться за пределами файловой "песочницы".
Файл открывается в папке клиентского терминала в подпапке MQL4\Files (или Tester\Files в случае тестирования). Если среди флагов указан FILE_COMMON, то файл открывается в общей папке всех клиентских терминалов \Terminal\Common\Files .
Можно открывать "именованные каналы" по следующим правилам:
• Имя канала - строка, которая должна иметь вид: "\\servername\pipe\pipename", где servername - имя сервера в сети, а pipename - имя канала. Если каналы используются на одном и том же компьютере, имя сервера может быть опущено, но вместо него нужно поставить точку: "\\.\pipe\pipename". Клиент, который пытается соединиться с каналом, должен знать его имя.
• Необходимо вызывать FileFlush() и FileSeek() на начало файла между последовательными операциями чтения из канала и записи в канал.
В приведенных строках используется специальный символ обратная косая черта '\', поэтому при написании имени в MQL4 программе '\' необходимо удваивать, то есть вышеприведенный пример написать в коде как "\\\\servername\\pipe\\pipename".
Более подробно о работе с именованными каналами можно прочитать в статье "Связь с MetaTrader 5 через именованные каналы без применения DLL"
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart ()
<
//--- неправильный способ открытия файла
string terminal_data_path = TerminalInfoString ( TERMINAL_DATA_PATH );
string filename= terminal_data_path + "\\MQL4\\Files\\" + "fractals.csv" ;
int filehandle= FileOpen (filename, FILE_WRITE | FILE_CSV );
if (filehandle <0)
<
Print ( "Неудачная попытка открыть файл по абсолютному пути" );
Print ( "Код ошибки " , GetLastError ());
>
//--- правильный способ работы в "файловой песочнице"
ResetLastError ();
filehandle= FileOpen ( "fractals.csv" , FILE_WRITE | FILE_CSV );
if (filehandle!= INVALID_HANDLE )
<
FileWrite (filehandle, TimeCurrent (), Symbol (), EnumToString ( ENUM_TIMEFRAMES ( _Period )));
FileClose (filehandle);
Print ( "FileOpen OK" );
>
else Print ( "Операция FileOpen неудачна, ошибка " , GetLastError ());
//--- еще один пример с созданием вложенной директории в MQL4\Files\
string subfolder= "Research" ;
filehandle= FileOpen (subfolder+ "\\fractals.txt" , FILE_WRITE | FILE_CSV );
if (filehandle!= INVALID_HANDLE )
<
FileWrite (filehandle, TimeCurrent (), Symbol (), EnumToString ( ENUM_TIMEFRAMES ( _Period )));
FileClose (filehandle);
Print ( "Файл должен быть создан в папке " + terminal_data_path + "\\" +subfolder);
>
else Print ( "Операция FileOpen неудачна, ошибка " , GetLastError ());
>
хранить рабочие файлы в трех каталогах (включая вложенные каталоги):
- / HISTRORY / < текущий брокер >– специально предоставляемая функция FileOpenHistory:
- / EXPERTS / FILES - Общий каталог;
- / TESTER / FILES - специальный тест.
запретить доступ к рабочим документам из других каталогов.
FileClose ()- Закрыть файл
FileDelete ()- удалить файл
FileFlush ()- Очистить буфер и накопитель файлов
FileIsEnding ()– определите, будет ли указатель документа до конца файла
FileIsLineEnding ()– определите, указывает ли указатель на конец строки
FileOpen ()открыть файл
FileOpenHistory ()- открыть файл под историческим каталогом
FileReadArray ()- файл прочитан в массив
FileReadDouble ()- чтение данных с плавающей запятой из файла
FileReadInteger ()- чтение целых данных из файла
FileReadNumber ()- чтение значений из текстового файла
FileReadString ()- чтение строк из файла
FileSeek ()- переместить указатель файла
FileSize ()- получение размера файла
FileTell ()- расположение указателя файла
FileWrite ()- запись в файл CSV
FileWriteArray ()- файл записи содержимого массива
FileWriteDouble ()– файл с двойной точностью
FileWriteInteger ()- запись в файл целых значений
FileWriteString ()- файл записи строк
Закрыть файл, открытый перед использованием функции FileOpen ()
FileDelete () – удалить файл
Удалить указанный файл.
если вы хотите получить подробную информацию об ошибке, вызовите функцию GetLastError ().Если файл находится в terminal. Uкаталог дней dir / experts / filesDirectory / tester / files) или его каталог, просто удалите этот файл.
FileFlush () – Очистить буфер файлов и сохранить диск
Очистить кеш от данных, сосуществующих на диске.
Примечание: функция FileFlush () может быть приведена только в операции чтения и записи файлов.
при закрытии файла данные будут автоматически сохранены на диске, поэтому нет необходимости звонить функции FileFlush ().
FileIsEnding () – определите, будет ли указатель документа последним
Возвращает TRUE, если указатель файла находится в конце файла, в противном случае возвратит False.
если вы хотите получить подробную информацию об ошибке, вызовите функцию GetLastError ().функция GetLastError ()демонстянутьFILE (4099).
FileIsLineEnding () – определить, указывает ли указатель на конец строки
если указатель файла CSV указывает конец строки, возвращает true, иначе - false.
если вы хотите получить подробную информацию об ошибке, вызовите функцию GetLastError ().
FileOpen () – открыть файл
открыть файл для ввода или вывода информации.Если файл успешно открыт, возвращает точку, в противном случае - 1.если вы хотите получить подробную информацию об ошибке, вызовите функцию GetLastError ().
Примечания: файл может быть найден только в terminalПапка directory / experts / filesкаталог directory / tester / files) или вложенный каталог.
филеБин и филеформат CSV не может быть использован одновременно.
если бWRITE & FILEREAD не используется в комбинации, а длина открытого файла равна нулю.если файлы содержат данные, они могут быть удалены.если необходимо добавить данные в существующий файл, используйте Файл FILEWRITE & FILEфайл READ открыт в комбинации.
если бWRITE & FILEREAD не используется в комбинации и может открывать только существующие документы.Если файл не существует, можно использовать FILEсоздан режим WRITE.
в модуле можно открыть не более 32 файлов одновременно.рукоятка открытия файла в том же модуле не может быть передана другому модулю (библиотеке).
FileIsLineEnding
bool FileIsLineEnding(int handle)
Возвращает TRUE, если файловый указатель находится в конце строки файла формата CSV, иначе возвращает FALSE. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметры:
handle — Файловый описатель, возвращаемый функцией FileOpen().
Пример:
Включение файлов
Примеры:
Если имя файла заключено в кавычки, то поиск производится в текущем каталоге (в котором содержится основной файл исходного текста). Стандартный каталог не просматривается
FileOpen
int FileOpen(string filename, int mode, int delimiter=’;’)
Открывает Файл для ввода и/или вывода. Возвращает файловый описатель открытого файла или -1 в случае неудачи. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().
Замечания: файлы могут открываться только в папке каталог_терминала\experts\files (каталог_терминала\tester\files в случае тестирования эксперта) или ее подпапках.
Нельзя одновременно использовать режимы FILE_BIN и FILE_CSV.
Если FILE_WRITE не комбинируется с FILE_READ, то будет открыт файл нулевой длины. Даже если до открытия в файле были данные, то они будут уничтожены. Если необходимо дописывать данные в существующий файл, то его нужно открывать, используя комбинацию FILE_READ | FILE_WRITE.
Если FILE_READ не комбинируется с FILE_WRITE, то файл будет открыт только в том случае, если он уже существует. Если файл не существует, то создать его можно, используя режим FILE_WRITE.
Одновременно может быть открыто не более 32 файлов в пределах одного исполняемого модуля. Описатели файлов, открытых в одном модуле, нельзя передавать в другие модули (библиотеки).
Параметры:
filename — Имя файла.
mode — Способ открытия. Это может быть одна величина или их комбинация: FILE_BIN, FILE_CSV, FILE_READ, FILE_WRITE.
delimiter — Знак разделителя для csv-файлов. По умолчанию применяется символ ‘;’.
Пример:
FileOpenHistory
int FileOpenHistory(string filename, int mode, int delimiter=’;’)
Открывает файл в текущей папке истории (каталог_терминала\history\server_name) или ее подпапках. Возвращает описатель файла или -1 в случае неудачи. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().
Замечания: клиентский терминал может подключаться к серверам разных брокерских компаний. Исторические данные (файлы HST) каждой брокерской компании хранятся в соответствующей подпапке папки истории каталог_терминала\history.
Функция может быть полезна для формирования собственных исторических данных нестандартного символа и/или периода. Файл, сформированный в папке истории может быть открыт автономно, для его графика не требуется подкачка данных.
Параметры:
filename — Имя файла.
mode — Режим открытия. Это может быть одна величина или их комбинация: FILE_BIN, FILE_CSV, FILE_READ, FILE_WRITE.
delimiter — Знак разделителя для csv-файлов. По умолчанию применяется символ ‘;’.
Пример:
FileIsEnding
bool FileIsEnding(int handle)
Возвращает TRUE, если файловый указатель находится в конце файла, иначе возвращает FALSE.
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). В случае достижения конца файла в процессе чтения функция GetLastError() вернет ошибку ERR_END_OF_FILE (4099).
Параметры:
handle — Файловый описатель, возвращаемый функцией FileOpen().
Пример:
Читайте также: