Я хотела бы научиться писать небольшие вспомогательные програмки на QLUA, опыт програмирования у меня очень небольшой, когда-то давно был курс в университете. Я смогла написать следующую программу, которая выполняет следующее: при запуске формируется таблица с фьючерсами, запоминается в отдельной колонке открытый интересе в момент создания таблицы. Далее, каждые несколько секунд берется текущий открытый интерес и вычисляется изменение открытого интереса. Эти данные выводятся в отдельную колонку.
На текущий момент, больше всего я не понимаю, как работать с типами данных, почему-то чтобы выводились данные в колонку - их нужно преобразовывать в строки, иначе у меня выводятся нули. К сожалению, мне очень не хватает рабочих примеров, чтобы быстрее обучиться.
Хотя код рабочий, я буду признательна, если кто-то сможет подправить код с точки зрения приведения типов. Хочется чтобы в столбцах OI, OIINIT, OICHG, OICHG% были не строки, а числа.
И еще один вопрос, можно ли добавить столбы - которые брали бы открытый интерес на начало дня (на 10 утра по Москве, либо на 19:00 предыдущего дня - любой вариант подходит) - которые брали открытый интерес который был 15 минут назад (получается, это поле должно динамически обновлятьс, достаточно раз в минуту например)
Код
is_run = true
instrument_list = {"BRQ3", "BRU3", "BRV3", "BRX3", "GDU3", "GDZ3", "HSU3", "HSZ3", "NAU3", "NAZ3", "NGQ3", "NGU3", "NGV3", "NGX3", "PDU3", "PDZ3", "PTU3", "PTZ3", "SFU3", "SFZ3", "SVU3", "SVZ3"}
nsecrefresh = 3
function OnStop()
is_run = false
end
function round(num, idp)
if num == nil then return nil end
local mult = 10^(idp or 0)
return math.floor(num * mult + 0.5) / mult
end
function CreateTable()
t_id = AllocTable();
AddColumn(t_id, 0, "FUT", true, QTABLE_INT_TYPE, 10);
AddColumn(t_id, 1, "OI", true, QTABLE_INT_TYPE, 10);
AddColumn(t_id, 2, "OIINIT", true, QTABLE_INT_TYPE, 10);
AddColumn(t_id, 3, "OICHG", true, QTABLE_INT_TYPE, 10);
AddColumn(t_id, 4, "OICHG%", true, QTABLE_DOUBLE_TYPE, 10);
t = CreateWindow(t_id);
SetWindowCaption(t_id, "Open Interest Change");
SetWindowPos(t_id, 100, 100, 252, 532);
class = "SPBFUT"
for k,v in pairs(instrument_list) do
InsertRow (t_id, k)
sec = tostring(v)
mdparam = getParamEx(class, sec, "NUMCONTRACTS")
trueoi = mdparam.param_value
trueoi_str = string.format("%d", trueoi)
SetCell (t_id, k, 0, sec)
SetCell (t_id, k, 1, trueoi_str)
SetCell (t_id, k, 2, trueoi_str)
chg = 0
SetCell (t_id, k, 3, tostring(chg))
chg_pc = 0
SetCell (t_id, k, 4, tostring(chg_pc))
end
return t_id
end;
function RefreshTable (t_id)
for k,v in pairs(instrument_list) do
sec = tostring(v)
mdparam = getParamEx(class, sec, "NUMCONTRACTS")
trueoi = mdparam.param_value
trueoi_str = string.format("%d", trueoi)
SetCell (t_id, k, 1, trueoi_str)
initoi = GetCell(t_id, k, 2).image
chg = trueoi - initoi
chg_str = string.format("%d", chg)
SetCell (t_id, k, 3, chg_str)
initoi_val = tonumber(initoi)
chg_pc = round(chg / initoi_val * 100,2)
SetCell (t_id, k, 4, tostring(chg_pc))
end
end;
function main()
table_id = CreateTable()
while is_run do
sleep(nsecrefresh*1000)
RefreshTable (table_id)
end
end
Я хотела бы научиться писать небольшие вспомогательные програмки на QLUA, опыт програмирования у меня очень небольшой, когда-то давно был курс в университете. Я смогла написать следующую программу, которая выполняет следующее: при запуске формируется таблица с фьючерсами, запоминается в отдельной колонке открытый интересе в момент создания таблицы. Далее, каждые несколько секунд берется текущий открытый интерес и вычисляется изменение открытого интереса. Эти данные выводятся в отдельную колонку.
На текущий момент, больше всего я не понимаю, как работать с типами данных, почему-то чтобы выводились данные в колонку - их нужно преобразовывать в строки, иначе у меня выводятся нули. К сожалению, мне очень не хватает рабочих примеров, чтобы быстрее обучиться.
Хотя код рабочий, я буду признательна, если кто-то сможет подправить код с точки зрения приведения типов. Хочется чтобы в столбцах OI, OIINIT, OICHG, OICHG% были не строки, а числа.
И еще один вопрос, можно ли добавить столбы - которые брали бы открытый интерес на начало дня (на 10 утра по Москве, либо на 19:00 предыдущего дня - любой вариант подходит) - которые брали открытый интерес который был 15 минут назад (получается, это поле должно динамически обновлятьс, достаточно раз в минуту например)
Ликбез. Скрипты пишем не на QLUA, а на Lua. QLua- это библиотека функций для Lua. Эти функции позволяют скрипту обмениваться данными с терминалом QUIK. Поэтому про типы и как писать скрипты на луа надо читать в литературе по программированию на луа. https://jevico.github.io/ https://eligovision.ru/media/upload/lua.pdf https://chenweixiang.github.io/docs/Programming_in_Lua_4th_Edition.pdf ----------------------- Относительно типа выводимых данных в таблицу. Чем Вам мешает сохранение чисел в формате строк? В данной реализации отображения таблицы используется формат строки для хранения отображаемых данных, поэтому надо явно делать из чисел строки. Так сделали разработчики, поэтому надо делать именно так. ---------------------- Изучите библиотеку QLUA и делайте так, как написано в документации. Примите это как догму и не пытайтесь угадать "почему" так сделали разработчики библиотеки. ----------------- QUIK - это программа для подачи поручений брокеру в текущий торговый день. Поэтому в ней отображается текущая информация. Если Вам надо информацию прошлых дней то ее надо сохранять в файлах и потом считывать и отображать. Т е вам надо сделать запись в файл OI, OIINIT, OICHG, OICHG% и считывать значения при запуске QUIK. Хранить данные Вы можете и в двоичном виде как числа, преобразовывать в строку надо лишь для отображения на экране.
Добрый день, Mariana, попробуйте так, ввел проверки на получение данных, ну и локализацию, а в целом понравилось, курс не прошел даром:
Код
local tostring=tostring;
local is_run = true;
local instrument_list = {"BRQ3", "BRU3", "BRV3", "BRX3", "GDU3", "GDZ3", "HSU3", "HSZ3", "NAU3", "NAZ3", "NGQ3", "NGU3", "NGV3", "NGX3", "PDU3", "PDZ3", "PTU3", "PTZ3", "SFU3", "SFZ3", "SVU3", "SVZ3"}
local nsecrefresh = 3;
local class;
function OnStop()
is_run = false
end
function round(num, idp)
if num == nil then return nil end
local mult = 10^(idp or 0)
return math.floor(num * mult + 0.5) / mult
end
function CreateTable()
local t_id = AllocTable();
AddColumn(t_id, 0, "FUT", true, QTABLE_INT_TYPE, 10);
AddColumn(t_id, 1, "OI", true, QTABLE_INT_TYPE, 10);
AddColumn(t_id, 2, "OIINIT", true, QTABLE_INT_TYPE, 10);
AddColumn(t_id, 3, "OICHG", true, QTABLE_INT_TYPE, 10);
AddColumn(t_id, 4, "OICHG%", true, QTABLE_DOUBLE_TYPE, 10);
local t = CreateWindow(t_id);
SetWindowCaption(t_id, "Open Interest Change");
SetWindowPos(t_id, 100, 100, 252, 532);
class = "SPBFUT"
for k,v in pairs(instrument_list) do
InsertRow (t_id, k)
local sec = tostring(v)
local mdparam = getParamEx(class, sec, "NUMCONTRACTS")
local trueoi = mdparam.param_value
local trueoi_str = string.format("%d", trueoi)
SetCell (t_id, k, 0, sec)
SetCell (t_id, k, 1, trueoi_str)
SetCell (t_id, k, 2, trueoi_str)
local chg = 0;
SetCell (t_id, k, 3, tostring(chg))
local chg_pc = 0
SetCell (t_id, k, 4, tostring(chg_pc))
end
return t_id
end;
function RefreshTable(t_id)
for k,v in pairs(instrument_list) do
local sec = tostring(v)
local mdparam = getParamEx(class, sec, "NUMCONTRACTS")
local trueoi = mdparam and mdparam.param_value or 0;
local trueoi_str = string.format("%d", trueoi);
SetCell (t_id, k, 1, trueoi_str)
local initoi = GetCell(t_id, k, 2).image;
local chg = trueoi - initoi;
local chg_str = string.format("%d", chg);
SetCell (t_id, k, 3, chg_str)
local initoi_val = tonumber(initoi);
local chg_pc = initoi_val~=0 and round(chg / initoi_val * 100,2) or 0;
SetCell (t_id, k, 4, tostring(chg_pc))
end
end;
function main()
local table_id = CreateTable()
while is_run do
sleep(nsecrefresh*1000)
RefreshTable(table_id)
end
end
Я хотела бы научиться писать небольшие вспомогательные програмки на QLUA, опыт програмирования у меня очень небольшой, когда-то давно был курс в университете. Я смогла написать следующую программу, которая выполняет следующее: при запуске формируется таблица с фьючерсами, запоминается в отдельной колонке открытый интересе в момент создания таблицы. Далее, каждые несколько секунд берется текущий открытый интерес и вычисляется изменение открытого интереса. Эти данные выводятся в отдельную колонку.
На текущий момент, больше всего я не понимаю, как работать с типами данных, почему-то чтобы выводились данные в колонку - их нужно преобразовывать в строки, иначе у меня выводятся нули. К сожалению, мне очень не хватает рабочих примеров, чтобы быстрее обучиться.
Хотя код рабочий, я буду признательна, если кто-то сможет подправить код с точки зрения приведения типов. Хочется чтобы в столбцах OI, OIINIT, OICHG, OICHG% были не строки, а числа.
И еще один вопрос, можно ли добавить столбы - которые брали бы открытый интерес на начало дня (на 10 утра по Москве, либо на 19:00 предыдущего дня - любой вариант подходит) - которые брали открытый интерес который был 15 минут назад (получается, это поле должно динамически обновлятьс, достаточно раз в минуту например)
Ликбез. Скрипты пишем не на QLUA, а на Lua. QLua- это библиотека функций для Lua. Эти функции позволяют скрипту обмениваться данными с терминалом QUIK. Поэтому про типы и как писать скрипты на луа надо читать в литературе по программированию на луа. https://jevico.github.io/ https://eligovision.ru/media/upload/lua.pdf https://chenweixiang.github.io/docs/Programming_in_Lua_4th_Edition.pdf ----------------------- Относительно типа выводимых данных в таблицу. Чем Вам мешает сохранение чисел в формате строк? В данной реализации отображения таблицы используется формат строки для хранения отображаемых данных, поэтому надо явно делать из чисел строки. Так сделали разработчики, поэтому надо делать именно так. ---------------------- Изучите библиотеку QLUA и делайте так, как написано в документации. Примите это как догму и не пытайтесь угадать "почему" так сделали разработчики библиотеки. ----------------- QUIK - это программа для подачи поручений брокеру в текущий торговый день. Поэтому в ней отображается текущая информация. Если Вам надо информацию прошлых дней то ее надо сохранять в файлах и потом считывать и отображать. Т е вам надо сделать запись в файл OI, OIINIT, OICHG, OICHG% и считывать значения при запуске QUIK. Хранить данные Вы можете и в двоичном виде как числа, преобразовывать в строку надо лишь для отображения на экране.
Спасибо за советы. По поводу данных типа строки - мне показалось это неудобным и каким-то костылем, хотя бы потому что надо преобразовывать постоянно данные. Ну и сортировка например в таблице не работает. Но я поняла, что это такая особенность. По поводу сохранения данных - тоже понятно, постараюсь реализовать.
VPM написал: Добрый день, Mariana, попробуйте так, ввел проверки на получение данных, ну и локализацию, а в целом понравилось, курс не прошел даром:
Код
local tostring = tostring;
local is_run = true ;
local instrument_list = {"BRQ3", "BRU3" , "BRV3" , "BRX3" , "GDU3" , "GDZ3" , "HSU3" , "HSZ3" , "NAU3" , "NAZ3" , "NGQ3" , "NGU3" , "NGV3" , "NGX3" , "PDU3" , "PDZ3" , "PTU3" , "PTZ3" , "SFU3" , "SFZ3" , "SVU3" , "SVZ3" }
local nsecrefresh = 3 ;
local class;
function OnStop ()
is_run = false
end
function round (num, idp)
if num = = nil then return nil end
local mult = 10 ^(idp or 0 )
return math.floor (num * mult + 0.5 ) / mult
end
function CreateTable ()
local t_id = AllocTable ();
AddColumn (t_id, 0 , "FUT" , true , QTABLE_INT_TYPE, 10 );
AddColumn (t_id, 1 , "OI" , true , QTABLE_INT_TYPE, 10 );
AddColumn (t_id, 2 , "OIINIT" , true , QTABLE_INT_TYPE, 10 );
AddColumn (t_id, 3 , "OICHG" , true , QTABLE_INT_TYPE, 10 );
AddColumn (t_id, 4 , "OICHG%" , true , QTABLE_DOUBLE_TYPE, 10 );
local t = CreateWindow (t_id);
SetWindowCaption (t_id, "Open Interest Change" );
SetWindowPos (t_id, 100 , 100 , 252 , 532 );
class = "SPBFUT"
for k,v in pairs(instrument_list) do
InsertRow (t_id, k)
local sec = tostring(v)
local mdparam = getParamEx (class, sec, "NUMCONTRACTS" )
local true oi = mdparam.param_value
local true oi_str = string.format ( "%d" , true oi)
SetCell (t_id, k, 0 , sec)
SetCell (t_id, k, 1 , true oi_str)
SetCell (t_id, k, 2 , true oi_str)
local chg = 0 ;
SetCell (t_id, k, 3 , tostring(chg))
local chg_pc = 0
SetCell (t_id, k, 4 , tostring(chg_pc))
end
return t_id
end ;
function RefreshTable (t_id)
for k,v in pairs(instrument_list) do
local sec = tostring(v)
local mdparam = getParamEx (class, sec, "NUMCONTRACTS" )
local true oi = mdparam and mdparam.param_value or 0 ;
local true oi_str = string.format ( "%d" , true oi);
SetCell (t_id, k, 1 , true oi_str)
local initoi = GetCell (t_id, k, 2 ).image;
local chg = true oi - initoi;
local chg_str = string.format ( "%d" , chg);
SetCell (t_id, k, 3 , chg_str)
local initoi_val = tonumber(initoi);
local chg_pc = initoi_val~ = 0 and round(chg / initoi_val * 100 , 2 ) or 0 ;
SetCell (t_id, k, 4 , tostring(chg_pc))
end
end ;
function main ()
local table_id = CreateTable()
while is_run do
sleep (nsecrefresh * 1000 )
RefreshTable(table_id)
end
end
Спасибо большое, все понятно. Мне очень поможет ваш код, чтобы писать свое более правильно. По поводу получение instrument_list - буду изучать, но чуть попозже, пока реализация со строкой инструментов в коде мне достаточно удобна