Блог им. gardist
По следам этого поста скрипт на qlua, называется «Светофор».
Суть скрипта- отслеживать дистанцию до «дна», которое представляет собой лои 2008 года+накопленная инфляция.
Подсветка строк:
зеленым- цена ниже уровня инфляции
желтым — до дна менее 50%
красным — до дна более 80%
сортировка строк по ctrl+клик
В чем не смог разобраться:
как получить лой 2008 года по акции (вбито вручную)
как получить полное название компаний (вбито вручную)
кто знает — подскажите!
Как это выглядит в Квике:
Бэктест на проливе 2014 года:
Код:
-- Обьявляем переменные
sIsRun=true;
sDate=0;
sDno=0;
sDistance=0;
--Инфляция 2009-2016
sInflation=88.77;
-- Массив с названием компаний
aTickerName= {"Сбербанк", "Газпром", "Лукойл",
"ГМКНорНик", "Система",
"Аэрофлот", "Роснефть", "Транснф",
"ФСК ЕС", "РусГидро", "СеверСталь",
"Новатек", "Магнит", "Татнефть",
"Сургнфтз-п", "М.видео", "ИнтерРАО",
"НЛМК", "ММК", "Россети",
"Ростел", "МТС", "Уркалий"}
-- Массив с тикерами
aTickerList = {"SBER", "GAZP", "LKOH",
"GMKN", "AFKS",
"AFLT", "ROSN", "TRNFP",
"FEES", "HYDR", "CHMF",
"NVTK", "MGNT", "TATN",
"SNGSP", "MVID", "IRAO",
"NLMK", "MAGN", "RSTI",
"RTKM", "MTSS", "URKA"};
-- Массив с лоями 2008 года
aTickerLow2008={14, 86, 740,
1228, 4.5,
20, 94, 6728,
0.054, 0.4, 80,
50, 312, 32.63,
5.16, 24, 0.54,
20, 4.5, 0.6,
150, 100, 25};
function main()
-- Создает таблицу
CreateTable();
-- Основной цикл
while sIsRun do
-- Дата и время
sDate=getInfoParam('TRADEDATE').." "..getInfoParam('SERVERTIME');
-- Перебираем компании: k -порядковый номер, v - название тикера
for k,v in pairs(aTickerList) do
-- Крайняя цена
sBID=tonumber(getParamEx("TQBR", v, "LAST").param_value);
-- Расчетное дно
sDno=math.floor(((aTickerLow2008[k]*(sInflation+100))/100)*100)/100;
-- Сколько до дна %
sDistance=math.floor((100-((sDno*100)/sBID))*100)/100;
-- Вставляем данные в табличку
SetCell(t_id, k, 0, tostring(sDate));
SetCell(t_id, k, 1, tostring(aTickerName[k]));
SetCell(t_id, k, 2, tostring(v));
SetCell(t_id, k, 3, tostring(sBID),sBID);
SetCell(t_id, k, 4, tostring(sDno),sDno);
SetCell(t_id, k, 5, tostring(sDistance),sDistance);
-- Раскрашиваем желтым
if sDistance<50 then
Yellow(k);
end;
-- Раскрашиваем красным
if sDistance>80 then
Red(k);
end;
-- Раскрашиваем зеленым
if sDistance<0 then
Green(k);
end;
end;
-- Спим
sleep(50000);
end;
end;
--- Функция создает таблицу
function CreateTable()
-- Получает доступный id для создания
t_id = AllocTable();
-- Добавляет 6 колонок
AddColumn(t_id, 0, "Дата", true, QTABLE_DATE_TYPE, 15);
AddColumn(t_id, 1, "Название", true, QTABLE_STRING_TYPE, 15);
AddColumn(t_id, 2, "Ticker", true, QTABLE_STRING_TYPE, 15);
AddColumn(t_id, 3, "BID", true, QTABLE_DOUBLE_TYPE, 15);
AddColumn(t_id, 4, "Расчетное дно", true, QTABLE_DOUBLE_TYPE, 15);
AddColumn(t_id, 5, "Сколько до дна (%)", true, QTABLE_DOUBLE_TYPE, 15);
-- Создаем
t = CreateWindow(t_id);
-- Даем заголовок
SetWindowCaption(t_id, "Светофор");
-- Добавляет строку
for k,v in pairs(aTickerList) do
InsertRow(t_id, k);
end
SetTableNotificationCallback(t_id, EventCallBack);
end;
--- Функция обработки событий таблицы
function EventCallBack(t_id, msg, par1, par2)
if msg==QTABLE_CLOSE then
OnStop();
end;
end;
--- Функции по раскраске ячеек таблицы
function Red(col)
SetColor(t_id, col, -1, RGB(255,168,164), RGB(0,0,0), RGB(255,168,164), RGB(0,0,0));
end;
function Green(col)
SetColor(t_id, col, -1, RGB(157,241,163), RGB(0,0,0), RGB(157,241,163), RGB(0,0,0));
end;
function Yellow(col)
SetColor(t_id, col, -1, RGB(249,247,172), RGB(0,0,0), RGB(249,247,172), RGB(0,0,0));
end;
-- Функция вызывается когда пользователь останавливает скрипт
function OnStop()
sIsRun = false;
if t_id ~= nil then
DestroyTable(t_id);
end;
end;
ссылка на скрипт
P.S.: не является рекомендацией к покупке/продаже акций, использование программы на ваш страх и риск.
Кросспост rffx.ru
UPD: Serg внес замечания.
Дальше в функции СallBackDataSource ищите минимум по таблице свечей DataSource.
1. BOOLEAN SetColor(NUMBER t_id, NUMBER row, NUMBER col, NUMBER b_color, NUMBER f_color, NUMBER sel_b_color, NUMBER sel_f_color) — т.е. сначала идет row (строка), а потом col (столбец).
2. Строку можно закрасить без использования цикла, указав в качестве col константу QTABLE_NO_INDEX.
Все это есть в описании этой функции в файле, поставляемом с квиком qlua.chm.
SetCell(t_id, k, 3, tostring(sBID), sBID);
SetCell(t_id, k, 4, tostring(sDno), sDno);
SetCell(t_id, k, 5, tostring(sDistance), sDistance);
еще пофиксить типы переменных в AddColumn:
AddColumn(t_id, 0, «Дата», true, QTABLE_DATE_TYPE, 15);
AddColumn(t_id, 1, «Название», true, QTABLE_STRING_TYPE, 15);
AddColumn(t_id, 2, «Ticker», true, QTABLE_STRING_TYPE, 15);
AddColumn(t_id, 3, «BID», true, QTABLE_DOUBLE_TYPE, 15);
AddColumn(t_id, 4, «Расчетное дно», true, QTABLE_DOUBLE_TYPE, 15);
AddColumn(t_id, 5, «Сколько до дна (%)», true, QTABLE_DOUBLE_TYPE, 15);
1. Сделать в OnStop так:
sIsRun = false;
if t_id ~= nil then
DestroyTable (t_id);
end;
2. Добавить в конец CreateTable:
— Задание функции обратного вызова для обработки событий в таблице
SetTableNotificationCallback (t_id, EventCallback)
3. Добавить функцию обработки коллбэков:
— Функция обратного вызова для обработки событий в таблице
function EventCallback (t_id, msg, par1, par2)
if msg == QTABLE_CLOSE then
— Закрытие таблицы
OnStop()
end
end;
SetCell(t_id, k, 1, tostring(getParamEx(«TQBR», v, «SHORTNAME»).param_image));
Добрый день! Заинтересовался
Вашим продуктом — «Светофор». Мне нужно его несколько доработать под мои
задачи. Само собой, на платной основе. Если есть
интерес к взаимодействию - пишите на почту a_butyrkin@mail.ru. Или можете позвонить 985 765 28 01
Есть и другие задачи по разработке роботов
Не могу найти Ваши контакты, чтобы в личку написать.
Александр