Весьма качественный тест получился, несколько минут и готово. Получил два зависания квика, получил два access violation в запускаемом скрипте. Характерно, что именно в момент запуска все случается, кнопка запустить отлипнуть не успевает, то есть, думаю, в арке понимают, в какое место надо посмотреть. Самому сейчас дампы смотреть нечем, по мере возможности поизучаю.
есть синхронизационная ошибка возникающая в момент остановки скрипта. Мы исправим её в очередном обновлении ПО.
Цитата
Речь идет об аварийной остановке скрипта из-за ошибки, сообщение о которой Вы не получаете по причине зависания терминала.
Думаю, это ошибки вида: раз, два Об устранении самой проблемы, из-за которой возникают ошибки в рабочих скриптах, ни слова.
А тем временем поймал ещё одно зависание, уже в колбеке. Тестовый скрипт для воспроизведения:
Скрытый текст
Код
local run = true
local z = {0, 1}
local table_ssort = table.ssort
function c(func)
table_ssort(z, function()
func()
return true
end)
end
local string_format = string.format
local function f()
string_format('%.1f / %.f', 100 / 1000, 10)
end
function OnQuote(class_code, sec_code)
for i = 1, 50 do
c(f)
end
end
function OnParam(class_code, sec_code)
for i = 1, 50 do
c(f)
end
end
function main()
local class_code = 'QJSIM'
local s = {}
local n = 0
for sec_code in string.gmatch(getClassSecurities(class_code), '([^,]+)') do
if Subscribe_Level_II_Quotes(class_code, sec_code) == true then
n = n + 1
s[n] = sec_code
end
end
while run do
sleep(1)
end
for i = 1, n do
Unsubscribe_Level_II_Quotes(class_code, s[i])
end
end
function OnStop()
run = nil
end
Запустил 4 скрипта. Через несколько часов квик повесился.
Надо делать так, как надо. А как не надо - делать не надо.
У меня из main() вызывается простая функция в которой в цикле while жду появления 2-х флагов. Флаги устанавливаются по событиям из 2-х разных коллбэков, один флаг из одного, другой из другого. Скрипт наглухо виснет если в функции while чисто цикл без задержки. Если поставить в цикл sleep(), то не виснет. По этому поводу даже есть пример в файле "Использование Lua в Рабочем месте QUIK.pdf" от разработчиков квика с подобным циклом while и там написано, что: "Если убрать вызов функции sleep() внутри цикла, то скрипт будет загружать на 100% одно из ядер процессора, что позволит увеличить скорость обработки сценариев внутри цикла, но приведёт к более интенсивному использованию ресурсов компьютера." Дело в том, что у меня срабатывает коллбэк OnTransReply(trans_reply) и он выводит message и это окно с message виснет не отвечает, а скрипт работает в цикле. Так почему виснет, а не грузит проц на сто процентов ядро? Вообще почему должно виснуть или грузить проц на 100% одно ядро если main() работает в отдельном потоке? main() вызывает простые функции и они значит тоже работают в одном потоке с ним. Или не так? какая разница вообще не пойму есть задержка в цикле или нет? Моя функция c циклом: function order_done() while is_run do if is_nul and is_trade then is_nul = false is_trade = false return OrderPrice end end end А вот пример из файла про который пишут разрабы квика из их файла, который находится в каталоге Квик\Doc\Lua\Использование Lua в Рабочем месте QUIK.pdf: is_run = true
function OnStop() is_run = false end
function main() while is_run do sleep(100) end end
Т.е. по поводу поста выше если как говорят разрабы main() работает в отдельном потоке, то вообще ничего виснуть не должно. Хоть есть задержка, хоть нет. На то он и отдельный поток. Зачем разрабы рекомендуют ставить sleep(100)? Что не так с потоком?
Alexander написал: Т.е. по поводу поста выше если как говорят разрабы main() работает в отдельном потоке, то вообще ничего виснуть не должно. Хоть есть задержка, хоть нет. На то он и отдельный поток. Зачем разрабы рекомендуют ставить sleep(100)? Что не так с потоком?
Потоки, о которых пишут разработчики не есть потоки операционной системы в чистом виде. Если не вдаваться в дебри, sleep() нужен обязательно. Поставьте sleep(50) и все станет хорошо, ничего тормозить не будет
s_mike@rambler.ru написал: Потоки, о которых пишут разработчики не есть потоки операционной системы в чистом виде. Если не вдаваться в дебри, sleep() нужен обязательно. Поставьте sleep(50) и все станет хорошо, ничего тормозить не будет
Да я тоже начал склоняться к такому, что потоки квика - это явно не потоки ОС.
Alexander написал: Т.е. по поводу поста выше если как говорят разрабы main() работает в отдельном потоке, то вообще ничего виснуть не должно. Хоть есть задержка, хоть нет. На то он и отдельный поток. Зачем разрабы рекомендуют ставить sleep(100)? Что не так с потоком?
Потоки, о которых пишут разработчики не есть потоки операционной системы в чистом виде. Если не вдаваться в дебри, sleep() нужен обязательно. Поставьте sleep(50) и все станет хорошо, ничего тормозить не будет
Прикольно читать эту чушь. ------------------------- Вообще не использую sleep. -------------------- Поток main КВИКА - это поток OC - Классика!!! ================ Использую события ядра ОС: CreateEvent и ожидание события WaitForSingleObject ------------------------------------- Более того , дополнительно использую пул потоков ------------------- Для синхронизации колбеков, main и потоков пула использую атомарные операции. -------------------------- Все работает просто идеально. ------------------ Я уже выкладывал результаты тестов, в которых у меня создается до 12 потоков в пуле, обрабатывается 200 инструментов и за 4 часа выставляется и снимается 200 тысяч заявок. И все это синхронизируется и работает без единого сообщения об ошибке. =========== Делал и рекурсии в потоках - все работает. ===================== У Вас проблема с отсутствием знаний . Читайте учебники, а не занимайтесь фантазиями а-ля кулибины. ================
разработчики рекомендуют ставить sleep чайникам и буратинам, как самый простой способ исключить практически монопольный захват процессора одним потоком.
По-моему, добрая половина здешних веток посвящена этому идиотизму с потоками, синхронизацией и прочей требухой. А вторая половина идиотизму с динамической типизацией. Вот нафига вам это надо, господа? Продемонстрировать свою крутость? Точнее, свою тупость? Ведь любому дебилу понятно, что задача организации торговли в Квике это ПРИКЛАДНАЯ задача, то есть ПРОСТАЯ задача, и чем меньше вы будете в ней заниматься всякими системными штучками, тем проще, надёжнее и эффективнее она будет работать. Ваш поток - это поток main, так что просто не лезьте без КРАЙНЕЙ необходимости в другие потоки, и будет вам ЩАСТЬЕ. Просто решайте основную задачу, а не корчите из себя вяликих списилистов в программировании.
Ах, "если поставить в цикл sleep(), то не виснет", панимаш! Так поставьте, и забудьте про это дело! Тем более, что sleep там всё равно нужен для эмуляции отсутствующих прерываний по таймеру. У меня стоит sleep(250), и одна эта команда позволяет мне организовать целую кучу таких обработчиков: 0.25-секундного, 0.5-секундного, секундного, 2-секундного, 10-секундного, 0.5-минутного, минутного, 10-минутного... что там у меня... а, ну да - и получасового. И приятным бонусом имеем: нигде никогда ничего не виснет. И мне АБСОЛЮТНО плевать, что там будет, если локальную переменную туда впендюрить или глобальную или ещё что - мне нужен устойчиво и правильно работающий торговый скрипт, а не набор дурацких тестов ни о чём.
Про ловлю микросекунд и загрузку ядер процессора я много раз говорил: это идиотизм. Настолько большой, что даже аргументировать лень. Так что все эти бредни про использование событий ядра ОС, CreateEvent, WaitForSingleObject, пул потоков и прочая ахинея есть Бред Сивой Кобылы. А если "за 4 часа выставляется и снимается 200 тысяч заявок", то это просто смертный приговор алгоритму торговли. Заявки выставляются для того, чтобы они исполнялись, а не снимались! У меня в скрипте более 90%, а в некоторые дни и все 100% заявок именно исполняются, а кому и на кой нужен этот суходроч со снятием заявок - поднимите руки!
Теперь про маразм на тему "общего глобального стека VMLua". Ну какое ваше собачье дело до всего этого, господа? Даже C не позволяет работать со стеком, и когда мне в своё время потребовалось организовать вызов функций с неизвестными на этапе компиляции именами и, соответственно, с неизвестным количеством и типом их аргументов, мне пришлось написать две ассемблерные функции, которые готовили для этого стек соответствующим образом, а вы пытаетесь туда лезть своими потными ручонками из убогого и глючного интерпретатора? Ну, флаг в руки...
Ну и до кучи: closure есть очередной идиотизм, придуманный криворукими бездарями, ничего не понимающими в программировании. А эта долбаная "область видимости" прекрасно иллюстрируется присутствующим в языке goto, кастрированным до неузнаваемости по сравнению с сишным аналогом и почти ни на что не способным.
Занимайтесь торговыми алгоритмами, господа, а не написанием нафиг никому не нужных тестов. И будет вам ЩАСТЬЕ!
nikolz написал: разработчики рекомендуют ставить sleep чайникам и буратинам, как самый простой способ исключить практически монопольный захват процессора одним потоком.
В своё время сталкивался и с потоками на C и всякими там атомарными функциями и прочее. Но это было давно. Сейчас задача простая - написать скрипт и чтобы он не вис. Я просто пытаюсь понять какого хрена если main() это реально отдельный поток в OC, то почему он не виснет если есть sleep() и виснет если его нет? Ну нет sleep() и что? Ну циклится быстро и что? Время выполнения от захода в цикл до повторного захода в него минимально и что? И даже не факт что этот поток будет на 100% грузить одно из ядер процессора. Даже если разрабы API функцией(сейчас даже названий не помню и искать не хочу) вешают main() на отдельное ядро проца и что? OS сама решает какие ещё потоки будут последовательно работать на этом же ядре. И только OS может используя свои привилегии сделать так, что бы какой-то отдельный поток мог один занять ресурсы одного ядра, т.е. чтобы только он один выполнялся на этом ядре а не пользовательский поток QUIK это решает. Так что и без sleep() ничего виснуть не должно по идее и main() должен спокойно работать наравне с другими потоками, которые сочтёт нужным OS. Могу только предположить что есть какие-то прерывания от самого квика, которые во время своего выполнения что-то там делают, не пойми что и мешают main() нормально работать, просто main() по какой-то причине просто не получает управлении из-за того, что-то там у них в прерываниях циклится и не выходит из прерывания.
Владимир написал: Занимайтесь торговыми алгоритмами, господа, а не написанием нафиг никому не нужных тестов. И будет вам ЩАСТЬЕ!
Согласен. Этим и занимаемся. Просто столкнулся с такой ситуацией, которой как бы быть не должно, но она есть. Пытался понять почему такое у них вообще есть. Для себя просто поставил sleep(50) - всё работает. Но понять хотелось логику работы QUIK что они там замутилитакое и почему, что без задержки ну никак.
И вообще квик как-то приторможенно работает. Это интересно у всех так? То вроде шустро, то после переключения окон или ещё чего делаешь действие, например двинуть окно или закрыть окно, а оно тупит-висит, квик думает-думает и только после какой-то задержки срабтывает. Вроде и проц толком не загружет, а тормоза есть. Всё остальное - куча открытых программ всё работает шустро. Память 8 Гб, AMD Athlon X4 860K Quad Core Processor 3.70 GHz. Может настройки какие поменять? У мненя загрузка потоков данных в настройках стоит умным способом по существующим таблицам. Неужели из-за того, что много данных приходится онлайн подтягивать с сервера и обрабатывать? Стояло 10 сек, потом ставил на 1 сек время обновления данных.
Alexander, Был тут такой Антон, очень толковый и сильный программист. К сожалению, давно его не вижу. Насколько я помню, он когда-то рассказывал почему всё так происходит, но меня это мало интересовало, и я пропускал всё это мимо ушей. Покопайтесь в его сообщениях, если интересно.
У меня дохлейший по современным меркам комп, специально для торговли купленный. Два гига ОЗУ, два ядра по два гигагерца, два Квика от двух брокеров, в которых болтается несколько сотен тикеров на обслуживании. Нигде никаких особых тормозов не наблюдал - по крайней мере при нагрузках до тысячи тикеров на Квик. Кстати, насколько я помню, настройки "умным способом" и "по существующим таблицам" - разные вещи: ум есть - таблиц не надо.
Владимир написал: Alexander, Был тут такой Антон, очень толковый и сильный программист. К сожалению, давно его не вижу. Насколько я помню, он когда-то рассказывал почему всё так происходит, но меня это мало интересовало, и я пропускал всё это мимо ушей. Покопайтесь в его сообщениях, если интересно.
У меня дохлейший по современным меркам комп, специально для торговли купленный. Два гига ОЗУ, два ядра по два гигагерца, два Квика от двух брокеров, в которых болтается несколько сотен тикеров на обслуживании. Нигде никаких особых тормозов не наблюдал - по крайней мере при нагрузках до тысячи тикеров на Квик. Кстати, насколько я помню, настройки "умным способом" и "по существующим таблицам" - разные вещи: ум есть - таблиц не надо. ::
Хорошо. Будет время покопаюсь, может найду сообщения этого Антона. По настройка там так - либо умным способом(там он квик сам смотрит по таблицам} либо по выбранным классам(классы сам выбираешь). Вот поэтому и думаю, что может из-за того, что много вкладок открыто (17 шт.) и на каждой вкладке несколько окон(где-то и 11 шт. есть), то поэтому и подтормаживает. Бывает даже так - сначала например окна двигаешь, мышкой нажимаешь - всё нормально работает , потом бывает просто паузу делаешь - не нажимаешь ничего и потом просто например окно двинуть надо или закрыть его, крестик нажимаешь например на окно сообщения, а оно не закрывается сразу, а закрывается через паузу. Иногда сразу закрывается, а иногда через паузу. И при начальной загрузке у меня квик долго загружается. Не засекал время, но минуты точно. Это нормально?
Alexander, Ах, это... это может и тормозить. У меня три вкладки, на каждой таблиц по минимуму - штук 5-6 всего, ни одного графика. Даже скрипт может работать молча, без прорисовки таблиц, в спящем режиме. И таблицы открывает и закрывает сам, ни на какие крестики я не давлю вообще.
А вот при начальной загрузке квик долго загружается - это проблема. Была, потом была подавлена, сейчас опять проявилась у одного из брокеров. И лог засирается со страшной силой - сотни мегов за десятки минут. Чем эта сволочь занимается, мне неведомо.
Фрагмент из моей давней переписки с брокером:
Добрый день. У меня в последнее время появились нарастающие проблемы с Квиком. Проблемы следующие: 1. Загрузка самого Квика происходит неприлично долго (3-4 минуты) причём это время постепенно увеличивается. 2. Сегодня Квик отвис "без объяснения причин" прямо на старте, второй раз - через 15-20 минут работы. Вчера было два аналогичных отвисания - приходилось убивать Квик через диспетчер задач. Иногда Квик вылетал сам, с диагностикой (как я понимаю, от операционки) от "неизвестное программное исключение" до "unknown hard error". Поведение нестабильное: может проработать несколько часов или даже весь день, а может вылететь через несколько минут. В данный момент снова работает - не знаю, надолго ли. 3. Никаких графиков у меня нет - открыты таблицы ТТТ, состояние счёта, таблица заявок и ещё пара-тройка, вроде "позиции по деньгам". Никаких других задач, кроме двух Квиков от двух брокеров, на этом компьютере не запускается - работает только мой скрипт, написанный на чистом Lua и полностью идентичный скрипту, запущенному на другом Квике, который работает без нареканий. 4. Проблемы проявляются всё чаще и уже начинают серьёзно раздражать. Мой сегодняшний звонок в службу техподдержки закончился рекомендацией написать это письмо. Что мне делать?
Общих проблем такого рода не фиксируем. Проверьте пожалуйста наличие фильтров на получаемую информацию, возможно они сбились и сейчас программа запрашивает информацию в разы больше чем вам нужно. Из-за того что большой поток данных закачивается, возможна длительная загрузка программы на следующий день, т.к. она считывает все справочники и логи за прошлый день при запуске. Для проверки фильтров нажмите F9, потом котировки, должно быть так: (приведён скрин).
Да, поток данных у меня довольно большой, контролируется порядка 1000 тикеров. Да, в настройках стоит именно "умным заказом". А вот обезличенные сделки я вообще не использую - может быть, их можно как-то отключить? Ага, у меня там куча галок стоит - всякие там кросс-курсы, опционы, акции, облигации, а у Вас ни одной. Если я правильно понимаю, то "умный заказ" и так обеспечит получение необходимых данных?
Обезличенные сделки подключены всем по умолчанию. Если их не используете в работе , то просто проверьте что у вас в Инструментах вверху справа перед / стоит 0. Да, если включен умный заказ , то наличие или отсутствие галочек в панели ниже ни на что не влияет
Владимир написал: А вот при начальной загрузке квик долго загружается - это проблема. Была, потом была подавлена, сейчас опять проявилась у одного из брокеров. И лог засирается со страшной силой - сотни мегов за десятки минут. Чем эта сволочь занимается, мне неведомо.
Вот, грузится точно так же оооочень долго. Умный способ думаю убирать нет смысла, так как он видимо и так лишнего сам загружать не будет. Его как поставил, так и стоит. Обезличенные сделки оставлено только неторговые поручения. Из-за этого вряд ли будет сильно тормозить. А вот что ещё можно изменить? Может быть можно вручную откорректировать какие-нибудь конфигурационные файлы квика? Как я понимаю квик при загрузке тянет с сервера дофига ненужной информации, например возможно данные для графиков или ещё что. Вот это если убрать, то может и ускорится загрузка?
Alexander, Я не знаю, что там происходит - знаю только, что глюков там дохренища, и от версии к версии это число растёт. С загрузкой-то можно и потерпеть, если достаточно редко отключать скрипт, а работа с ТТТ организована вполне себе терпимо, она реально быстрая, и у меня никогда не было проблем со скоростью, даже при очень большом количестве тикеров. Если, конечно, не пользоваться ни стаканами, ни графиками, ни обезличенными сделками - для торговли ничего из этого не требуется. Вот что иногда вылетает, скотина - это сильно раздражает. Время от времени прилетает nil, в т.ч. там, где его уж никак быть не может. Ставлю проверки на nil в тех местах - обычно помогает. Но, по большому счёту, весь софт надо переписывать с нуля, хотя никто этого не делает и делать не собирается.
Владимир написал: Alexander, Я не знаю, что там происходит - знаю только, что глюков там дохренища, и от версии к версии это число растёт. С загрузкой-то можно и потерпеть, если достаточно редко отключать скрипт, а работа с ТТТ организована вполне себе терпимо, она реально быстрая, и у меня никогда не было проблем со скоростью, даже при очень большом количестве тикеров. Если, конечно, не пользоваться ни стаканами, ни графиками, ни обезличенными сделками - для торговли ничего из этого не требуется. Вот что иногда вылетает, скотина - это сильно раздражает. Время от времени прилетает nil, в т.ч. там, где его уж никак быть не может. Ставлю проверки на nil в тех местах - обычно помогает. Но, по большому счёту, весь софт надо переписывать с нуля, хотя никто этого не делает и делать не собирается.
Ну на меня собственно пока только загрузка долгая давит и тормоза по ходу работы с вкладками и окнами. По самим скриптам пока больших глюков самого квика я не заметил, потому как не так давно начал их писать. А начал я сдуру с QPILE, уж больно хотелось мне видеть разную информацию по опционам в виде отличном от доски опционов, да спреды разные между фьючерсами и базовыми активами в реальном времени с расчётом всяких вариантов купи-продай их и расчётом гарантированной прибыли в процентах годовых. То есть задачи довольно простые. Ах, да ещё надо было скрипт такой чтобы быстро например щёлк мышкой - купил, щёлк - продал, без всяких там окон ввода заявок, чтобы быстро. Вот пришлось по быстрому это накатать на QPILE. Понял, что это такое и что коряво на нём всё, хотя для простых задач пойдёт и это. Но его ограничения в 1 сек на перезапуск скрипта, и даже через какой-то изврат делать замкнутый цикл в отсутствие простого while как-то мне это совсем не в тему. И вот пришлось опять же по быстрому этот Lua познать и переписать скрипты на него. Но по мере написания на этом самом Lua начали появляться свои заморочки, о чём приходится спрашивать опять же на этом форуме. Так что пока в принципе по скорости всё нормально и зависаний как таковых много не было. А простой алгоритм робота у меня и на QPILE нормально и быстро работал. Но раз уж взялся за Lua, то и его переписал, всяких там зависаний тоже пока не замечено.
Alexander, Ну уж что-что, а вывести данные в таблицы, посчитав там всё, что душе угодно, проблем не представляет. Как и "чтобы быстро например щёлк мышкой - купил, щёлк - продал, без всяких там окон ввода заявок, чтобы быстро" - у меня там и цена и объём сделки считается автоматически. Только пользоваться этой возможностью я давным-давно перестал: скрипт торгует лучше меня, и нефиг путаться у него под ногами. А насчёт "всяких там зависаний" - классика: - У вас на стройке несчастные случаи были? - Нет. - Будут!