1. Инструкция приведена в комментариях теста модуля.
2. Код теста:
------------------------------------------------------------------------------------------------
2. Код модуля:
2. Код теста:
Код |
---|
-- Инструкция -- 1. Скачать папку LuaIndicators (Примеры функций расчета индикаторов терминала QUIK на языке Lua) с сайта -- https://arqatech.com/ru/support/files/ и переслать в папку расположения info.exe. -- 2. Модуль подключения индикаторов(под именем mod_IND.lua) переслать в папку расположения info.exe. -- 3. Запустить тест test_IND. -- ---- -- P.S. -- 1. Учитывать, что при расчете индикаторов первые значения (1 .... Период расчета индикатора - 1) -- обычно nil. -- 2. Результат расчета индикатора может иметь несколько значений и это определяется функцией OnCalculate -- кода используемого индикатора папки LuaIndicators. -- 3. В модуле mod_IND.lua представлены три примера объявления заголовочных функций описаний параметров -- подключаемых индикаторов. Параметры такой функции это список полей из таблицы Settings соответствующего -- индикатора папки LuaIndicators, для которых требуется задать значения, определяющие поведение создаваемого -- замыкания. --------------------------------------------------------------------- timeout = 300 is_run = true function main() -- GetDataSource подключается к графику -- local function GetDataSource(class_code, sec_code, timeframe) local ds, Error = CreateDataSource(class_code, sec_code, timeframe) -- Ждет 10 сек., пока данные будут получены с сервера -- for i = 1, 1000 do if not ((Error == "" or Error == nil) and ds:Size() == 0) then break end; sleep(10) end if Error ~= "" and Error ~= nil then message(debug.getinfo(1).currentline..': Ошибка подключения к графику: '..Error) return nil end return ds end -------------------------------- Тест индикаторов ------------------------------------------------- local INDICATORS = require('mod_IND') --------------------------------------------------------------------------------------------------- -- Подключение к источнику данных (графику) local DS = GetDataSource(getClassInfo('QJSIM') and 'QJSIM' or 'TQBR', 'SBER', INTERVAL_M1) if not DS then return end -- не удалось подключиться к источнику данных --- local size = DS:Size() message('size = ' .. size) ------------------------------------------------------------------------------------------------- -- <Функция создания индикаторов> (<Параметры индикатора>) -- Результат: функция-замыкание расчета индикатора. ------ -- Вызов полученного замыкания: -- <Функция-замыкание>(<Очередное значение для расчета индикатора>) -- Результат (возможно несколько значений, определяемых видом индикатора): значения индикатора, -- определяемые параметрами создания замыкания на основе кода индикатора в папке ...Lua\\LuaIndicators. -- !! В кодах индикаторов результат определяется функцией OnCalculate. --------- -- ! Для сброса индикатора-замыкания в начальное состояние, его надо пересоздать. --------------------------------------------------------------------------------------------------- local AC_IND1 = INDICATORS.AC( 3, -- Период короткой скользящей 5, -- Период длинной скользящей 'SMA' -- Метод расчета скользящих (SMA, MMA, EMA, WMA, SMMA, VMA) ) local AC_IND2 = INDICATORS.AC( -- return value 5, -- Период короткой скользящей 9, -- Период длинной скользящей 'SMA' -- Метод расчета скользящих (SMA, MMA, EMA, WMA, SMMA, VMA) ) local MA_IND1 = INDICATORS.MA( -- return value 5, -- Период скользящей 'SMA' -- Метод расчета скользящих (SMA, MMA, EMA, WMA, SMMA, VMA) ) local MA_IND2 = INDICATORS.ADX( -- return {['ADX'], ['+DI'], ['-DI']} 7, -- Период короткой скользящей 'EMA' -- Метод расчета скользящих (SMA, MMA, EMA, WMA, SMMA, VMA) ) -- Использование индикатора --- for i = 1, size do AC_IND1(DS:C(i)) end for i = 1, size > 15 and 15 or size do AC_IND2(DS:C(i)) end for i = 1, size > 15 and 15 or size do local tbl = {MA_IND1(DS:C(i))} message('MA_IND1 : ' .. tostring(tbl[2])) end for i = 1, size > 100 and 100 or size do MA_IND2(DS:H(i)) end ---- Сброс индикатора (запрос нового замыкания) --- MA_IND2 = INDICATORS.MA( -- return value 100, -- Период скользящей 'EMA' -- Метод расчета скользящих (SMA, MMA, EMA, WMA, SMMA, VMA) ) -- Тест индикаторов Конец ---------------------------------------- while is_run do sleep(timeout) end end function OnStop() is_run = false return 10000 -- (млс.) ожидание завершения потока main прежде чем принудительное его завершение --- end |
------------------------------------------------------------------------------------------------
2. Код модуля:
Код |
---|
--- Модуль подключения индикаторов папки LuaIndicators с сайта ARQA (https://arqatech.com/ru/support/files/): -- Примеры функций расчета индикаторов терминала QUIK на языке Lua. -------------------------------------------- local IND = {} --------------------------------------------------------------------------------------------------- --- КОНСТАНТЫ ------------------------------------------------------------------------------------- local SMA,MMA,EMA,WMA,SMMA,VMA = 'SMA','MMA','EMA','WMA','SMMA','VMA' local OPEN,HIGH,LOW,CLOSE,VOLUME,MEDIAN,TYPICAL,WEIGHTED,DIFFERENCE,ANY = 'O','H','L','C','V','M','T','W','D','A' --------------------------------------------------------------------------------------------------- ---------------- Подключение к роботу индикаторы из папки LuaIndicators (с файлами кодов индикаторов) ------------ local pach_IND = getWorkingFolder() .. '\\LuaIndicators' -- Путь к кодам индикаторов -- -- ! Код индикатора из папки LuaIndicators помещаются в исходном виде внутрь оболочки-фабрики (на Lua), -- обеспечивающей создание индикаторов-замыканий с параметрами заданными при вызове такой фабрики. -- ! Пролог: начало функции-фабрики: ------ local Prologue = [[ -- создание окружения фабрики --- local PRM = {...} --- PRM = PRM[1] -- Таблица параметров индикатора --- ------------------------------------------------------ -- Таблица окружения создаваемого замыкания индикатора -- -- Начальная инициализация тиблицы-окружения замыканий-индикаторо (объектами, используемыми в вычислении индикаторов) -- выполняется из ! текущего окружения фабрики. Существенно только то, что эти объекты должны существовать. local ENV_IND = { -- Объекты из _ENV, необходимые для расчета индикаторов -- tonumber = tonumber , tostring = tostring , type = type , select = select , table = table , pack = pack or table.pack -- , unpack = unpack or table.unpack -- , string = string , math = math , package = package , require = require , debug = debug , next = next , os = os , io = io , RGB = RGB , message = message , getWorkingFolder = getWorkingFolder , getScriptPath = getScriptPath -- !! Переменнпой ENV_begin таблиц-окружения замыканий-индикаторов будет присвоено окружение-родитель (с чего все началось) , ENV_begin = type(ENV_begin) == 'table' and ENV_begin or _ENV -- при первом формировании таблицы-окружения ENV_begin = _ENV } local ENV_ENV = _ENV -- Сохранения окружения -- _ENV = ENV_IND -- Переключение окружения перед инициализацией замыкания индикатора --- ]] -- -- ! Эпилог: в конце функции-фабрики: ------ local Epilogue = [[ ---- Начало эпилога --- if not PRM then message(debug.getinfo(1).currentline .. ' ! ОШИБКА: не заданы параметры индикатора ' .. tostring(Settings.Name), 3) return end --- for k, v in next, PRM do -- присвоение параметров индикатора -- if not Settings[k] then -- #### Выдача сообщения об ошибки --- message(debug.getinfo(1).currentline .. ' ! ОШИБКА в параметрах индикатора ' .. tostring(Settings.Name), 3) end Settings[k] = v end Init() -- Инициализация фабрики параметрами индикатора --- -- Перегрузка function GetValueEX --- function GetValueEX(I,VT, DS) return ds_IND end -- Перегрузка function CandleExist(I,ds) -- проверка существования свечи --- function CandleExist(I,ds) return true end local Index_IND = 0 -- Внутренний счетчик обращения к индикатору (внешняя локальная переменная замыкания)--- ------ _ENV = ENV_ENV -- Восстановление окружения --- return -- возврат замыкания расчета очередного значения шндикатора -- function (DS) -- функция-замыкание для вычисления индикатора -- _ENV = ENV_IND -- ENV_IND - переменная хранения окружения, созданного для замыкания индикатора ds_IND = DS -- Передача значения в расчет индикатора ---- Index_IND = Index_IND + 1 return OnCalculate(Index_IND) end ]] local Indicator_factories = {} -- таблица функций-фабрик создания индикаторов {<Имя индикатора> = <Функция>} -- ---- -- Функция создает фабрики индикаторов на основе кодов из папки LuaIndicators -- -- Результат функция-замыкание индикатора: F_IND --- -- Вызов функции: F_IND(val) -- где val - очередное значение источника индикатора -- -- а результат функции: значения индикатора (их может быть несколько, в зависимости от вида индикатора) local function Get_Indicator(Indic, Settings) local func = Indicator_factories[Indic] if not func then -- Ищется код индикатора и создается его фабрика --- -- Создание фабрики индикатора (поиск кода индикатора, добавление пролога и эпилога, -- компиляция и добавление в Indicator_factories) local folder_of = pach_IND .. '\\' .. Indic .. '.lua' local kod_IND --- Чтениие источника --- local kodZ, io_open, err = pcall( io.open, folder_of, 'r') if io_open then kod_IND = io_open:read('*a') assert(io_open:close()) else message(debug.getinfo(1).currentline .. ' ! ОШИБКА: нет кода индикатора ' .. tostring(Indic), 3) return end kodZ, func, err = pcall(load, Prologue .. kod_IND .. Epilogue) if not func then message(debug.getinfo(1).currentline .. ' ! ОШИБКА: трансляции код индикатора ' .. tostring(Indic) .. '. Подробности: ' .. tostring(err), 3) return end --- Indicator_factories[Indic] = func -- end -- Возвращает экземпляр функции индикатора с состоянием, определяемым параметрами вызова данной функции --- return func(Settings) -- результат функция-замыкание индикатора --- end --------------------------------------------------------------------------------------------------- -- <Функция создания индикаторов> (<Параметры индикатора>) -- Результат: функция-замыкание расчета индикатора. ------ -- Вызов полученного замыкания: -- <Функция-замыкание>(<Очередное значение для расчета индикатора>) -- Результат (возможно несколько значений, определяемых видом индикатора): значения индикатора, -- определяемые параметрами создания замыкания на основе кода индикатора в папке ...Lua\\LuaIndicators. -- !! В кодах индикаторов результат определяется функцией OnCalculate. ----- -- ! Для сброса индикатора-замыкания в начальное состояние, его надо пересоздать. --------------------------------------------------------------------------------------------------- --------------- Далее представлены три примера объявления заголовочных функций описаний параметров -- подключаемых индикаторов. Параметры такой функции это список полей из таблицы Settings соответствующего -- индикатора папки LuaIndicators, для которых требуется задать значения, определяющие поведение создаваемого -- замыкания. Результат: значения функции OnCalculate (их может быть несколько) оответствующего индикатора. -- AC (Accelerator/Decelerator Oscillator) IND.AC = function( SHORT_Period, -- Период короткой скользящей LONG_Period, -- Период длинной скользящей Metod -- Метод расчета скользящих (SMA, MMA, EMA, WMA, SMMA, VMA) ) local Settings = { SHORT_Period = SHORT_Period, LONG_Period = LONG_Period, Metod = Metod } -- Возвращает экземпляр функции индикатора с состоянием, определяемым параметрами вызова текущей функции-- return Get_Indicator('AC', Settings) end --Average Directional Movement Index ("ADX") IND.ADX = function( Period, -- Период Metod -- Метод расчета скользящих (SMA, MMA, EMA, WMA, SMMA, VMA) ) local Settings = { Period = Period, Metod = Metod } -- Возвращает экземпляр функции индикатора с состоянием, определяемым параметрами вызова текущей функции- return Get_Indicator('ADX', Settings) end --Moving Average ("MA") ( 50000 циклов, Period = 100, Metod = SMA: 340 млс.) IND.MA = function( Period, -- Период Metod -- Метод расчета скользящих (SMA, MMA, EMA, WMA, SMMA, VMA) ) local Settings = { Period = Period, Metod = Metod } -- Возвращает экземпляр функции индикатора с состоянием, определяемым параметрами вызова текущей функции- return Get_Indicator('MA', Settings) end -- И так далее (по образу и подобию уже представленных) --- return IND |