Блог им. 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
Есть и другие задачи по разработке роботов
Не могу найти Ваши контакты, чтобы в личку написать.
Александр