Найти тему

Расчет торговых индикаторов в скриптах QLUA на примере RSI

Всем привет!

Сегодня я хотел бы рассказать о том, как можно в своих скриптах использовать данные торговых индикаторов. И, у меня для вас сразу есть очень плохая новость: нет простых команд, которые позволяли бы получать значения этих индикаторов. По сути, чтобы получать эти значения, нужно программно реализовывать их расчет. Но, есть и хорошая новость – расчет многих индикаторов уже реализован на LUA. Года три назад, общаясь на форуме по КВИКУ (https://forum.quik.ru/), я нашел ссылку на реализованные индикаторы. Правда ссылка не работала, мне потом дали работающую ссылку. Но, я на всякий случай все эти скрипты себе скопировал. Теперь и вы можете скопировать их с моего ресурса – ссылка.

Но, не спешите радоваться! Лично я не нашел способа как их можно использовать в своих скриптах. Дело в том, что эти скрипты написаны во-первых для отрисовки графиков, а не для числовых расчетов в самописных скриптах. А во-вторых, они написаны профессиональными программистами, практически без комментариев, и, по крайне мере, у меня не получилось разобраться в них, чтобы частично выбрать для себя. Возможно, что у вас это получится – пробуйте. Обязательно прочитайте файл «readme_.....».

Итак, это было небольшое отступление. Сегодня давайте напишем скрипт, который прочитает свечи по какому-нибудь инструменту и рассчитает индекс RSI по каждой свечи.

Так как нам нужно будет программно реализовать расчет RSI, то нужно найти формулы, по которым считается этот индекс. Не будем сильно мудрить, а посмотрим все эти формулы в Википедии: (https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%B4%D0%B5%D0%BA%D1%81_%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D0%B8%D0%BB%D1%8B)

Итак,

Для расчета RSI используются положительные (U) и отрицательные (D) ценовые изменения. День называется «восходящим», если цена закрытия сегодня выше, чем вчера.

-2

День называется «нисходящим», если цена закрытия сегодня ниже, чем вчера.

-3

Если цены закрытия сегодня и вчера равны, то U и D равны 0. После значения U и D сглаживаются с помощью модифицированной экспоненциальной скользящей средней с периодом N. Таким образом, рассчитывается сначала т.н. «относительная сила» (англ. Relative Strength, RS):

-4

На основе RS рассчитывается и сам RSI:

-5

Для полноты картины формул нужно только найти ещё формулу для EMA - экспоненциальной скользящей средней. Немного пояндексив, можно найти и эту формулу:

-6

, где

EMAx– текущее значение EMA;

Price – текущее значение цены;

EMAx-1– значение EMA предыдущей свечи;

k – коэффициент, рассчитывающийся по формуле: k = 2 / (N+ 1);

N – период, то есть количество свечей по которым будет произведен расчет средней. Чаще всего для RSI принимают равным 14.

Теперь все формулы у нас есть.

Как прочитать данные свечей мы разбирали в одном из предыдущих выпусков: - https://dzen.ru/a/Y80A0AlxWCadxQUd

Воспользуемся тем скриптом, но немного его модифицируем.

Основная часть скрипта будет выглядеть так:

function main()
CLASS_CODE = "TQBR";
SEC_CODE = "SBER"--Код бумаги
price = {} -- массив с ценами;
time_svechi = {} -- массив со временем свечей
RSI = {} -- массив со значением RSI по каждой свече.
data=CreateDataSource(CLASS_CODE,SEC_CODE,INTERVAL_D1);
data:SetEmptyCallback()
i=0;
while ((i<100)and((data:Size()==0)))do --ожидаем получения данных по свечам.
i=i+1
sleep(100);
end
if (data)then --данные свечи получены.
local count_svechei = data:Size() -- узнаем количество свечей.
message("Свечи получены. Количество свечей- "..count_svechei);
for i = 1, count_svechei do
price[i] = data:C(i) -- в качестве цены записываем цену закрытия свечи.
local time_current_svechi = data:T(i)
time_svechi[i] = time_current_svechi['day'].."."..time_current_svechi['month'].."."..time_current_svechi['year'].." - "..time_current_svechi['hour']..":"..time_current_svechi['min'] -- записываем время свечи.
end
make_info_about_RSI(price) -- запуск функции по расчетуRSI для всех свечей.
for i = 1, count_svechei do -- выводим данные по каждой свечи - цена закрытия, дата и RSI.
message("Время свечи: "..time_svechi[i]..";Цена: "..price[i].."; Значение RSI:"..RSI[i]);
end
else
message("Данные свечей не получены!");
end
end

А в отдельной функции make_info_about_RSI() будут реализованы все формулы, которые мы нашли, и для каждой свечи будет произведен расчет RSI.

Вот код этой отдельной функции:

function make_info_about_RSI(arr) -- функция проставляет уровень RSI для всех свечей.
local N = give_size_array(arr); -- узнаем размер массива с ценами.
local N_RSI = 14; -- переменная для расчета EMA. Устанавливает количество свечей по которым будет вестись усреднение.
local u = {}
local d = {}
local EMA_U = {}
local EMA_D = {}
local RS = {}
local temp_price = 0;
local alfa = 2 / (N_RSI + 1)
local nach = 1; -- переменная, начиная с которой ведем расчет RSI. По умолчанию расчет ведем с первой свечи, то есть для всех свечей.
for i = nach, N do
if (i == nach) then
u[i] = 0;
d[i] = 0;
EMA_U[i] = 0;
EMA_D[i] = 0;
RS[i] = 0;
RSI[i] = 0;
goto end_iteration_make_info_about_RSI
end
temp_price = arr[i] - arr[i - 1];
if (temp_price > 0) then
u[i] = temp_price
d[i] = 0;
else
u[i] = 0;
d[i] = temp_price * (-1)
end
if (i == (nach + 1))then
EMA_U[i] = u[i]
EMA_D[i] = d[i]
else
EMA_U[i] = u[i] * alfa + (1 - alfa) * EMA_U[i - 1]
EMA_D[i] = d[i] * alfa + (1 - alfa) * EMA_D[i - 1]
end
if (EMA_D[i] ~= 0)then
RS[i] = EMA_U[i] / EMA_D[i]
else
RS[i] = 0;
end
RSI[i] = 100 - (100 / (1 + RS[i]))
::end_iteration_make_info_about_RSI::
end
end

Скачать код скрипта

Посмотреть код скрипта

Если запустить данный скрипт, то в окне сообщений по каждой свече будет выдана информация в таком виде:

-7

Если Вы знакомы с индикатором RSI, то должны знать, что у него есть зоны перекупленности и зоны перепроданности. То есть если RSI имеет большое значение, например более 80, то считается, что он находится в состоянии перекупленности, и, можно предположить, что цена начнет снижаться. И наоборот, если значение этого индикатора менее, например 20, то считается, что рассматриваемый инструмент находится в зоне перепроданности и можно ожидать в ближайшее время рост цены. Но, это не точно. Не все же так просто. Но, хочу сказать, что индикатор для своего анализа используется многими аналитиками. В частности, с помощью него выявляют дивергенцию и конвергецию – ситуации, когда цена и индикатор двигаются разнонаправленно. Считается, что это сигнал на изменение направления движения цены. К слову сказать, я использую вычисление дивергении и конвергенции и именно на RSI.

Пожалуй, на сегодня все. Всем счастливо – всем пока.

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

====================================

Краткое содержание данного канала.

➖➖➖➖➖➖➖➖➖➖➖➖➖

Landingcentr.ru - разработка сайтов для малого и среднего бизнеса.

====================================