Всем привет!
Сегодня мы рассмотрим порядок получения данных по свечам по определенному инструменту. Можно сказать, что это, если не самые основные данные, то одни из самых основных данных, на основании которых могут строиться индикаторы и приниматься решения о выставлении заявок.
Итак, поехали.
За получение данных по свечам в QLUA отвечает функция CreateDataSource().
CreateDataSource (STRING class_code, STRING sec_code, NUMBER interval, [, STRING param])
Входные данные для данной функции следующие:
class_code – код класса бумаги;
sec_code – код бумаги;
interval – переменная, определяющая какие таймфреймы мы смотрим (1 минута, 5 минут и т.д.);
param – не обязательный параметр. Я его и не использую.
Вопрос по поводу кода бумаги и класса бумаги мы уже рассматривали в этом выпуске (ссылка). Данные можно посмотреть как на сайте Мосбиржи, у брокера или в программе QUIK.
На всякий случай повторю как посмотреть в QUIK:
На интересуемом инструменте нажимаем правую кнопку мыши, выбираем «информация об инструменте». И в появившемся окне смотрим нужные данные (Код инструмента и код класса).
Переменная interval может принимать следующие значения:
Как говорится, выбирай на вкус.
Интересно, что переменная interval прямо так и записывается – без всяких скобок.
Вот пример вызова функции CreateDataSource:
data = CreateDataSource(“QJSIM”, “SBER”, INTERVAL_M5);
Думаю, что с входными данными более-менее всё понятно. А вот с выходными данными полная веселуха!
В общем, данная функция возвращает данные в виде такой таблицы:
Веселье заключается в том, что элементами данной таблицы является не числа, не строки, даже не другие массивы – а функции, которые тоже нужно вызывать.
Например, что бы получить количество полученных с сервера свечей нужно выполнить такие действия.
data = CreateDataSource(“QJSIM”, “SBER”, INTERVAL_M5);
data:SetEmptyCallback();
count_svechei = data: Size();
Мне немного трудно объяснить для чего тут вторая строка. Но, поверьте – она нужна. А вот третья строка вызывает функцию из таблицы выше и получает количество свечей. А функции O, H, L, C, V, T с указанием в качестве параметра номера свечи выдаст конкретное число.
Давайте разбираться по порядку. Для начала напишем такой скрипт:
function main()
CLASS_CODE = "QJSIM";
SEC_CODE = "SBER"--Код бумаги
data=CreateDataSource(CLASS_CODE,SEC_CODE, INTERVAL_M5);
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);
else
message("Данные свечей не получены!");
end
end
Если у Вас скрипт выдал количество полученных свечей, то мы идем по правильному пути. Осталось получить данные по ним.
Конкретно сейчас, когда я пишу данный пост, я запустил вышеобозначенный скрипт и он мне выдал, что количество свечей – 165.
Так вот:
Вызов data:O(165) выдаст нам числовое значение – открытие последней свечи.
Соответственно - data:H(165) – выдаст максимум (хай) последней свечи.
data:L(165) – выдаст минимум (лоу) последней свечи.
data:C(165) – выдаст закрытие последней свечи.
data:V(165) – выдаст объем последней свечи.
Соответственно, если нужно получить данные предпоследней свечи, то нужно в скобках указывать параметр (164) и так далее.
Давайте немного модифицируем скрипт:
function main()
CLASS_CODE = "QJSIM";
SEC_CODE = "SBER"--Код бумаги
data=CreateDataSource(CLASS_CODE,SEC_CODE,INTERVAL_M5);
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
local open_current_svechi = data:O(i)
local hi_current_svechi = data:H(i)
local low_current_svechi = data:L(i)
local close_current_svechi = data:C(i)
local volume_current_svechi = data:V(i)
message("Данные по свече № "..i..": Открытие: "..open_current_svechi.."; Максимум: "..hi_current_svechi.."; Минимум: "..low_current_svechi.."; Закрытие: "..close_current_svechi.."; Объем:"..volume_current_svechi);
end
else
message("Данные свечей не получены!");
end
end
В результате выполнения данного скрипта в окне сообщений выдалось такое:
Как видите, в системе уже появилось 168 свечей.
По-хорошему, все эти данные нужно записать в отдельные массивы и работать уже с ними. В дальнейшем мы так и будем делать, когда будем писать что-то более реальное.
Пожалуй, на этом все, что касается получения данных свечей.
Пишите в комментария - получилось ли запустить данный код и получить данные по свечам.
Всем счастливо – всем пока.
Продолжение следует.
⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇
📃 Краткое содержание данного канала.
⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆