Модули в LUA

Данная глава посвящена модулям и будет интересна тем, кто собирается писать большие алгоритмы.

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

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

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

Представьте такую ситуацию, вы пишите индикатор и вам необходима некая пользовательская функция, вы реализуете ее в отдельном модуле, в отдельном файле, и продолжайте разрабатывать индикатор. Через время решайте написать второй индикатор и в нём также нужно использовать ту же самую функцию которую вы ранее уже написали, в этом случае вы подключаете уже готовый модуль и используйте данную функцию. Таким образом вы написали 10 разных индикаторов которые используют один и тот же модуль. Спустя некоторое время выясняется что при работе в некоторых случаях данная пользовательская функция приводит к ошибке и индикатор или скрипт прекращает работу. Для того чтобы устранить ошибку вы открываете модуль находите необходимую функцию исправляйте его таким образом чтобы ошибка не возникала. Теперь все 10 индикаторов которые используют данный модуль работают по новому алгоритму, а значит и ошибка во всех 10 индикаторах возникать больше не будет. Если не использовать модуль, тогда вам придется исправлять найденную ошибку в каждом индикаторе отдельно.

Что собой представляют модули.

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

Модуль это таблица которая содержит функции. Для начального понимания модуля я думаю этого будет достаточно. Например стандартные библиотеки используемые в lua также являются модулями.

Модули необязательно писать в отдельных файлах, можно создать модуль в том же самом файле в котором находится индикатор, но я такой вариант не рассматриваю, так как вся суть модуля по моему мнению теряется.

Пора переходить к практике. Создайте файл следующего содержания

nameTable = {};
function nameTable.nameFunction()
    -- Действия
end
return nameTable;

Как видите в модуле имеется глобальная таблица nameTable, в которой имеется одна функция nameFunction, в последней строке данная таблица возвращается.

Сохраните этот файл в каталоге где установлена программа QUIK и дайте ему имя nameTable.lua будьте внимательны имя файла должно совпадать с именем таблицы. На этом создание модуля завершено. Как видите ничего сложного в этом нет.

Теперь создайте скрипт который будет использовать данный модуль. Уже в другом файле напишите следующий код

isRun = 1;

function OnInit(script_path)
	
end

function main()
	while isRun do
		
		sleep(100);
	end
end

function OnStop()
	isRun = false;
end

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

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

Подключение модулей.

Для того чтобы подключить модуль используется команда require, а далее пишется имя файла модуля.

require "nameTable";

Напишите данную строку в самом верху скрипта, код будет выглядеть следующим образом:

require "nameTable";

isRun = 1;

function OnInit(script_path)
	
end

function main()
	while isRun do
		
		sleep(100);
	end
end

function OnStop()
	isRun = false;
end

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

nameTable.nameFunction();

Вызовите данную функцию в своем скрипте следующим образом

require "nameTable";

nameTable.nameFunction();

isRun = 1;

function OnInit(script_path)
	
end

function main()
	while isRun do
		
		sleep(100);
	end
end

function OnStop()
	isRun = false;
end

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

nameTable = {};

function nameTable.nameFunction()
    -- Действия
    message("Вызов функции nameFunction в таблице nameTable");
end

return nameTable;

Не забудьте сохранить файл скрипта и файл модуля. Теперь откройте Квик, добавьте скрипт и запустите его на выполнение. Если все сделали верно то увидите сообщение.

Сообщение message QUIK

Сообщение QUIK

Как видите использование модулей не является сложным, а также одновременно является очень удобным. Функций в таблице модуля может быть огромное количество. Переменные объявленные локально в модуле недоступны из скрипта.

Расположение модулей.

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

Если сохранить модуль в какой-то другой папке, то при загрузке данного модуля произойдет ошибка.
Если требуется хранить модуль в отдельном каталоге, то необходимо указать путь к этому каталогу чтобы программа могла найти файлы модулей. Для этого используются таблица package и переменная path в ней, а путь прописывается следующим образом:

package.path = package.path .. ";" .. getWorkingFolder() .."\\k-pavel\\modules\\" .. "?.lua";

В этом примере к уже ранее записанным в переменную path путям через точку с запятой добавляется еще один путь для поиска модулей. Функция getWorkingFolder() возвращает рабочий каталог программы, а далее добавляем ещё два каталога k-pavel и modules. В самом конце вы видите запись ?.lua это значит что вместо знака вопрос будет поставлено имя модуля именно поэтому имя модуля должно совпадать с именем файла при добавление модуля в скрипт или индикатор. Добавте эту строку в ранее созданный скрипт

package.path = package.path .. ";" .. getWorkingFolder() .."\\k-pavel\\modules\\" .. "?.luac";

require "nameTable";

nameTable.nameFunction();

isRun = 1;

function OnInit(script_path)
	
end

function main()
	while isRun do
		
		sleep(100);
	end
end

function OnStop()
	isRun = false;
end

Теперь если вы переместите модуль по следующему адресу С:\Каталог_Квик\k-pavel\modules\nameTable.lua то этот модуль будет загружен, так как программа теперь знает по какому пути искать указанный модуль.

Самое основное что необходимо знать о моделях я рассказал в этой статье, если возникают какие либо вопросы, пишите в комментариях.

Постоянная ссылка на это сообщение: https://k-pavel.ru/moduli-v-lua/

avatar
3 Цепочка комментария
4 Ответы по цепочке
0 Последователи
 
Популярнейший комментарий
Цепочка актуального комментария
4 Авторы комментариев
Павел КашинскийИринаДмитрийOLEG Авторы недавних комментариев

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

  Subscribe  
Новые Старые Популярные
Подписаться на
Ирина
Гость
Ирина

Читаю взахлёб. Хоть не новичек, а открытия сделала, «углубила» понимание. У Вас талант разжевывать! СПАСИБО!!!
Продолжения-то ждать? А то всё ещё «мы находимся лишь только в начале пути и еще не знакомы с тем как выставлять ордера, а также неизвестны функции для работы с датой и временем» и т.п.

Дмитрий
Гость
Дмитрий

Добрый день. Как я понимаю менять и прописывать новый путь в общем то не стоит, но остался вопрос, спортивный интерес. Почему работает package.path. Справочник выдает при запросе package «Описание параметров Таблицы сделок:», а path — (в грубом приближении) где находится запускаемый файл. При этом как редактировать список пути в общем то не понятно. Например внес свой путь, и теперь его убрать хочу, не переписывать же программу? Где про него можно прочитать?
Вообще не ожидал что QWIK создал файл-справочник где прописаны пути в которых он ищет вызываемые модули и файлы. Например в экселе при обращении к файлу надо прописать его путь вручную, можно и через getFolder, но все же прописать.

Дмитрий
Гость
Дмитрий

Да. Немного прояснили

OLEG
Гость
OLEG

как же много буковок! это мне дня три осваивать