Мне нужно просчитывать два значения ЕМА и RSI. Вроде как RSI расчитывается на значениях EMA.
Представим следующее - в ds хранится 3000 свечей. Подсчитываю нужные мне значения вот так:
Код
for i = 1, key do
ema=f_ema(i, {Period=40, Metod = EMA, VType=CLOSE}, ds)
rsi=f_rsi(i, {Period=14, VType=CLOSE}, ds)
еnd
Но минус вот в чем: все эти значения будут верными если только, просчитывать все значения, иначе выдает неверные значения - проверено. Но один раз можно просчитать все значения (все 3000 свечей, и то необязательно, в моем случае можно взять последние 100 свечей). Если сократить кол-во свечей с 3000 до 100, то скорость программы вырастет в 30 раз - что очень недурно.
С другой стороны, когда мы просчитали все свечи до нужной, то просчитывать в очередной раз все 3000 свечей нет нужды при наступлении нужного нам события (по логике). Можно взять предпоследнее значение и подставить в формулу и расчитать новое значение, в таком случае скорость скрипта еще вырастет.
Однако разработчики так не сделали (или не подумали об этом). В моем случае для просчет EMA нужно обойти все 3000 свечей, а затем и RSI вновь пойдет расчитывать все 3000 свечей, не смотря на то, что вроде вычисления основаны на ЕМА.
У кого-то возникнут вопросы, к чему это все, у нас компы и им не трудно каждый раз просчитывать 3000 и более свечей. А вел я это к тому, что в один прекрасный день весь Quik начнет безбожно тупить и медленно работать, и для оптимальной работы понадобится дорогой компьютер. Но этого можно избежать, если разработчики и сами авторы скриптов будут правильно понимать результат своей работы.
UPD:
В моем случае, дабы не считать каждый раз 3000 свечей можно сделать так:
запоминаем для какой свечи мы производим расчеты
проверяем есть ли расчитанное значения для предыдущей свечи
если да, то просто подставляем в формулу и получаем нужное значение для текущей свечи
если нет, то вычисляем нужные значения для всех свечей, вплоть до предущей, а потом п. 3
нет, коряво написал вопрос в последний раз. подскажите, пожалуйста, как можно создать новый ds_2 из последних 100 свечей старого ds, с возможностью вызова функций :C(i) и других?
Если пытаюсь следующим образом,
Код
for i = #ds - limit, #ds
table.insert(ds_2, {Close = ds:C(i)})
end
-- то потом выдает ошибку
ds_2:C(#ds_2)
можно ли ограничить количество последних свечей, получаемых из функции createDataSource. Мне не нужны все свечи тянуть оттуда, достаточно 100 последних свечей?
можно ли после вызова createDataSource в полученном ds оставить 100 последних свечей?
можно ли как-то кешировать результат работы RSI? Например, я просчитал RSI для всех свечей из ds, а потом хочу через каждую минуту получать RSI только для последней, не производя вычисления для предыдущих свечей?
Подскажите, пожалуйста, как вызвать саму функцию RSI? Имеется вот такой небольшой скрипт: после "local Size = DS[key]:Size()" хочу получить значение RSI, как это сделать?
Скрытый текст
Код
ToolsArray = {'SBER', 'GAZP', 'GMKN', 'LKOH', 'MOEX'}
DS = {}
function OnInit()
-- Подключается к источникам данных, подписывается на обновления
for i = 1, 5 do
DS[ToolsArray[i]] = CreateDataSource('TQBR', ToolsArray[i], INTERVAL_M15)
DS[ToolsArray[i]]:SetEmptyCallback()
end
end
-- проверка получения нескольких источников данных
function main()
message('Start')
for i = 1, 5 do
-- Ждет получения данных с биржи
key = ToolsArray[i]
while DS[key]:Size() == 0 do sleep(10) end
local Size = DS[key]:Size()
-- вот здесь хочу получить значение RSI для текущего инструмента
message(tostring(key)..' свечей:'..tostring(Size)..' '..tostring(DS[key]:O(Size)))
end
for i = 1, 5 do
DS[ToolsArray[i]]:Close()
end
message('End')
end
Добрый день. Использую следующий код (просто скопировал из документации и поменял кода и акцию в CreateDataSource), но ничего не работает. Уточню, что данные пытаюсь получить без открытия данных.
У меня несколько вопросов:
что не так в коде?
где можно посмотреть список кодов, например, TQBR
Код
-- ѕример получени¤ первой свечи текущего дн¤
function main()
-- —оздаем таблицу со всеми свечами нужного интервала, класса и кода
ds, error_desc = CreateDataSource("TQBR", "FDX", INTERVAL_H1)
-- ќграничиваем количество попыток (времени) ожидани¤ получени¤ данных от сервера
local try_count = 0
-- ∆дем пока не получим данные от сервера,
-- либо пока не закончитс¤ врем¤ ожидани¤ (количество попыток)
while ds:Size() == 0 and try_count < 100 do
sleep(100)
try_count = try_count + 1
end
-- ≈сли от сервера пришла ошибка, то выведем ее и прервем выполнение
if ds:Size() == 0 or error_desc ~= nil and error_desc ~= "" then
message("ќшибка получени¤ таблицы свечей:")
return 0
end
-- “екущий день мес¤ца (1 - 31)
local today_day = tonumber(os.date("%d"))
-- “екуща¤ свеча (с которой начинаем поиск)
local current_candle = ds:Size()
-- ћаксимальное количество свечей дл¤ поиска
-- не может быть больше чем общее количество свечей в таблице
local max_candles = math.min(1000, ds:Size())
-- »ндекс первой свечи текущего дн¤
local first_candle_index = nil
-- ÷икл пока не нашли первую свечу дн¤ либо не проверили
-- максимальное количество свечей
while first_candle_index == nil and current_candle > ds:Size() - max_candles do
-- ≈сли день текущей свечи не совпадает с текущим днем
if tonumber(ds:T(current_candle).day) ~= today_day then
-- “огда индекс искомой свечи
first_candle_index = current_candle - 1
message("Ќайден индекс: " .. tostring(first_candle_index))
end
current_candle = current_candle - 1
end
-- ≈сли индекс был найден
if first_candle_index ~= nil then
message("ѕерва¤ свеча дн¤:")
message(" индекс: " .. tostring(current_candle))
message(" врем¤: " .. tostring(ds:T(current_candle).hour) .. ":" .. tostring(ds:T(current_candle).min) .. ":" .. tostring(ds:T(current_candle).sec))
message("ѕоследн¤¤ свеча предыдущего дн¤:")
message(" индекс: " .. tostring(current_candle - 1))
message(" врем¤: " .. tostring(ds:T(current_candle - 1).hour) .. ":" .. tostring(ds:T(current_candle - 1).min) .. ":" .. tostring(ds:T(current_candle - 1).sec))
-- ≈сли индекс найти не удалось
else
message("ѕерва¤ свеча дн¤ не найдена. Ќе достаточно свечей дл¤ поиска (" .. tostring(ds:Size()) .. ").")
message("—ама¤ дальн¤¤ свеча:")
message(" индекс: " .. tostring(1))
message(" врем¤: " .. tostring(ds:T(1).hour) .. ":" .. tostring(ds:T(1).min) .. ":" .. tostring(ds:T(1).sec))
end
end