Блог им. gardist

Скрипт на qlua - Светофор

По следам этого поста скрипт на qlua, называется «Светофор».
Суть скрипта- отслеживать дистанцию до «дна», которое представляет собой лои 2008 года+накопленная инфляция.

Подсветка строк:
зеленым- цена ниже уровня инфляции
желтым — до дна менее 50%
красным — до дна более 80%

сортировка строк по ctrl+клик

В чем не смог разобраться:
как получить лой 2008 года по акции (вбито вручную)
как получить полное название компаний (вбито вручную)
кто знает — подскажите!

Как это выглядит в Квике:
Скрипт на qlua - Светофор


Бэктест на проливе 2014 года:
Скрипт на qlua - Светофор

Код:

-- Обьявляем переменные
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 внес замечания.

Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
  • обсудить на форуме:
  • Quik Lua
1.3К | ★23
10 комментариев
как получить лой 2008 года по акции
Подписываемся на источник данных (месячные бары)
DataSource = CreateDataSource(ClassCode, SecCode, INTERVAL_MN1)<br>DataSource:SetUpdateCallback(CallBackDataSource)
Дальше в функции СallBackDataSource ищите минимум по таблице свечей DataSource.
avatar
Пару замечаний по использованию функции SetColor:
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.
avatar
Эх, кто нибудь написал бы еще функцию сортировки таблицы по убыванию или возрастанию в столбце 5. Че то я по гуглил — ничего хорошего не нашел, только на форуме квика кое какие намеки есть, но че то у меня с ходу не получилось. Желательно используя только информацию самой таблицы и номер столбца по которому сортировать.
avatar
Serg,  сортировка по ctrl+клик заработала, нужно было добавить еще один параметр в SetCell:

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);

avatar
gardist, ok, спасибо
avatar
Еще для нормального закрытия скрипта нужно сделать несколько вещей:
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;


avatar
О, нашел как получить имя компании, скорее короткое название бумаги:
SetCell(t_id, k, 1, tostring(getParamEx(«TQBR», v, «SHORTNAME»).param_image));
avatar
Сортировку я так понял уже сделали — если что обращайтесь — опыт есть
avatar

Добрый день! Заинтересовался
Вашим продуктом — «Светофор». Мне нужно его несколько доработать под мои
задачи. Само собой, на платной основе. Если есть
интерес к взаимодействию - пишите на почту a_butyrkin@mail.ru. Или можете позвонить 985 765 28 01
Есть и другие задачи по разработке роботов
Не могу найти Ваши контакты, чтобы в личку написать.
Александр

avatar

Читайте на SMART-LAB:
Фото
Сделки в портфеле ВДО
Останавливаем покупку в портфеле PRObonds ВДО облигаций Трансконтейнера. Телеграм: @AndreyHohrin Не является инвестиционной...
Фото
AUD/JPY: Красивый разворот, который может пойти не по плану?
Кросс-курс AUD/JPY повторно протестировал уровень сопротивления 114.71, при этом рынок пытается закрыть текущий день разворотной формацией...
Фото
Годовой отчет Аэрофлота 2025
Друзья, представляем вашему вниманию годовой отчет Группы «Аэрофлот» за 2025 год ➡️ ir.aeroflot.ru/ru/reporting/annual-reports/   ✈️ Мы...
Фото
Роснефть: маржа пошла по EBITDA вверх, но обесценения снизили чистую прибыль. Зато скоро запустят Восток ойл
Роснефть отчиталась по МСФО вчера ночью за 1-й квартал 👉 Выручка -11% г/г 👉 Опер прибыль на уровне прошлого года 👉...

теги блога gardist

....все тэги



UPDONW
Новый дизайн