--
-- Выполнение действий с массивами.
--
local pairs = pairs
local type = type
module(...)
--- Создать копию массива (таблицы)
-- @return копию массива (таблицы)
function copy(array)
local copy_array = {}
if type(array) ~= "table" then
return array
end
for k, v in pairs(array) do
if type(v) == "table" then
copy_array[k] = copy(v)
else
copy_array[k] = v
end
end
return copy_array
end
--- Узнать, начинается ли индексация в массиве с нуля или с единицы.
-- @return 0 или 1
function base(array)
if array[0] ~= nil then
return 0
else
return 1
end
end
--- Вычислить число элементов в массиве.
-- @return число элементов в массиве
function size(array)
local n = 0
for _, _ in pairs(array) do
n = n + 1
end
return n
end
--- Проверить пустой или нет массив.
-- @return true/false
function isEmpty(array)
for _, _ in pairs(array) do
return false
end
return true
end
--- Получить первый индекс массива, где ничего не записано. Поиск начинается с 1.
-- @return первый индекс массива, где ничего не записано
function firstEmptyIndex(array)
local i = 1
while array[i] ~= nil do
i = i + 1
end
return i
endСамый простой, по сути код. Но Lua выдаёт ошибку при компилировании без function main(), при том что Quik выполняет этот код без конструкции main или function. Раньше такой ошибки не было.message(«a»)
------------------------------Output------------------------------
>lua -e «io.stdout:setvbuf 'no'» «a.lua»
lua: a.lua:1: attempt to call global 'message' (a nil value)
stack traceback:
a.lua:1: in main chunk
[C]: ?
>Exit code: 1

PORTFOLIO_EX LUK;
DESCRIPTION Объёмы купли/продажи за интервал;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST FIRMID;
PROGRAM
'Автор: Михаил Булычев
'Что делает:
' подсчитывается объёмы купли\продажи по определённому инструменту за
' заданный интервал
'Как использовать:
' В следующих строках следует указать код бумаги и код класса для
' отслеживаемого инструмента
'=============================НАСТРОЙКИ===============================
SecCode="LKOH" ' Код инструмента
ClassCode="TQBR" 'Код класса
interv=3600 'является интервалом в секундах
razn = 0 'смещение часового пояса относительно времени торговой системы.
'=============================НАСТРОЙКИ===============================
FUNC is_in_interval(interval, trade_time, sys_time, hour_shift)
csys_time_value=0
c_time_value=0
csys_time_value =0 + (0 + get_value(sys_time, "Hour") + hour_shift)*3600 + _
get_value(sys_time, "Min")*60 + _
get_value(sys_time, "Sec")
c_time_value=0 + ((0 + substr("" & trade_time, 0, 2)) * 3600) + ((0 + substr("" & trade_time, 2, 2)) * 60) + ((0 + substr("" & trade_time, 4, 2)))
csys_time_value = csys_time_value + 0
c_time_value = c_time_value + 0
k=csys_time_value - c_time_value
if k <= interval
result=1
else
result=0
end if
END FUNC
buy_value=0
sell_value=0
total_value=0
sys_time = GET_DATETIME()
delete_all_items()
mString=create_map()
j=0
n=get_number_of("ALL_TRADES")
for i from 0 to n
mTrade=get_item("ALL_TRADES", n-i)
trade_time=get_value(mTrade, "TIME")
if (get_value(mTrade, "SECCODE")= SecCode) AND (get_value(mTrade, "CLASSCODE")= ClassCode)
if is_in_interval(interv, trade_time, sys_time, 0-razn) = 1
value=0+get_value(mTrade, "VALUE")
j=j+1
if (get_value(mTrade, "OPERATION") = "BUY")
buy_value=buy_value+value
else
sell_value=sell_value+value
end if
total_value=total_value+value
else
break
end if
end if
end for
mString=set_value(mString, "vol", total_value)
mString=set_value(mString, "volbuy", buy_value)
mString=set_value(mString, "volsell", sell_value)
add_item(1, mString)
END_PROGRAM
PARAMETER vol;
PARAMETER_TITLE vol;
PARAMETER_DESCRIPTION Купили;
PARAMETER_TYPE NUMERIC(10,0);
END
PARAMETER volbuy;
PARAMETER_TITLE volbuy;
PARAMETER_DESCRIPTION Купили;
PARAMETER_TYPE NUMERIC(10,0);
END
PARAMETER volsell;
PARAMETER_TITLE volsell;
PARAMETER_DESCRIPTION Продали;
PARAMETER_TYPE NUMERIC(10,0);
END
END_PORTFOLIO_EX
Возможности новой версии
1. Реализован функционал быстрого фильтра в таблицах. Для активации \ деактивации быстрого фильтра используется пункт «Включить быстрый фильтр» \ «Выключить быстрый фильтр» контекстного меню, открываемого для заголовка самого левого столбца таблицы. Данный функционал позволяет фильтровать информацию в таблицах QUIK с наглядным отображением критериев фильтрации.

void lua_pushnumber (lua_State *L, lua_Number n);
const char *lua_pushstring (lua_State *L, const char *s);
lua_Number lua_tonumber (lua_State *L, int index);
const char *lua_tostring (lua_State *L, int index);где L — указатель Lua-стэка, а index — абсолютный или относительный индекс переменной в стэке.