Роман (Автор тем)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Добавить описание Сигмы в Руководство пользователя "Модуля опционной аналитики", Добавить описание Сигмы в Руководство пользователя "Модуля опционной аналитики"
 
Добрый день,

В разделе 4. Приложение. Формулы Руководства пользователя "Модуля опционной аналитики" (версия документа 2.1.0) в формулах используется параметр сигма, однако он не расписан в описании к формулам. Подозреваю, что это параметр - волатильность опциона, но хотелось бы получить чуть больше информации: если берём его из торговой системы QUIK - можно ли его применять в представленных формулах как есть , или надо ещё на что-то поделить/ домножить и т.д.

Аналогично, безрисковая ставка - как она берётся - в % или в долях единицы ?

Благодарю!

С уважением,
Роман.
Обновление Доски опционов из пользовательского Lua-скрипта, Обновление Доски опционов из пользовательского Lua-скрипта
 
Добрый день.

Сейчас в QUIK есть замечательная возможность связать с Доской опционов, например, таблицу Текущие торги: кликаешь в таблице Текущие торги какой-нибудь фьючерс и в Доска опционов обновляется - выводит опционы на соответствующий фьючерс.

Хотелось бы иметь такую возможность в пользовательском Lua-скрипте.

Нельзя ли (в следующей версии qlua.dll) приладить какой-нибудь callback к Доске опционов, типа:


Код
boolean UpdateOptionBoard(sec_code: string)



который при вызове с параметром кода фьючерса обновляет Доску опционов опционами для соответствующего фьючерса ? Возврат: успех / неуспех (ну или код ошибки)

Благодарю заранее.

С уважением,
Роман.
Обновление Доски опционов из пользовательского Lua-скрипта, Обновление Доски опционов из пользовательского Lua-скрипта
 
Добрый день.

Сейчас в QUIK есть замечательная возможность связать с Доской опционов, например, таблицу Текущие торги: кликаешь в таблице Текущие торги какой-нибудь фьючерс и в Доска опционов обновляется - выводит опционы на соответствующий фьючерс.

Хотелось бы иметь такую возможность в пользовательском Lua-скрипте.

Нельзя ли (в следующей версии qlua.dll) приладить какой-нибудь callback к Доске опционов, типа:

Код
boolean UpdateOptionBoard(sec_code: string)

который при вызове с параметром кода фьючерса обновляет Доску опционов опционами для соответствующего фьючерса ? Возврат: успех / неуспех (ну или код ошибки)

Благодарю заранее.

С уважением,
Роман.
Утечка памяти в обработчике SetTableNotificationCallback, Функция обратного вызова обработчика событий пользовательской таблицы не освобождает память между вызовами
 
Добрый день.

Буду признателен за помощь!

На QLUA создаю пользовательскую табличку, на которую при помощи функции SetTableNotificationCallback вешаю обработчик нажатий клавиш. По нажатию ПРОБЕЛ обработчик должен запросить некоторые данные из таблиц QUIK и отобразить их в таблице. Обработчик использует только локальные переменные, которые, по идее, должны быть освобождены после выхода из обработчика, однако, если в окне (Меню Сервисы -> Lua скрипты... -> Окно Доступные скрипты) пронаблюдать динамику объёма памяти, который скрипт занимает, то видно, что при каждом нажатии пробела (т.е. при каждом вызове обработчика) объем занятой памяти только равномерно увеличивается, но никогда не освобождается. Исходник ниже, достаточно его просто Copy/Paste к себе, чтобы воспроизвести проблему.


Код
-- ************************************************
-- *    Обработчик событий для таблицы            *
-- ************************************************

function UpdateTableData(t_id, msg, par1, par2)

   if msg == QTABLE_VKEY and par2 == 32 then -- нажата клавиша "Пробел", 

      local records = {}
      local i = 0

      local option_class_code = "SPBOPT"
      local ba_sec_code = "RIM4"
      local sec_list = getClassSecurities(option_class_code)
      for option_sec_code in string.gmatch(sec_list, "([%.%w]+)") do
         local securityInfo = getSecurityInfo(option_class_code, option_sec_code)
         if securityInfo ~= nil 
         and securityInfo.base_active_seccode == ba_sec_code 
         and 20240501 < securityInfo.exp_date
         then
            local sec_type = getParamEx(option_class_code, option_sec_code, "OPTIONTYPE").param_image
            if sec_type == "Put" then 
               i = i + 1
               local type_execution = getParamEx(option_class_code, option_sec_code, "OPTIONEXECTYPE").param_image
               records[i] = {
                  ba_sec_code = ba_sec_code,
                  option_sec_code = option_sec_code,
                  option_sec_code_full = securityInfo.name,
                  option_class_code = option_class_code,
                  exp_date = securityInfo.exp_date,
                  ba_class = "SPBFUT", 
                  vid_option = "Американский", 
                  type_execution = type_execution,
                  option_strike = securityInfo.option_strike,
                  format = "%." .. securityInfo.scale .. "f",
               }
            end -- sec_type
         end -- if securityInfo
      end -- for option_sec_code

      -- -- Now draw the table
      Clear(Tt_id) 
      for k,v in pairs(records) do
         InsertRow(Tt_id, k)
         SetCell(Tt_id, k, 1, v.ba_sec_code)
         SetCell(Tt_id, k, 2, v.ba_class)
         SetCell(Tt_id, k, 3, v.option_sec_code_full)
         SetCell(Tt_id, k, 4, v.option_sec_code)
         SetCell(Tt_id, k, 5, v.option_class_code)
         SetCell(Tt_id, k, 6, string.sub(v.exp_date , 7,8) .. "." .. string.sub(v.exp_date , 5, 6) .. "." .. string.sub(v.exp_date , 1, 4))
         SetCell(Tt_id, k, 7, v.vid_option)
         SetCell(Tt_id, k, 10, v.type_execution)
         
      end -- for k,v 
      SetSelectedRow(Tt_id, 1) -- установить курсор на запись-чемпиона
   end -- if  msg == QTABLE_CHAR 
end -- UpdateTableData



-- *********************************************
-- *          Обарботчик запуска скрипта       *
-- *********************************************

function OnInit(script_path)

   Tt_id = AllocTable()
   AddColumn(Tt_id, 1, "Б.А.", true, QTABLE_STRING_TYPE, 10)
   AddColumn(Tt_id, 2, "Б.А.Класс", true, QTABLE_STRING_TYPE, 15)
   AddColumn(Tt_id, 3, "Код инструмента (полн.)", true, QTABLE_STRING_TYPE, 25)
   AddColumn(Tt_id, 4, "Код инструмента", true, QTABLE_STRING_TYPE, 15)
   AddColumn(Tt_id, 5, "Код Класса", true, QTABLE_STRING_TYPE, 10)
   AddColumn(Tt_id, 6, "Погашение", true, QTABLE_DATE_TYPE, 10)
   AddColumn(Tt_id, 7, "Вид опциона", true, QTABLE_STRING_TYPE, 15) -- Американский / Европейский
   AddColumn(Tt_id, 8, "Тип опциона", true, QTABLE_STRING_TYPE, 5) -- Call / Put
   AddColumn(Tt_id, 9, "Тип расчёта", true, QTABLE_STRING_TYPE, 15) -- Маржа / Премия
   AddColumn(Tt_id, 10, "Тип исполнения", true, QTABLE_STRING_TYPE, 12) -- Поставка / Расчёт
   AddColumn(Tt_id, 11, "Страйк", true, QTABLE_DOUBLE_TYPE, 12) 
   AddColumn(Tt_id, 12, "Цель", true, QTABLE_DOUBLE_TYPE, 12) 
   AddColumn(Tt_id, 13, "Профит, пт", true, QTABLE_INT_TYPE , 12) 
   AddColumn(Tt_id, 14, "Теор. цена", true, QTABLE_DOUBLE_TYPE, 12) 
   AddColumn(Tt_id, 15, "Доходность", true, QTABLE_DOUBLE_TYPE, 8) 

   CreateWindow(Tt_id)

   SetTableNotificationCallback(Tt_id, UpdateTableData) 

   SetWindowCaption(Tt_id, "test 1.0")
   SetWindowPos(Tt_id, 1, 259, 1500, 655)
   InsertRow(Tt_id, -1) -- Зачем-то просят вставить эту запсиь ...
   
end -- OnInit()



-- *********************************************
-- *          Обарботчик останова скрипта       *
-- *********************************************
function OnStop()
   DestroyTable(Tt_id)
   Tt_id = nil
   IsRun = false
end

-- *********************************************
-- *          Start running program            *
-- *********************************************
IsRun = true

function main()
   while IsRun do sleep(1000) end
end

 

На скрине показан объём занятой памяти в моменте. Для воспроизведения проблемы нужно несколько раз нажать ПРОБЕЛ при нахождении фокуса ввода на таблице и пронаблюдать обведённое красным кружком значение.

Оно увеличивается.

Ожидаемое поведение: последовательное нажатие ПРОБЕЛ и вызов обработчика не приводят к постоянному росту объёма занимаемой памяти.


Буду рад Вашим соображениям как можно решить эту проблему.

С уважением,

Роман.

Как вытащить Тип исполнения опциона (Поставочный/Расчетный) ?, Из какой таблице на Qlua можно вытащить Тип исполнения опциона (Поставочный/Расчетный) ?
 
Добрый день.

Подскажите пожалуйста, пишу на Qlua, как вытащить в коде "Тип исп. опциона" (тип исполнения опциона) - Поставочный или Расчетный ?

Вижу, что в таблице Текущих торгов он есть (см. скриншот, например, опционы на акции), а в хелпах не могу найти это поле ?


Буду благодарен за подсказку.

С уважением,
Роман.
Мерцание строк таблицы Excel при экспорте по DDE, При экспорте таблицы из QUIK в Excel по по DDE мерцают строки
 
Добрый день.

В QUIK на Lua создал табличку с нужными мне данными, десяток строк данных. В Lua-скрипте в главном цикле стоит задержка на 1000 мс., т.е. частота обновления этой таблицы в QUIK - 1 раз в 1000 мс. и это всё работает корректно - данные в моей кастомной таблице QUIK обновляются раз в 1000 мс. (1 сек.)

Теперь я эту табличку выбрасываю по DDE в Excel, данные поступают, строки в Excel начинают по очереди мерцать  - сначала около 1 секунды мерцает самая первая строчка, (как будто в неё идёт очень частое обновление данных), потом приблизительно 1 секунду также мерцает 2-я строчка, потом 3-я и так далее постепенно пока не промерцают все строки, потом этот процесс повторяется заново.

Хочу избавиться от мерцания.


Пробовал поставить в файле info.ini параметр
Код
[excel]
price_timeout=1000

однако это не помогло избавиться от поочередного мерцания строк в Excel

Также , подскажите пожалуйста, надо ли перезапускать QUIK чтобы параметры экспорта , прописанные в разделе [excel] файла info.ini возымели действие на экспорт по DDE или достаточно перезапустить сам экспорт или вообще ничего делать не надо?


Благодарю,
Роман.
Страницы: 1
Наверх