Таблица "Портфель" в QUIKе

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

Представляю таблицу для портфельных инвестиций.  Цвет строки меняется если Прибыль%<>5%. Обновление каждые 5 сек. Показаны только бумаги с лимитом Т0, для недопущения дублирования. Если хотите, чтоб были бумаги только с лимитом Т2, замените в двух местах «limitKind<1» на «limitKind>1»

Для её создания необходимо:
1. Создать файл «tablePortfolio.txt» в папке «C:\QUIK\Scripts». Если папки нет, создать её.
2. Скопировать туда код скрипта
3. Сохранить, выбрав кодировку «ANSI», иначе вместо русских букв могут быть кракозябры.
4. Сменить расширение файла с ".txt" на ".lua"
5. Запустить скрипт командой Сервисы-> Lua  скрипты-> Добавить (выбрать файл tablePortfolio.lua) -> Запустить

Код скрипта

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

Таблица "Портфель" в QUIKе: 8 комментариев

  1. По просьбе немного обновил код.
    Чтобы в таблице текущая цена отображались нормально, нужно включить трансляцию параметра "цена последней сделки".

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    
    IsRun = true
    class_code = "TQBR"
    class_code2 = "TQTF"
     
    function main()
       -- Получает доступный id для создания
       t_id = AllocTable()   
     
       -- добавить столбцы
       AddColumn(t_id, 1, "Бумага",       true, QTABLE_STRING_TYPE, 20)
       AddColumn(t_id, 2, "Кол-во",       true, QTABLE_INT_TYPE,     7)
       AddColumn(t_id, 3, "Цена покупки", true, QTABLE_DOUBLE_TYPE, 14)
       AddColumn(t_id, 4, "Цена текущая", true, QTABLE_DOUBLE_TYPE,   14)
       AddColumn(t_id, 5, "Прибыль, р",   true, QTABLE_INT_TYPE,   14)
       AddColumn(t_id, 6, "Прибыль, %",   true, QTABLE_INT_TYPE, 14)
       t = CreateWindow(t_id)
     
       for iRow=1, getNumberOf("depo_limits")-1, 1 do
          rowInPortfolioTable = getItem("depo_limits", iRow) -- получить текущую строку из таблицы "Лимиты по бумагам"            
          qtyBoughtLots  = tonumber(rowInPortfolioTable.currentbal)         
          limitKind = rowInPortfolioTable.limit_kind          
          if qtyBoughtLots>0 and limitKind0 and limitKind0 и тип лимита T0
                currentSecCode = rowInPortfolioTable.sec_code
                fullNameOfInstrument =  tostring(getParamEx(class_code, currentSecCode, "SHORTNAME").param_image ) --"LONGNAME"  or
    			if fullNameOfInstrument == "" then
    				 fullNameOfInstrument =  currentSecCode or "0"  
    			end
                avgPrice       = tonumber(rowInPortfolioTable.awg_position_price)                  
                currentPrice = GetAskPrice(currentSecCode)   
                profitAbs = (currentPrice-avgPrice)*qtyBoughtLots      
                profitPerc    = 100*currentPrice/avgPrice   - 100
     
    			totalInvest = totalInvest + avgPrice*qtyBoughtLots  
    			totalPortfolio = totalPortfolio + currentPrice*qtyBoughtLots   
     
                SetCell(t_id, iRowInOutTable, 1, fullNameOfInstrument) -- "Бумага"
                SetCell(t_id, iRowInOutTable, 2, RemoveZero(tostring(qtyBoughtLots))) -- "Кол-во"RemoveZero(tostring(qtyBoughtLots)))
                SetCell(t_id, iRowInOutTable, 3, RemoveZero(tostring( math_round(avgPrice, 3) )))  -- tostring(avgPrice))   -- "Цена покупки"
                SetCell(t_id, iRowInOutTable, 4, RemoveZero(tostring(currentPrice)))   -- "Цена текущая"
                SetCell(t_id, iRowInOutTable, 5, RemoveZero(tostring( math_round( profitAbs, 0)) )) -- "Прибыль, р"
                SetCell(t_id, iRowInOutTable, 6, tostring(math_round(profitPerc, 1)) .."%") -- "Прибыль, %"
     
                if profitPerc >5 then       -- окрашиваем
                   ColourRowInGreen(iRowInOutTable)
                elseif profitPerc5 then       -- окрашиваем
                   ColourRowInGreen(iRowInOutTable)
                elseif profitPerc<-5 then 
                   ColourRowInRed(iRowInOutTable)
                else 
                   ColourRowInYellow(iRowInOutTable)
                end   
                iRowInOutTable = iRowInOutTable+1
          sleep(5000) -- пауза 5 сек.
    	  if IsWindowClosed(t_id) then isRun = false end
          end
       --message("script table portfolio finished")
     
    end
     
     
    function ColourRowInRed(num_row)
       SetColor(t_id, num_row, QTABLE_NO_INDEX, RGB(255,150,150), RGB(0,0,0), RGB(255,150,150), RGB(0,0,0))
    end
    function ColourRowInYellow(num_row)
       SetColor(t_id, num_row, QTABLE_NO_INDEX, RGB(255,255,200), RGB(0,0,0), RGB(255,255,200), RGB(0,0,0))
    end
    function ColourRowInGreen(num_row)
       SetColor(t_id, num_row, QTABLE_NO_INDEX, RGB(150,255,150), RGB(0,0,0), RGB(150,255,150), RGB(0,0,0))
    end
    function GetAskPrice(inp_Sec_Code )
       local ask = tostring(getParamEx(class_code, inp_Sec_Code, "LAST").param_value or getParamEx(class_code2, inp_Sec_Code, "OFFER").param_value or 0) -- "OFFER
       if tonumber(ask) == 0 then
    		ask =  tostring(getParamEx(class_code2, inp_Sec_Code,  "LAST").param_value or 0)
       end
       return ask
    end
    -- Округляет число до указанной точности
    function math_round (num, idp)
       local mult = 10^(idp or 0)
       return math.floor(num * mult + 0.5) / mult
    end
    -- удаление точки и нулей после нее
    function RemoveZero(input)
    	local str = tostring(input)
     
    	--if str:find("%.")==nil and str:find(",")==nil then 
    	if not str:find("%.") and not str:find(",") then 
    		return str 
    		end 
     
    	while (string.sub(str,-1) == "0" and str ~= "0") do			
    		str = string.sub(str,1,-2)		
    	end
    	if (string.sub(str,-1) == ".") then 
    		str = string.sub(str,1,-2)
    	end	
    	if (string.sub(str,-1) == ",") then 
    		str = string.sub(str,1,-2)
    	end	
     
    	return str
    end
    function OnStop()
       DestroyTable(t_id)
       IsRun = false   
    end
      1. Ну не стоит так жестко. Человек старался.
        Вопрос к автору, почему так много ошибок? Может часть кода сайт слопал при размещении?
        Первая строка, переменная isRun, ни где не используется, кроме как в 54 строке и в OnStop. Можно конечно догадаться что она для остановки бесконечного цикла в main, но в main нет бесконечного цикла, а без него скрипт запустился, чего то выполнил и завершился, это так задумано?
        Сильно глубоко в код не вникал, поверхностно что заметил. Строки не комментированные встречаются, да и вроде как цикл for не закрыт...
        Жуть то жуть, но должно же быть объяснение такому не аккуратному коду.

  2. Добрый день Дмитрий ! подскажите . а цена покупки из какой таблица берется. Скачал ТАБЛИЦА "ПОРТФЕЛЬ" В QUIKЕ в первый день, цена покупки была равно той по которой покупал бумаги. а на второй день это цена поменялась .. Не подскажете с чем это связано.

    1. Ценам покупки берется из таблицы "лимиты по бумагам". На строке 52 вычленяется строка из таблицы "лимиты по бумагам" . На строке 61 выделяется средняя цена позиции из вычлененой строки. Изменение цены может быть связано с покупкой акциий причем пару дней назад, т.к. учет ведется по лимиту Т0.

  3. Доброго времени суток! Попробовал запустить скрипт в квике,при запуске пишет "Syntax error while compiling D:\Open_Broker_QUIK\Portfolio.lua:21: 'then' expected near '&' ".Как это исправить?