Помимо работы с данными хранящимися в переменных или таблицах, язык программирования Lua, предусматривает работу с файлами. С помощью определенных операторов мы можем записать информацию, например в текстовый файл. Данная функция будет полезна, когда мы будем вести Log файл. Log файлом, называется файл, в который записывается информация о работе программы. Мы можем считать информацию из текстового файла или записать в файл значения переменных и таблиц.

Запись в файл.

Рассмотрим запись значений переменных в текстовый файл.

Создадим новый скрипт с именем «012 Чтение и запись в файл.lua».

Для записи значений в файл, с начала файл необходимо открыть. Создадим переменную содержащую ссылку на местоположение файла на жестком диске. Файл будет находиться на диске С: в папке Lua, иметь имя TestWrite и расширение txt (текстовый файл).

Обратите внимание для записи знака обратный слеш используется символ \\.Далее создадим переменную, которая будет содержать ссылку на открытый, для записи файл, назовем ее FileWrite.

Далее, у нас есть ссылка на местоположение файла на жестком диске, обратимся по ней к файлу и откроем его следующей командой:

В этой строке кода в переменную FileWrite присваивается ссылка на открытый для записи файл. Оператор io.open открывает файл по ссылке, содержащейся в переменной FileNameWrite, после ссылки на местоположение файла следует параметр «a», который указывает на режим открытия файл.

Режимы открытия файла:
«r» – режим чтения файла;
«w» – режим записи в файл с удалением содержимого файла (перезапись);
«a» – режим записи в файл с добавлением к содержимому файла.

Если открываемого файла не существует, то Lua автоматически создаст его в указанной папке.

Запишем в наш файл текстовую строку. Для записи в файл используем команду write применимо к переменной FileWrite, которая содержит ссылку на открытый для записи файл.

Этой строкой мы записали в файл строку с текстом «Тест записи в файл» и выполнили перевод на следующую строку символом «\n». Теперь если мы запишем в данный файл еще какую-то информацию, она будет записана на новой строке.После операции записи в файл, закроем его командой:

FileWrite:close()

Выполним скрипт. После выполнения скрипта перейдем в папку C:\Lua. В папке откроем файл с именем TestWrite.txt, файл откроется в блокноте и мы увидим строку «Тест записи в файл».

Используя запись в файл, мы можем записать любые действия, которые совершались торговым роботом, с указанием параметров, при котором произошло, действие. Также можно записать любые доступные значения из терминала QUIK например, значения с графика цены инструмента или значения индикатора технического анализа.

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

Чтение данных из файла нам потребуется в нескольких случаях, например: когда мы будем тестировать системы на исторических данных или в случае, когда понадобиться рассчитать какой-то индикатор технического анализа, использующий исторические данные, по объему превышающие доступный объем в терминале QUIK. Также чтение из файла может использоваться для возобновления работы торгового робота после закрытия терминала QUIK. Если в алгоритме торгового робота прописаны определенные действия, зависящие от действий робота в прошлом, то для возобновления корректной работы, роботу необходимо «вспомнить», что он делал для этого, с помощью чтения данных из файла, робот сможет восстановить потерянные значения. Откроем стандартное приложение Windows – Блокнот, напишем в нем одну строку с текстом «Тест чтение из файла» и сохраним на диске C:\ в папку Lua, под именем TestRead.

В коде программы создадим строковую переменную с указанием на местоположения файла на жестком диске:

Для того чтобы прочитать данные из файла, необходимо предварительно открыть файл и поместить ссылку на открытый файл в переменную. Создадим переменную FileRead.

Откроем заранее подготовленный файл TestRead.txt и поместим ссылку на открытый файл в переменную FileRead, указав режим открытия файла «r» – режим чтения.

Прочитанную строку из файла необходимо, куда-то сохранить, создадим переменную Read, в которую запишем прочитанную строку. Для чтения из файла используем команду read с указанием параметра, чтения.

Параметры чтения из файла:
«*l» – читает следующую строку;
«*a» – читает весь файл;
«*n» – читает числовое значение;
«5» – (числовое значение) читает количество символов равное указанному числу, например команда Read = FileRead:read(5) прочитает первые пять символов из строки.
После окончания чтения файла закроем его командойFileRead:close()Добавим строку, выводящую на экран значение переменной Read, содержащей прочитанную строку.print(Read)

Выполним скрипт.

На панели вывода появилось сообщение «Тест чтение из файла» следовательно, чтение из файла прошло успешно.

Чаще всего нам придется читать из файла числовые значения. Разберемся подробнее с чтением числовых значений, в языке Lua есть удобный синтаксис для чтения чисел.

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

Подготовим файл с данными, которые будем читать. Запустим терминал QUIK, откроем график цены и объема фьючерсного контракта на нефть Brent (выберем самый ближний к экспирации контракт), выберем интервал графика 60 минут, правой кнопкой щелкнем на любую свечку на графике и выберем пункт контекстного меню «Сохранить данные в файл», файл сохраним в папку Lua на диске C:\, под именем Brent.txt.

Файл, с историческими данными, сохраненный из терминала QUIK, имеет не подходящий формат записи данных. Нам необходимо выполнить преобразование данных для того, чтобы язык программирования Lau смог корректно прочитать файл.

Откроем приложение Microsoft Excel, если у вас нет пакета приложений Microsoft Office, те же самые действия можно выполнить в бесплатном приложении для работы с таблицами LibreOffice (в LibreOffice работает все точно также как в Excel). После запуска приложения перейдем в меню Файл > Открыть, перейдем в папку Lua на диске C:\. В правом нижнем углу окна, откроем всплывающий список и выберем «Все файлы (*.*)», в окошке выбора файла отобразятся созданный нами текстовый файл «Brent.txt», выберем его и нажмем кнопку «Открыть». Программа нам предложит варианты открытия файла.

Выберем формат «с разделителем» нажмем кнопку «Далее >» и выберем разделитель «запятая».

Нажмем кнопку «Далее >», откроется следующее окно настроек, оставим для всех столбцов «Общий формат данных».

Нажмем кнопку «Готово», откроется таблица, каждый параметр будет находиться в своем столбце.

Удалим не нужные строки и столбцы. Удалим следующие столбцы: столбец «B» с параметром и столбец «I» с параметром , также удалим первую строку с названиями параметров. Для удаления столбцов щелкнем левой кнопкой мыши на название столбца, весь столбец будет выделен, далее нажмем правой кнопкой мыши на название столбца и выберем пункт меню «Удалить». Точно также удалим строку с номером «1» содержащую названия столбцов.

Вот так должна выглядеть наша таблица. Но это еще не все.В первом столбце «А» вместе с тиккером «BRV7» прописался код класса «[SPBFUT]», он нам не нужен, поэтому удалим его, используя замену. Скопируем значение в первой ячейки строка «1», столбец «А» (дважды щелкнем левой кнопкой мыши на ячейку и выделим в ней весь текст, далее нажмем сочетание клавиш Ctrl+C). Нажмем сочетание клавиш Alt+H, появится окно замены, вставим в строку «Найти» скопированное значение «BRV7 [SPBFUT]» (сочетание клавиш Ctrl+V), а в строку «Заменить на» пропишем тиккер нашего инструмента «BRV7», выделим столбец «А» и нажмем кнопку «Заменить все».

В столбце «А» осталось только тиккер инструмента, что нам и требовалось.

Выполним команду Файл > Сохранить как, выберем тип файла CSV (разделитель – запятые) в Excel и Текст CSV (.csv) в LibreOffice, присвоим файлу имя Brent.

После нажатия кнопки «Сохранить» откроется окно с предупреждением, нажмем кнопку «Да».

Перейдем в папку Lua на диске C:\ и откроем наш файл «Brent.csv» с помощью Блокнота (щелкнем правой кнопкой мыши на файл, в контекстном меню выберем «Открыть с помощью» > «Блокнот). В открывшемся файле видим, что разделителями столбцов является символ «;» точка с запятой (не обращайте внимание на то, что мы выбирали разделитель – запятая, а файл сохранился с разделителем точка-запятая, скорее всего, это связано с тем, что мы используем запятую как разделитель дробной части числа).

Для того чтобы Lua прочитал строку и выделил из нее отдельные числа необходимо вставить пробел между числами и убрать разделитель столбцов «;» точка-запятая. Нажмем сочетание клавиш Ctrl+H, откроется окно «Заменить», в поле «Что» введем символ точка запятая «;» в поле «Чем» введем пробел символ » «.

Нажмем кнопку «Заменить все» и закроем окно «Заменить».

Теперь разделителем столбцов является символ пробел » «. Сохраним файл. Меню «Файл» пункт «Сохранить как», в конце имени файла Brent обязательно пропишем расширение .txt, нажимаем сохранить и заменяем существующий файл новым.

Все файл с историческими данными готов для дальнейшей обработки языком программирования Lua. Теперь мы можем поместить значения столбцов в таблицы языка Lua, и далее обработать эти значения так, как нам вздумается.

Приступим.

Создадим новый проект Lua и назовем его «013 Чтение исторических данных.lua».

Для чтения из файла и записи значений в таблицы Lua будем использовать переменные, таблицы, цикл while и команды чтения из файла.

Создадим таблицы, которые будут содержать соответственно Тиккер, Дату, Время, Открытие, Максимум, Минимум и Закрытие.

Также нам понадобятся следующие переменные:
— переменная, содержащая ссылку на файл, в котором хранятся данные,
— переменная, содержащая ссылку на открытый для чтения файл,
— вспомогательная переменная, которая остановит цикл читающий файл, когда все строки будут прочитаны.

Для того чтобы прочитать числовое значение из файла используется символ «*n», Lua определяет конец числового значения, если при чтении строки встречает пробел, т.е. пробел служит разделителем для Lua при чтении числовых значений из файла. Откроем файл Brent для чтения. FileRead = io.open(FileName,»r»)

Используя множественное присвоение, запишем одной строкой объявление нескольких переменных и присвоение им соответствующих значений.

После оператора local и до знака присвоения, мы объявляем переменные. После знака присвоения мы вызываем функцию чтения из файла FileRead. В скобках указываем, что сначала необходимо прочитать в строке пять символов, далее прочитать по очереди шесть числовых значений. Мы точно знаем, что первые пять символов это тиккер инструмента и пробел, а далее идут его значения. Первая строка из файла «Brent.txt»:

BRV7 20161122 210000 49.290000 49.310000 49.290000 49.310000

Выведем на экран записанные в переменные значения. print(Ticker, Date, Time, Open, High, Low, Close)

Выполним скрипт.

Удалим строку вывода на экран. (print(Ticker, Date, Time, Open, High, Low, Close))

Для того чтобы последовательно записать значения из файла в таблицы Lua используем цикл while. Нам необходимо считывать значения из файла и записывать их в таблицы до тех пор, пока не закончится файл, когда файл закончиться переменные Day, Time, Open, High, Low, Close станут равны nil, а переменная Ticker будет содержать пустую строку. Ранее мы создали переменную, для остановки цикла, StopRead равную true, именно она будет менять значение на false, когда например переменная Date станет nil.

Запишем цикл while и условие остановки цикла.

Если Date ~= nil, тогда запишем значения переменных в соответствующую таблицу. Для того чтобы значения из файла записывались каждый раз в новую строку таблицы добавим переменную счетчик итераций цикла, который в свою очередь будет равен номеру строки в таблице. Назовем данную переменную «i».

Объявим переменную «i» выше цикла while, присвоим переменной значение 1, поскольку нумерация в таблицах Lua начинается с единицы.

Присвоим i-той строке, каждой таблицы, значения из соответствующей переменной.

В конце присвоения увеличим переменную «i» на единиц, для записи следующих считанного из файла значений в следующую строку таблиц.

Программа чтения значений из файла и записи значений в таблицы Lua готова. Проверим результат работы программы и выведем на экран значения из таблиц Lua, используя цикл for.

Выполним скрипт.

В окне вывода на экран появилось шесть столбцов содержащих значение прочитанных из файла исторических данных.

Теперь мы можем, по своему усмотрению оперировать содержащими значениями в таблицах Lua. Рассчитаем два скользящих средних значение для цены закрытия, используя ранее написанную функцию, для расчета SMA. Скопируем код функции function SMA(Table, n) из файла «009 SMATest.lua» и вставим его в первые строки текущего файла «013 Чтение исторических данных.lua».

Создадим две переменные содержащие интервалы расчета скользящих средних и две таблицы, которые будут содержать значения скользящих средних.

Дважды вызовем функцию расчета SMA передав в нее, в первом случае таблицу с ценами закрытия CloseTable и период FastSMA_N, во втором случаем также передадим таблицу цен закрытия CloseTable, а период расчета передадим SlowSMA_N. Запишем результат выполнения функции в соответствующие таблицы для SMA.

Для проверки выполнения функции выведем на экран значения скользящих средних вместе с ценой инструмента. Добавим в строку вывода на экран (строка номер 55) еще две таблицы FastSMA и SlowSMA.

Выполним скрипт.

В результате выполнения скрипта в окне вывода появилось еще два столбца. Первый FastSMA и интервалом 10 и второй SlowSMA с интервалом 50.

Вы можете получить готовые коды скриптов с этого сайта.
Не тратьте свое время на ввод символов с клавиатуры, потратьте его лучше на создание своих собственных торговых роботов из блоков уже готового кода.