Винни Пух
Винни Пух личный блог
10 сентября 2020, 15:49

Вопрос алготрейдерам: у вас Квик не зависает при срабатывании OnStop() ?

Столкнулся с такой проблемой буквально на последних паре версий 8.8.1 и 8.8.4

В чем проблема: при остановке скрипта квик стал «уходить в себя» (зависать).
Останавливается скрипт банально через OnStop()

Логика там проще некуда:

IsRun = true

OnInit()
     CreateDataSource()
end

main()
     while IsRun do
         getCandlesByIndex()
         --доп. запрос данных с индикатора
         --и после вычисления
     end
end

OnStop()
     IsRun = false
end

Все. Структура как по учебнику. Все расчеты внутри main. Никаких допов не подключается, все расчеты сугубо арифметические.
Считают каждую минуту при появлении новых данных по свечам.
После остановки скрипта считать нечего. С рояли он зависает?

Причем весь парадокс в том, что подобное происходит только после продолжительной работы скрипты (где-то от часа и более).
Запущенный и выключенный через 10-15 минут не зависает.

Впечатление будто скрипт в момент остановки не понимает куда сбросить накопившиеся за время работы данные, хотя:

Lua uses automatic memory management that uses garbage collection based on certain algorithms that is in-built in Lua. As a result of automatic memory management, as a developer −

  • No need to worry about allocating memory for objects.
  • No need to free them when no longer needed except for setting it to nil.

Вопрос не в силе железа или объеме памяти. 

Подскажите, кто с таким сталкивался?


UPD:
Переписал OnStop() добавив return:

function OnStop()
     IsRun = false
     return 5000
end

Тесты в интервале до 127 минут с прерыванием в разное время проблем не выявило.
Вся структура кода не менялась.
С таким бредом я еще не сталкивался.

Большое спасибо всем неравнодушным.

40 Комментариев
  • 3Qu
    10 сентября 2020, 15:52
    Нет, не зависает. Последние версии ещё не ставил, пока 8.5…
    В ОнСтоп после Фалсе ещё Слип делаю на пару секунд.
    А вообще, по хорошему перед Фалсе надо отписаться от данных.
  • pessimist
    10 сентября 2020, 16:03
    Мне думалось, что Onstop() должен обязательно располагаться до вызова  main()

    А если зависает, то намертво? Или через 5-10 секунд останавливается?
  • Rostislav Kudryashov
    10 сентября 2020, 16:51
    Прежде чем задавать вопросы посторонним людям, которые не видят твой код, надо самому задать вопросы своему коду.
    Принципы экстремального программирования.
    Разработка с нуля по этапам с отладкой каждого этапа.
    Нулевой этап: только OnStop() и main() с минимальным кодом.
    Если на этапе 0 сбоя нет, можно наращивать код на следующих этапах.
  • FinSerfing
    10 сентября 2020, 17:30

    Не зависает.

    Потому что торговые приказы и их коллбэки обрабатываются через trans2quik.dll

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн