Блог им. 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
★22
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

теги блога gardist

....все тэги



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