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

Автор записи: ram555

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

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

Код скрипта
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
IsRun = true
class_code="TQBR"
 
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_DOUBLE_TYPE,   14)
   AddColumn(t_id, 6, "Прибыль, %",   true, QTABLE_DOUBLE_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 limitKind<1 then
         InsertRow(t_id, iRow)-- добавить новую строку вниз таблицы
      end
   end
   local rows, columns = GetTableSize (t_id)
   InsertRow(t_id, rows+1) -- добавить новую строку вниз таблицы для "Итого"
 
   SetWindowCaption(t_id, "Портфель: прибыли и убытки    © ramirzaev@mail.ru")
 
   -- исполнять цикл, пока пользователь не остановит скрипт или не закроет окно таблицы
   while IsRun do
      if IsWindowClosed(t_id)==true then
         IsRun=false
      end
 
      local currentPrice=0
      local qtyBoughtLots=0
      local profitAbs = 0
      local profitPerc = 0
      local currentSecCode= ""
      local fullNameOfInstrument = ""
      local limitKind = 0
      local rowInPortfolioTable = {}    -- строка из таблицы "Лимиты по бумагам"
      local tableInstrument = {}    -- данные "Таблицы текущих торгов"
      local iRowInOutTable = 1
	  local totalInvest = 0
	  local totalPortfolio = 0
	  local totalProfit = 0
	  local totalPercent = 0
 
      for iRow=0, getNumberOf("depo_limits")-1, 1 do
         rowInPortfolioTable = getItem("depo_limits", iRow) -- получить текущую строку из таблицы "Лимиты по бумагам"
 
         qtyBoughtLots  = tonumber(rowInPortfolioTable.currentbal)
 
         limitKind = rowInPortfolioTable.limit_kind
 
         if qtyBoughtLots>0 and limitKind<1    then      -- если кол-во лотов >0 и тип лимита T0
            currentSecCode = rowInPortfolioTable.sec_code
            fullNameOfInstrument =  tostring(getParamEx(class_code, currentSecCode, "SHORTNAME").param_image or "0") --"LONGNAME"
            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, tostring(qtyBoughtLots)) -- "Кол-во"RemoveZero(tostring(qtyBoughtLots)))
            SetCell(t_id, iRowInOutTable, 3, tostring( math_round(avgPrice, 3) ))  -- tostring(avgPrice))   -- "Цена покупки"
            SetCell(t_id, iRowInOutTable, 4, RemoveZero(tostring(currentPrice)))   -- "Цена текущая"
            SetCell(t_id, iRowInOutTable, 5, tostring( math_round( profitAbs, 0)) ) -- "Прибыль, р"
            SetCell(t_id, iRowInOutTable, 6, tostring(math_round(profitPerc, 1)) .."%") -- "Прибыль, %"
 
            if profitPerc >5 then       -- окрашиваем
               ColourRowInGreen(iRowInOutTable)
            elseif profitPerc<-5 then
               ColourRowInRed(iRowInOutTable)
            else
               ColourRowInYellow(iRowInOutTable)
            end
            iRowInOutTable = iRowInOutTable+1
         end
      end
      totalProfit = totalPortfolio - totalInvest
      totalPercent   = 100*totalProfit/totalInvest
	  SetCell(t_id, iRowInOutTable, 1, "Итого")
      SetCell(t_id, iRowInOutTable, 3, tostring( math_round(totalInvest, 0) ))
      SetCell(t_id, iRowInOutTable, 4, tostring( math_round(totalPortfolio, 0)))
      SetCell(t_id, iRowInOutTable, 5, tostring( math_round( totalProfit, 0)) )
      SetCell(t_id, iRowInOutTable, 6, tostring(math_round(totalPercent, 1)) .."%")
 
	  if profitPerc >5 then       -- окрашиваем
               ColourRowInGreen(iRowInOutTable)
            elseif profitPerc<-5 then
               ColourRowInRed(iRowInOutTable)
            else
               ColourRowInYellow(iRowInOutTable)
            end
            iRowInOutTable = iRowInOutTable+1
      sleep(5000) -- пауза 5 сек.
      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, "OFFER").param_value or 0)
   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(str)
   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
   return str
end
function OnStop()
   DestroyTable(t_id)
   IsRun = false
end