Таблица с измемениями открытого интереса

Страницы: 1
RSS
Таблица с измемениями открытого интереса
 
Здравствуйте,

Я хотела бы научиться писать небольшие вспомогательные програмки на 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
 
Цитата
Mariana написал:
Здравствуйте,

Я хотела бы научиться писать небольшие вспомогательные програмки на 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
 
Получение instrument_list  лучше автоматизировать, примеры есть на сайте. Я думаю что и проверка на sec нужна.
 
Цитата
nikolz написал:
Цитата
Mariana написал:
Здравствуйте,

Я хотела бы научиться писать небольшие вспомогательные програмки на 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 - буду изучать, но чуть попозже, пока реализация со строкой инструментов в коде мне достаточно удобна
 
По моему, график гораздо нагляднее, чем цифры.
И скрипт писать не нужно.
Всё пройдет. Но это не точно.
Страницы: 1
Читают тему
Наверх