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
|