gardist
gardist личный блог
16 мая 2017, 22:14

Скрипт на 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 внес замечания.

10 Комментариев
  • Karim
    17 мая 2017, 00:04
    как получить лой 2008 года по акции
    Подписываемся на источник данных (месячные бары)
    DataSource = CreateDataSource(ClassCode, SecCode, INTERVAL_MN1)<br>DataSource:SetUpdateCallback(CallBackDataSource)
    
    Дальше в функции СallBackDataSource ищите минимум по таблице свечей DataSource.
  • Serg
    17 мая 2017, 08:30
    Пару замечаний по использованию функции 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.
  • Serg
    17 мая 2017, 11:14
    Эх, кто нибудь написал бы еще функцию сортировки таблицы по убыванию или возрастанию в столбце 5. Че то я по гуглил — ничего хорошего не нашел, только на форуме квика кое какие намеки есть, но че то у меня с ходу не получилось. Желательно используя только информацию самой таблицы и номер столбца по которому сортировать.
      • Serg
        17 мая 2017, 13:43
        gardist, ok, спасибо
  • Serg
    17 мая 2017, 12:39
    Еще для нормального закрытия скрипта нужно сделать несколько вещей:
    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;


  • Serg
    17 мая 2017, 17:57
    О, нашел как получить имя компании, скорее короткое название бумаги:
    SetCell(t_id, k, 1, tostring(getParamEx(«TQBR», v, «SHORTNAME»).param_image));
  • roboforts
    29 мая 2017, 01:12
    Сортировку я так понял уже сделали — если что обращайтесь — опыт есть
  • Бутыркин Александр
    08 ноября 2018, 22:24

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

  • Евгений
    05 декабря 2022, 21:33

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн