Работающие, или, по вашему мнению, работающие функции QLUA.

Автор записи: kalikazandr
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 4, среднее: 5,00 из 5)
Загрузка...

Предлагаю сделать подборку работающих функций или функций, требующих оптимизации.

Добавить комментарий

Работающие, или, по вашему мнению, работающие функции QLUA.: 8 комментариев

  1. Чтение таблицы из файла.
    Один скрипт вначале каждого месяца начинает запись в лог некоторые данные.
    Наконец-то нашел им применение в своем алгоритме, но встала задача считать эти данные в другом скрипте.
    Формат строк в файле имеет вид (ключи в такой записи не должны повторяться!!!):
    ttp = {
    [1454307600]={ 1168,714,8208,9693 },
    [1454310000]={ 1110,699,7704,9710 },
    [1454310300]={ 1401,1173,11706,13323 },
    [1454310600]={ 1528,1434,12308,15305 },
    Как видно - нет закрывающей фигурной скобки (предполагалось, что в конце месяца я ее допишу вручную), если бы она была, то dofile(file_name) вернет мне мою таблицу, но для этого надо сделать копию файла и до записать "}" - чего очень не хотелось. Вот тут придумалось, может кому пригодиться:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    function table_read ( dir )
      local f,err = io.open(dir,"r")
      if f then
        err = string.sub(f:read("*a").."}",6)--закрываю фигурную скобку, обрезаю "ttp = " с пробелами до первой "{"
        f:close()
        err = assert(loadstring("return " .. err ))--получаю функцию, которая вернет мою таблицу
        return err()
      end
      return nil, err--err - описание ошибки
    end
    local new_ttp = table_read ( file_name)
    message (type(new_ttp))-->table
    1. Соответственно, если в файле запись выглядит так:
      { 1168,714,8208,9693 }
      { 1110,699,7704,9710 }
      { 1401,1173,11706,13323 }
      Чуть-чуть меняем функцию и после считывания получаем массив:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      
      function table_read ( dir )
        local f,err = io.open(dir,"r")
        if f then
          err = assert(loadstring("return " .. "{" .. f:read("*a") .. "}" ))--добавляю пару фигурных скобок, получаю функцию, которая вернет мою таблицу
          f:close()
          return err()
        end
        return nil, err--err - описание ошибки
      end
      local new_table = table_read ( file_name)
      message(type(new_table[3]))--> table
  2. Может кому-то пригодиться, сохраню здесь, чтобы не потерять 🙂

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    -- Функция возвращает код класса и код бумаги, по переданному тегу (идентификатору) графика
    -- (если такой есть в терминале), иначе возвращает nil, nil
    getClassAndSecCodesByTag = function(tag)
       -- Получает подпись графика по тегу
       local _, _, legend = getCandlesByIndex (tag, 0, getNumCandles(tag) - 1, 1)
       -- Если такого тега в терминале не найдено, возвращает nil
       if legend == nil then return nil, nil end
       -- Достает из подписи графика код бумаги
       local sec = legend:match("%S+")   
       -- Перебирает список всех классов
       for class_code in getClassesList():gmatch("[^,]+") do
          if class_code == 'TQBR'
          or class_code == 'QJSIM'
          or class_code == 'SPBFUT'
          or class_code == 'SPBOPT' then
             -- Перебирает список всех инструментов класса
             for sec_code in getClassSecurities(class_code):gmatch("[^,]+") do
                -- Если совпадение найдено, возвращает результаты
                if getSecurityInfo(class_code, sec_code).short_name == sec then return class_code, sec_code end         
             end
          end
       end
       -- Если не удалось найти совпадения, возвращает nil
       return nil, nil
    end
  3. Функции для определения точки на линии тренда:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    function fPoint( k, x, b )
       return k * x + b
    end
    --
    function fKoeff ( x, y0, y1 )
      return ( y1 - y0 ) / x
    end
    --Пример падающего тренда:
    H0, indexH0 = 74270, 3218-- (high, № свечи)
    H1, indexH1 = 73330, 3229
    --Рассчитываем коэффициент :
    k =  fKoeff ( indexH1 - indexH0, H0, H1)-- = -85.45454545
    --Рассчитываем точку на линии тренда в свече с 3232 индексом:
    indx = 3232
    point = fPoint( k, indx - indexH0, H0 )-- = 73073.63636
  4. Функция возвращает инструмент базового актива с минимальным числом дней до экспирации.
    Если до экспирации остался 1 день, то возвращает следующий инструмент.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    function Fn_DAYS_TO_MAT_DATE ( base, d )
       local v, s, dtmd = 10000
       for sec in string.gmatch ( getClassSecurities( "SPBFUT" ), "(%w+)" ) do
          if base == getParamEx ( "SPBFUT", sec, "optionbase" ).param_image then
             dtmd = 0 + getParamEx ( "SPBFUT", sec, "DAYS_TO_MAT_DATE" ).param_value
             if dtmd > d and dtmd < v then
                v = dtmd; s = sec
             end
          end
       end
       return s, v
    end
    --вызов--
    local scode, days = Fn_DAYS_TO_MAT_DATE ( 'RTS', 1 )
    message ( scode..':\nдо экспирации дней: '..days)