maLib

[ lua  qlua  квик  quik  ]

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

Так была написана MA Библиотека.

Чтобы ее использовать необходимо подключить ее к своему коду через типовой вызов:

local maLib = require(“maLib”)

Чтобы скрипт нашел библиотеку необходимо включить путь к каталогу, где расположена библиотека в переменную package.path:

package.path = path..”/?.lua;..package.path..’;’

Либо воспользоваться функцией load:

local maLib = load(path..”\maLib.lua”)()

при этом необходимо указать полный путь к файлу.

После подключения станут доступны все публичные методы библиотеки:

Наиболее часто используемый метод - это new (создать экземпляр функции расчета по доступным методам). Собственно, с помощью этого метода можно получить типовые экземпляры функций расчета.

Для примера, создание экземпляра функции расчета EMA выглядит так:

local EMA = maLib.new({method = ‘EMA’, data_type = ‘Close’, period = 14}, ds)

где ds - это поток заказанных данных некого интервала.

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

local EMA = maLib.new({method = ‘EMA’, data_type = ‘Close’, period = 14})

т.е. просто не передается ссылка на поток данных.

Реализованные методы:

Также доступны вспомогательные функции:

Список методов дополняется со временем.

Как видно из описания вызова метода new, вызов происходит с двумя параметрами:

Параметры settings

settings - это таблица, в которой присутствуют обязательное поле “method”, задающее метод экземпляра функции для расчета. В примере выше задается метод из списка - “EMA”.

Параметр data_type не обязателен в случае расчета для потока данных. По умолчанию используется “Close” - цена закрытия бара. Доступны значения, реализованные в функции Value:

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

Параметры round и scale определяют необходимость округления возвращаемых результатов. По умолчанию round = “off” и scale = 0, т.е. округление не производится.

Остальные параметры определяются методом расчета. Допустим, для EMA необходим еще параметр period, а, скажем, для MACD необходимо указать больше параметров.

Возвращаемые значения методов

Чаще всего возвращается массив или несколько массивов рассчитанных данных.

Метод EMA возвращает массив рассчитанных значений EMA. Метод MACD возвращает массивы значений MACD и сигнальной линии. И т.д. в зависимости от метода.

Примеры использования

Для примера индикатор, выводящий линию заданного метода. В данном индикаторе пользователем задается имя метода, значение периода.

Инициализация функции расчета:

fMA = maLib.new(Fsettings, ds)

Также на базе библиотеки написан индикатор RENKO.

В самой библиотеке часть методов использует для расчета другие функции расчета. Для примера, тот же MACD, использует расчет EMA (или другой заданный метод) над потоком данных и над массивом.

– Инициализация массива для хранения значений сигнальной линии

local t_MACD = {0}

– Создание экземпляра расчета по заданному методу над массивом t_MACD

local MACD_MA = M.new({period = signal_period, method = signal_method, data_type = “Any”, round = round, scale = scale}, t_MACD)

– Создание экземпляра расчета по заданному методу над потоком данных

local Short_MA = M.new({period = short_period, method = method, data_type = data_type, round = round, scale = scale}, ds)

– Создание экземпляра расчета по заданному методу над потоком данных

local Long_MA = M.new({period = long_period, method = method, data_type = data_type, round = round, scale = scale}, ds)

Т.е.создаются экземпляры функций. В дальнейшем происходит их вызов.

Производим расчет для индекса

local So = Short_MA(index)

local Lo = Long_MA(index)

Получаем значения из полученных массивов

t_MACD[index] = So[index] - Lo[index]

Производим расчет и получаем значение для индекса для метода над массивом t_MACD

s_MACD[index] = MACD_MA(index)[index]