Предварительная проверка наличия в базе Quik инструмента (опциона), Subscribe_Level_II_Quotes и getParamEx не существующего опциона приводят к зависанию Quik
nikolz написал: Кроме того, зависание возможно по причине некорректной обработки пустых строк в вашем приложении DDE
так и есть, но с DDE в сервере там всё непросто - не пойми как сделано на базе библиотеки сторонней. Экспорт такой таблицы по DDE просто даёт сбой сервера - сам квик не виснет. Проблема не в этом - хотя было бы логично автоматически исключать из таблиц quik исчезнувшие опционы.
Виснет Квик когда я для обхода этой проблемы - запускаю lua скрипт фильтрующий таблицу для передачи по DDE, ну и плюс всяких полезностей на lua добавил. Работает всё это стабильно днями и сутками без тормозов, но в тот момент когда на сервере quik "дохнут" опционы (около 10 штук сразу обычно), то виснет сам Quik. Возможно какое то сочетание множественности запросов: Subscribe_Level_II_Quotes, getParamEx, getQuoteLevel2и момент обновление базы Quik с сервера - с исчезнувшими опционами.
Предварительная проверка наличия в базе Quik инструмента (опциона), Subscribe_Level_II_Quotes и getParamEx не существующего опциона приводят к зависанию Quik
nikolz написал: Т е читайте любой из указанных параметров и проверяйте его на вшивость.
я это пробовал задолго до того как тут на форуме вопрос задать.
Проверял и на пустую строку и то что в значении число и что оно не nul Но всё равно Quik намертво виснет.
Вероятно он виснет не на этапе getParamEx, а ещё ранее и где именно - абсолютно непонятно. Но происходит это точно в тот момент когда в Quik обновляются данные и появляются сдохнувшие опционы. Памяти скрипт ест - 8-15мб - не более.
Может какой то кэллбэк есть "инструмент исключён из базы" ??
Предварительная проверка наличия в базе Quik инструмента (опциона), Subscribe_Level_II_Quotes и getParamEx не существующего опциона приводят к зависанию Quik
Периодически сервера Quik перестают транслировать данные по некоторым опционам. Выглядит это так как опцион был и все его параметры транслировались, эти опционы постоянно мониторятся lua скриптом - который был запущен в тот момент когда опционы все ещё были живы. В какой то момент некоторые дальние опционы "дохнут" (ещё до истечения по сроку) и исчезают из трансляции серверов Quik как доступные инструменты.
Если эти опционы находятся в таблице торгов то у них в таблице пропадают такие параметры как: Спрос Предл. Цена послед. Волатильность Теор. цена
Вместо нулевых значений начинает отображаться пустое значение.
Если таблицу отредактировать и заново заполнить по фильтру - то эти опционы исчезают.
В итоге по DDE из указанной таблицы начинают транслироваться пустые значения - что приводит к зависанию DDE сервера - до тех пор пока сдохнувшие опционы не будут удалены из таблицы
В lua мониторятся стаканы этих опционов - запускается скрипт и формируется список для мониторинга в тот момент когда опцион ещё жив, но в тот момент когда опционы дохнут - попытка мониторинга приводит к зависанию Quik намертво (даже ошибок lua не показывает)
Подобная конструкция - для предварительной проверки успешности запроса getParamEx через параметр result - не помогает, скрипт всё равно вешает Quik. Какие функции позволят заблаговременно отследить исчезновение инструмента из трансляции сервера Quik ?
Код
function Quotes(code)
local ther_price_hz = getParamEx(class_code, code, "THEORPRICE")
if(ther_price_hz.result == "1") then
local ther_price = tonumber(ther_price_hz.param_value)
-- ....
end
end
Даниил написал: Lua-скрипт - продукт стороннего разработчика, его взаимодействие с ресурсами Рабочего места QUIK может быть неоптимальным, поэтому необходимо остановить выполнение таких скриптов, чтобы подтвердить или опровергнуть их возможное влияние на возникновение описанной ошибки.
каждый lua скрипт работает в изолированной виртуальной среде lua интерпритатора, который в свою очередь работает внутри quik.
В случае ошибки в lua - интерпритатор должен был бы показывать ошибку с номером строки и уж точно это не должно вешать намертво сам quik. В случае зависания самого lua интерпритатора: Quik - обязан показывать ошибку - что зависла среда выполнения.
В данном же случае виснет сам Quik и никаких ошибок не выдаёт.
Что же касается подтвердить\опровергнуть. В который раз повторяю: Этим должны заниматься разработчики Quik, а не люди которые ТОРГУЮТ ВСЁ ВРЕМЯ пока работает биржа !!!
Вы представляете какого размера может быть убыток на срочке? Пока клиент дебагом и разбором глюков занимается - вместо того чтобы следить за рынком ?
Даниил написал: Выполнение сторонних Lua-скриптов может оказывать влияние на работоспособность терминала QUIK, кроме того, могли быть повреждены файлы .log и .dat и файл настроек .wnd,
с lua скриптами всё в порядке, нагрузка на процессор от них небольшая, памяти в сумме едят менее 15 MB.
log dat wnd - чистились уже и заново перенастраивались по минимуму - относительно дефолтных настроек, задолго - до того как была опубликована эта тема.
Цитата
Даниил написал: Исходя из доступной информации, ошибка с описанием AppHangB1 может проявляться в ОС Windows 7 при работе с различными приложениями из-за проблем с драйвером видеоадаптера. Уточните, пожалуйста, проявляется ли данная проблема при работе с другими программами?
Проявляется исключительно с Quik и не постоянно. Ни с каким иным приложением никогда подобной ошибки не видел.
Quik может трое суток без перезапуска работать на 100% стабильно и потом начинаются серийные зависания. 1 - 2 серии зависаний в неделю, (по 3 - 5 зависаний) - в сумме за торговых пять дней. При чём виснет в не самые активные периоды на рынке - обычная торговля без какой либо высокой волатильности и пиковых нагрузок.
Даниил написал: 1. Закрыть программу QUIK, если она при этом открыта. Далее в директории с программой удалить все файлы с расширением «*.log» и «*.dat»
Цитата
Даниил написал: Рекомендуем Вам остановить выполнение указанных Lua-скриптов
Цитата
Даниил написал: По выполнению данных рекомендаций, просим Вас сообщить результат.
Вы издеваетесь ?? Вы бы ещё посоветовали 333 раза компьютер перезагрузить!
Кому тогда вообще нужна такая программа как Quik ? Тем кто решил на добровольной основе заняться не торговлей на бирже, а бесконечным дебагом софта ?
Всем этим заниматься и выкладывать стабильно работающий софт - обязаны разработчики софта, а не клиенты - его использующие!
Проблема явно не в настройках и не в запущенных lua скриптах тк - 90% времени софт стабилен. Настроек относительно дефолтных произведено - самый минимум.
Но в некоторые периоды - когда от серверов quik поступают неизвестно какие данные - клиента Quik начинает глючить, плющить и таращить ... И если по ошибке которую выдаёт win из за зависания quik - нельзя даже предположить что случилось с софтом. То разработчикам явно дебаг этих процессов - абсолютно не интересен!
При чём зависает не постоянно, а некими периодами. То есть может трое суток подряд проработать и ни разу не зависнуть, а потом в течении пары часов раз пять - после каждого повторного запуска. В Quik при этом постоянно запущена пара lua скриптов и выводится одна стандартная таблица во внешнее приложение по DDE.
Описание:
Ошибка привела к остановке взаимодействия программы с Windows.
Сигнатура проблемы:
Имя события проблемы: AppHangB1
Имя приложения: info.exe
Версия приложения: 9.7.1.10
Отметка времени приложения: 62c82dbf
Сигнатура зависания: 7f9c
Тип зависания: 513
Версия ОС: 6.1.7601.2.1.0.256.1
Код языка: 1049
Доп. сигнатура зависания 1: 7f9c358e16d8bea0a345fe7ace628f66
Доп. сигнатура зависания 2: c46f
Доп. сигнатура зависания 3: c46f8629be4eab077f2275e1380c451e
Доп. сигнатура зависания 4: 7f9c
Доп. сигнатура зависания 5: 7f9c358e16d8bea0a345fe7ace628f66
Доп. сигнатура зависания 6: c46f
Доп. сигнатура зависания 7: c46f8629be4eab077f2275e1380c451e
Ознакомьтесь с заявлением о конфиденциальности в Интернете:
http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0419
Если заявление о конфиденциальности в Интернете недоступно, ознакомьтесь с его локальным вариантом:
C:\Windows\system32\ru-RU\erofflps.txt
Описание:
Ошибка привела к остановке взаимодействия программы с Windows.
Сигнатура проблемы:
Имя события проблемы: AppHangB1
Имя приложения: info.exe
Версия приложения: 9.7.1.10
Отметка времени приложения: 62c82dbf
Сигнатура зависания: 819e
Тип зависания: 513
Версия ОС: 6.1.7601.2.1.0.256.1
Код языка: 1049
Доп. сигнатура зависания 1: 819e2ecf4320ec4964c21dcacd147022
Доп. сигнатура зависания 2: 8531
Доп. сигнатура зависания 3: 853129fdc48d6e465a378e89ed35b486
Доп. сигнатура зависания 4: 819e
Доп. сигнатура зависания 5: 819e2ecf4320ec4964c21dcacd147022
Доп. сигнатура зависания 6: 8531
Доп. сигнатура зависания 7: 853129fdc48d6e465a378e89ed35b486
swerg написал: Вы о чем спрашиваете? Хорошо бы уточнять всегда, когда вы применяете термин "таблица" в рамках QLua / QUIK.Иначе, как видно по теме, "всё смешалось", каждый понял своё.
Конечно о таблице визуального интерфейса. И я об этом несколько раз в теме написал, но до кой кого - так и не дошло ))
Цитата
swerg написал: В Lua и в QUIK есть два разных понятия, определяемых одним термином "таблица".
по этому поводу у меня - ни одного цензурного слова нет ...
Nikolay написал: Что-то я не понял про "привыкшего к стройному Си-синтаксису". Lua для сравнения строк использует С функцию strcoll. Ничего не выдумывая
отсортируте массив массивов со СТРОКОВЫМИ ключами в lua - по значению одному из столбцов вложенных массивов. вот может тогда поймёте в чём вывих мозга lua
И повторяю с программерской точки зрения - у меня нет никаких проблем с сортировкой массивов в lua ( не смотря на то что делать это придётся не самым удобным образом)
У меня есть большой массив данных, который выводится в ВИЗУАЛЬНУЮ таблицу и мог бы быть интерактивно и удобно для пользователя отсортирован в этой таблице - вообще без обращения к функциям lua - чисто уже имеющимся функционалом quik
Но разработчики Quik - видимо решили "забить, или положить ..."
nikolz написал: Реализация таблиц (они же массивы, объекты или хеш-таблицы).
не запутывайте людей с C# программерским мозгом. Таблицы - это те окна с табличной информацией, которые видно пользователю и которые он может "пощупать" указателем мыша, отсортировать колонки, настроить фильтр в колонке - для вывода только того что нужно. Ветка - о сортировке с учётом типа данных в столбцах именно в таких таблицах!
А то что касается массивов. Есть объекты и массивы. Массивы могут быть с положительными целочисленными ключами (и тогда у lua проблем нет) или со строковыми ключами (включая отрицательные числа) и тогда в lua у любого программера привыкшего к стройному Си-синтаксису и функционалу - начинаются дебаг-разборки, которые заставляют его матюкаться и проклинать тот момент когда он "сел за баранку этого чёртового lua пылесоса..." ))
И всё таки ... Разработчики Quik как нибудь отреагируют на пожелания клиентов: довести до ума lua таблицы? Для того чтобы на них адекватно работали уже имеющиеся в Quik встроенные функции сортировки и фильтрации - с учётом типа значений в столбце (число, строка, время, дата)
Владимир написал: Boris, Кстати, массивы - это на самом деле файлы, и весьма заметную или даже основную часть времени отжирают именно файловые операции.
O_o
Вы хотите сказать что в Quik lua любая переменная типа массив используемая в скрипте - порождает отдельный файловый дескриптор с потоком чтения/записи данных на диске ?
Владимир написал: Boris, Ну, если со стаканов, то там и будут тормоза. Да и 5000 столбца, но каждая строка - это отдельный тикер. Примерно на 1000-2000 тикеров появляются тормоза, а при 10000-20000 тикерах они становятся раздражающе заметными. Но в астрал ничего не уходит даже в этом случае. Что до сортировки - я почти ежедневно сортирую массивы в миллионы, а иногда даже в миллиарды элементов - вот там могут быть некоторые проблемы, а здесь-то откуда?
массивы то ясное дело - с ними проблем нет... а вот постоянно обновляемые динамические таблицы - с которыми взимодействует человек - с отрисовкой обязательно тормозить интерфейс будет.
Поэтому в идеале - выведение в асинхронный слой вывода и там сортировка уже итоговых данных - без ожидания lua обработки
Владимир написал: Nikolay, А подключать как будете "свою функцию сортировки"? ::
Boris, Подумаешь, "сотни изменений в минуту". Во-первых, это ничтожно мало, во-вторых, тормоза при таких объёмах данных, если и будут, то никак не на сортировке, а на прорисовке. Да и то вряд ли.
таблица - ~5000 строк с 10ю столбцами? заполняется данными со стаканов маркета.
В период высокой волатильности на рынке сборщик заполняющий таблицу - иногда уходит секунд 50 в астрал разгребать свои задачи. А вы предлагаете в том же потоке всё это ещё и сортировать на лету ?? Это очень плохая идея...
Владимир написал: Boris, Да не идёт сортировка даже по string, не говоря уже про остальные типы. Она игнорирует знак, так что будет выдавать примерно такое: Впрочем, что я - вот фрагмент сегодняшнего скрина, сортировка выполнена именно по этому столбцу:
Очевидный ляп разрабов - всем глаза мозолящий и не могут до адекватного состояния до сих пор довести такую мелочь (даже в 9й реинкарнации Quik).
И это при том что нас при создании столбцов таблицы заставляют указывать им тип. Становится только жутковато, от того что вообще непонятно, а зачем вообще в AddColumn указывается тип ?
Nikolay написал: Напишите свою функции сортировки строк. В чем проблема.
в том что таблица очень "живая" - с ней постоянно работает lua сборщик статистики (сотни изменений в минуту) Если её постоянно ещё и пересортировывать - то нагрузка будет дикая - приводящая к тормозам всего интерфейса. Подобные вещи должны делаться - в отдельном слое.
Ну и 1. не умеет по сути lua адекватно работать с ассоциированными массивами со строковыми ключами 2. невозможно назначить тому же столбцу событие - чтобы при клике мышкой на лету происходило переключение направления сортировки и происходила сортировка
Если же захочется применить к таблице фильтр - так даже полей для ввода данных не предусмотрено В общем сплошные неудобства
nikolz написал: а в чем разница число это или дата или string?VMLua сравнивает строки как числа , используя для этого хеш.
нет, сортировка по типу стринг идёт только по байтовому коду символов (по ansi)
разница очень большая
например
В таблице (не сортированной) столбец с числами 2 1 3 11 33
Сортировка по string даст 1 11 2 3 33
Сортировка по типу число должна выдавать 1 2 3 11 33
То что разница есть и она огромна - это очевидно. Но в не зависимости от того какой тип данных прописывается столбцу в lua таблице - сортировка таблиц в столбце идёт только по string.
Не ужели в принципе нельзя использовать на lua таблицах встроенную в quik таблицы сортировку ? Неужели подобная банальность до сих пор не реализована ?
Здравствуйте. Не нашёл в документации как необходимо организовать создание таблицы средствами lua - для того чтобы можно было использовать встроенные в quik функции сортировки и фильтров по столбцу ? Где об этом можно прочитать ?
По ощущениям - всегда учитывается только формат string. Ни дату, время ни числа в созданной lua таблице не отсортировать ?
было - ставил разницы не заметил тк в вызываемых из main функциях организована проверка на уже запущеный процесс те повторно тот же процесс не запускается - до тех пор пока не завершится первый
на ситуацию с зависанием после server:accept() - не влияет
nikolz написал: У вас сервер запускает когда main завершает работу.Т е если main работает то сервер не запускаетсяВы должны его вставить в цикл main
в main есть вызов ServerRun().
Функция вызывается - доходит до строки client = server:accept() и вешает весь остальной код. Сервер при этом работает - по любому запросу моментально отвечает клиенту.
Но проблема что до тех пока клиент не придёт и не запросит данные никакие другие функции lua - включая сборщика статы table.load (var, 1000 ) не исполняются.
Если вы о том что необходимо сделать так
Код
function main ()
while is_run do
table.load (var, 1000 )
end
while is_run do
client = server:accept()
client:settimeout( 2 )
local line, err = client:receive()
local result = evalString(line)
if not err then client:send(result .. "\n") end
client:close()
end
end
Или даже вот так:
Код
function main ()
while is_run do
table.load (var, 1000 )
client = server:accept()
client:settimeout( 2 )
local line, err = client:receive()
local result = evalString(line)
if not err then client:send(result .. "\n") end
client:close()
end
end
То в результате нет абсолютно никакой разницы - как только выполняется строка server:accept() - работает только сервер и ничто другое.
(2) - по логике server:accept() должна ожидать коннекта клиента 2 сек и при не поступлении запроса от клиента завершиться сама собой. Но она этого не делает - продолжает ждать останавливая весь код.
Как правильно сделать ожидание коннекта функцией server:accept() - чтоб она прерывалась при отсутствии подключённого клиента ? Или как в принципе в quik lua запускать асинхронно функции ?Асинхронный запуск функций вообще возможен ?
Есть исправно работающий обработчик стаканов. Хочется прикрутить вывод информации из Quik в сторонние приложения по средством организации передачи данных через socket сервер. Постоянно запускающаяся зацикленная функция вызываемая из main производит обработку и складирование данных в массив. Socket сервер - должен периодически выдавать эту информацию по запросу подключившегося клиента.
Для запуска в Quik сервера используется библиотека luasocket (под lua 5.4.1). Запуск ожидания коннекта ServerRun() - так же запускается из main. При этом после выполнения server:accept() - выполнение какого либо кода прекращается. Прекращается до тех пор пока на сервер не поступит запрос - он не выдаст ответ и только тогда функция table.load(var, 1000) будет запущена повторно. И тоже застопорится до поступления следующего запроса от socket клиента. client:settimeout(2) - должен вроде как прерывать ожидание коннекта и закрывать коннект - что поспособствовало бы продолжению выполнения иного кода, но этого не происходит. Пробовал многое - но ничего не помогло. Где бы в коде не запускалась server:accept() - она останавливает выполнение любых других функций. Как организовать запуск table.load(var, 1000) и ServerRun() - в раздельных потоках - так чтобы выполнение одной функции не останавливалось на период работы другой ? Код для примера (сильно сокращён)
Код
socket = require("socket")
IPAddr = "127.0.0.1" --IP Адрес
IPPort = 3585 --IP Port
client = nil
function main()
while is_run do
table.load(var, 1000)
end
ServerRun()
end
function ServerRun()
while is_run do
client = server:accept()
client:settimeout(2)
local line, err = client:receive()
local result = evalString(line)
if not err then client:send(result.."\n") end
client:close()
end
end
function OnInit(quik_path)
server = assert(socket.bind("127.0.0.1", IPPort))
end
Здравствуйте. Есть необходимость мониторить стаканы ~5тыс. инструментов (опционы). Обрабатывать информацию и выводить результаты из lua на DDE сервер или в csv файл.
1. Подписка на 5тыс. Subscribe_Level_II_Quotes, получение getQuoteLevel2 и потом мониторинг изменения 5тыс. стаканов - это в принципе возможно в quik ?
Не умрёт ли quik при попытке осуществить задуманное - в силу архитектурных ограничений ? Получится ли обрабатывать все 5000 стаканов - хотя бы раз в 5 минут ?
2. И вопрос по выводу данных на DDE сервер. Из lua напрямую вывести данные на DDE сервер судя по документации - нельзя ?
А можно ли создать с помощью lua таблицу quik - которую можно было бы вывести на DDE как стандартные окна quik ?
Daniil Pozdnyakov написал: Данные параметры действительно не добавляются в шаблон, можем зарегистрировать пожелание от Вас, чтобы данные пункты добавлялись в шаблон, регистрируем ?
да, регистрируем.
Цитата
Daniil Pozdnyakov написал: В окне "Работа с шаблонами графиков" (См. скриншот 1), которое появляется если в контекстном меню выбрать пункты "Шаблон диаграммы" (или "Шаблон")->"Сделать шаблоном...", Вы можете выбрать нужный Вам шаблон и нажать кнопку "Брать по умолчанию". После нажатия выбранный шаблон будет браться при создании новых диаграмм и стаканов.
естественно это пробовалось изначально, но после такого применённого шаблона - дополнительный параметр на графике - не отображается. Вот 1й График - из него сохранен шаблон и сделан дефолтным. 2й График - вызванный новый график другого опциона.
Отсутствует график Теоретической цены, хотя в сохранённом шаблоне он должен быть. Не стал помещать их в одно поле - в идеале графики цены и теоретической должны накладываться друг на друга.
Quik 8.12.0.41 и более новые версии. При сохранении шаблона стакана и графика - не сохраняются параметры окна "Поверх всех окон/Закрепить окно" и положение окна на экране. При добавлении на график цены и объёма ещё одного параметра - "Теоретическая цена", они не сохраняются в шаблон. (речь про опционы) При изменении размера окна графика - параметры не сохраняются в шаблон. При применении ранее сохраненного шаблона с перечисленными назначенными параметрами - новые окна по умолчанию создаются с какими то дефолтными настройками.
Когда таких стаканов и графиков необходимо открыть десяток, каждому назначить Поверх всех окон+Уменьшить размер окна+Поместить в нужное место на экране+Закрепить окно, при этом если место где по умолчанию появляются новые стаканы и графики уже занято, то надо выковырять их из под уже закрепленных окон. (и тд и тп) - это превращается в рутину от которой хочется закрыть quik и больше никогда не запускать ...
При создании стратегии в опционном модуле нет возможности выбрать параметры "Фирма" и "Торговый счёт" - в выпадающих списках пусто. Если загрузить шаблон любой стратегии - выпадающие списки этих опций становятся неактивными.
В настройках Quik: Торговля==>Настройка счетов - в выбранных счетах отображается счёт SPBFUTxxxxx.
Что необходимо настроить для того чтобы модуль создания стратегии подключался к счёту и загружал текущие открытые позиции ?
Брокер Банк ВТБ - модуль стратегий шёл вместе с дистрибутивом Quik.