Роман (Все сообщения пользователя)

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

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

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

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

Благодарю!

С уважением,
Роман.
Обновление Доски опционов из пользовательского Lua-скрипта, Обновление Доски опционов из пользовательского Lua-скрипта
 
Перенёс тему в соответствующий форум, посвященные предложениям по развитию 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, Функция обратного вызова обработчика событий пользовательской таблицы не освобождает память между вызовами
 
Nikolay, funduk,

Благодарю вас за ваши советы - они помогли решить проблему!


Nikolay, я переделал скрипт как Вы порекомендовали - сделал обработчик, который только выставляет в глобальной переменной флаг, что была нажата клавиша ПРОБЕЛ:

Код
function TableHandler(t_id, msg, par1, par2)
   if msg == QTABLE_VKEY and par2 == 32 then bUpdate = true end   
end

а в функции main() уже тестирую этот флаг и если он true - соответственно вызываю функцию, которая делает все вычисления:


Код
function main()

   while IsRun do
      
      sleep(Sleep_period)

      if bUpdate then UpdateTableData() end

      bUpdate = false

   end -- while

end -- function main()


И это помогло решить проблему - теперь в окне Доступные скрипты объём занятой памяти не превышает 800Кб, и главное, он не нарастает при последовательных вызовах пересчёта данных.  :smile:

funduk, тоже думал уже про явные вызовы сборщика мусора, но как это не совсем идеологически верно, мне кажется. К счастью, вынос основных вычислений в поток скрипта (main()) благополучно решил проблему. Теперь всё работает так как и ожидалось.

Ещё раз благодарю вас, коллеги, за внимание к вопросу и за помощь!

Хорошего всем дня  :cool: !
Утечка памяти в обработчике SetTableNotificationCallback, Функция обратного вызова обработчика событий пользовательской таблицы не освобождает память между вызовами
 
Nikolay, благодарю Вас за внимание к моему вопросу.

Я понимаю, что запрашиваю значительный объём данных, но ведь он весь сохраняется в локальных переменных колбека, которые по выходу из него должны быть освобождены и вернуты в "кучу", однако почему-то этого не происходит. Автор Lua в своей книге пишет "Finally, a local variable vanishes as soon as its scope ends, allowing the garbage collector to release its value." Так что утечка остаётся загадкой...

Это не первый скрипт у меня, где колбэк на таблице запрашивает данные и что-то вычисляет и в других сценариях такой проблемы нет.

Я не совсем понял Вашу фразу "это лучше не делать в колбеке, а передавать реакцию в поток скрипта". Вы имеете ввиду основную обработку делать в функции main() ? А что и как мне тогда туда передавать ? Не могли бы уточнить эту мысль?

При старте скрипта один раз весь список инструментов тащить не совсем подходит - нужны конкретные инструменты, коды которых скрипт подбирает из файла (я тут убрал эту логику, потому что она не имеет отношения к проблеме). Просто хотел конкретно понять почему происходит memory leak при том, что все переменные локальные и должны бы освобождаться...
Утечка памяти в обработчике 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 можно вытащить Тип исполнения опциона (Поставочный/Расчетный) ?
 
Андрей, благодарю Вас!

Вроде получилось, для самых нетерпеливых читателей сообщаю короткий ответ (например для опциона AL77.5CQ4 по акции АЛОРОСА):

Код
local type_execution = getParamEx("OPTSPOT", "AL77.5CQ4", "OPTIONEXECTYPE").param_image

Но попутно выяснилось ещё много чего интересного - думаю другим читателям форума, особенно новичкам в программировании на QLUA будет крайне полезно узнать!

Возможно для кого-то (как для меня) это окажется откровением, но в документации QLUA описаны НЕ ВСЕ поля таблиц QUIK, которые доступны вам для программирования. Еще более ошеломляющим является то, что поля одной из самых востребованных таблиц ("Текущих торгов") вообще не расписаны в документации QLUA, а расписаны они в Справке самого QUIK (Меню Система->Справка->Раздел 8. Алгоритмический язык QPILE->Функции для получения значений Таблицы текущих торгов -> Значения параметров функций)

Но и там описаны НЕ ВСЕ поля таблицы Текущих торгов! Например, там нигде не описано поле типа исполнения опциона и неизвестно что там не описано ещё, НО ЕСТЬ РЕШЕНИЕ!

Если внимательно (а не так как я в первые пару раз!  :smile:  ) читать документ "Интерпретатор языка Lua", (ссылку на архив с этим документом Андрей любезно предоставил в предыдущем посте, там есть этот документ на русском и на английском языках), то, например, в русской версии на странице 38 есть подраздел "Получение служебных идентификаторов параметров", в котором описано по шагам как из QUIK в Excel экспортировать формальные заголовки любых полей любых таблиц QUIK, используя которые вы можете к ним обращаться из кода на QLUA, В ТОМ ЧИСЛЕ И ТЕ, КОТОРЫЕ ЯВНО НЕ ОПИСАНЫ В ДОКУМЕНТАЦИИ! Именно так и я определил, что поле типа исполнения опциона имеет идентификатор OPTIONEXECTYPE, хотя ни в документации по QLUA, ни в Справке QUIK вы этот идентификатор не отыщите  :smile:

Надеюсь, кому-нибудь эта информация пригодится.

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

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

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


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

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

Благодарю Вас за внимание к моему запросу!

Действительно, обновление рабочих файлов QUIK помогло устранить проблему!

Я поставил версию 11.1.1, 07.02.2024 и теперь по всем опционам центральный страйк подсвечивается так как ожидалось.

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

QUIK 9.7.0.14

в опционах новичок, так понимаю, что центральный страйк - это тот, который ближе всего к текущей цене актива. Если так, то наблюдаю странную картину - по некоторым активам центральный страйк подсвечивается корректно, по некоторым - это максимальный, а по некоторым - минимальный... Скриншоты прикладываю.

SNGT_CLT:



SBER_CLT:



LKOH_CLT:




ОЖИДАЕМОЕ ПОВЕДЕНИЕ:
По всем опционам вне зависимости от БА, Доска опционов в качестве центрального страйка подсвечивает тот. который ближе всего находится к Цене баз.актива (как, SBER_CLT, например)

Что можно сделать ?

Благодарю!
Мерцание строк таблицы Excel при экспорте по DDE, При экспорте таблицы из QUIK в Excel по по DDE мерцают строки
 
Также обратил внимание, что на самом деле экспорт очень какой-то странный: вроде бы числа по значению где-то рядом со значениями в таблице-источнике, но не равны. Можно было бы списать на какую-то задержку, временной лаг, но нет, выдерживая какую-то разумную паузу, я так и не могу дождаться, чтобы наконец данные в Excel в точности совпали с данными в таблице QUIK ! Хотя при этом мерцание строк остаётся, что ввело меня в заблуждение - я то думал, что это так часто идёт обновление данных , но нет, строки мерцают, но данные в Excel не совпадают с QUIK ни в моменте, ни через некоторую паузу. При этом и сказать, что данные СОВСЕМ НЕ ТЕ, нельзя - похоже, что данные бертся те, но с какой-то случайной задержкой что ли. В общем, какое-то в высшей степени странное поведение. При этом на соседней вкладке таблица Текущие Торги корректно шлёт данные в другой файл Excel.

Где можно почитать про параметры , влияющие на процесс экспорта по DDE ?

Благодарю ,
Роман.
Мерцание строк таблицы 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
Наверх