Зависание QUIK

Страницы: Пред. 1 2
RSS
Зависание QUIK
 
Весьма качественный тест получился, несколько минут и готово. Получил два зависания квика, получил два access violation в запускаемом скрипте. Характерно, что именно в момент запуска все случается, кнопка запустить отлипнуть не успевает, то есть, думаю, в арке понимают, в какое место надо посмотреть. Самому сейчас дампы смотреть нечем, по мере возможности поизучаю.
 
Anton, добрый день!

Просим также прислать дампы на почту нашей поддержки (quiksupport@arqatech.com) для анализа.
 
Roman Azarov,  приветствую. Отправил.
 
Anton, спасибо, файлы получили. Сообщите, пожалуйста, версию Вашего QUIK.
 
Цитата
Evgeniy Karnaukhov написал:
Сообщите, пожалуйста, версию Вашего QUIK.
Версия 8.9.0.107.
 
Anton, спасибо за информацию, ответили Вам по почте.
 
Отправлял три дампа. Ответили:
Цитата
есть синхронизационная ошибка возникающая в момент остановки скрипта. Мы исправим её в очередном обновлении ПО.
Цитата
Речь идет об аварийной остановке скрипта из-за ошибки, сообщение о которой Вы не получаете по причине зависания терминала.
Думаю, это ошибки вида: раз, два
Об устранении самой проблемы, из-за которой возникают ошибки в рабочих скриптах, ни слова.

А тем временем поймал ещё одно зависание, уже в колбеке.
Тестовый скрипт для воспроизведения:
Скрытый текст
Запустил 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) и все станет хорошо, ничего тормозить не будет
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru написал:
Потоки, о которых пишут разработчики не есть потоки операционной системы в чистом виде. Если не вдаваться в дебри, sleep() нужен обязательно. Поставьте sleep(50) и все станет хорошо, ничего тормозить не будет
Да я тоже начал склоняться к такому, что потоки квика - это явно не потоки ОС.
 
Цитата
s_mike@rambler.ru написал:
Цитата
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, Был тут такой Антон, очень толковый и сильный программист. К сожалению, давно его не вижу. Насколько я помню, он когда-то рассказывал почему всё так происходит, но меня это мало интересовало, и я пропускал всё это мимо ушей. Покопайтесь в его сообщениях, если интересно.

У меня дохлейший по современным меркам комп, специально для торговли купленный. Два гига ОЗУ, два ядра по два гигагерца, два Квика от двух брокеров, в которых болтается несколько сотен тикеров на обслуживании. Нигде никаких особых тормозов не наблюдал - по крайней мере при нагрузках до тысячи тикеров на Квик. Кстати, насколько я помню, настройки "умным способом" и "по существующим таблицам" - разные вещи: ум есть - таблиц не надо.   :smile:  
 
Цитата
Владимир написал:
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, Ну уж что-что, а вывести данные в таблицы, посчитав там всё, что душе угодно, проблем не представляет. Как и "чтобы быстро например щёлк мышкой - купил, щёлк - продал, без всяких там окон ввода заявок, чтобы быстро" - у меня там и цена и объём сделки считается автоматически. Только пользоваться этой возможностью я давным-давно перестал: скрипт торгует лучше меня, и нефиг путаться у него под ногами. А насчёт "всяких там зависаний" - классика:
- У вас на стройке несчастные случаи были?
- Нет.
- Будут!
Страницы: Пред. 1 2
Читают тему
Наверх