1

Тема: Возобновление работы скрипта после восстановления коннекта

Всем доброго времени суток,  подскажите кто знает, возможно ли в QUIKе сделать две вещи:
1. Автоматическое возобновление работы скрипта после разрыва связи с сервером и ее восстановления квиком, а то бывает рвется связь, скрипт останавливается - по той причине что в в этот момент не смог получить какие нибудь данные с сервера, но скрипт то об этом не знает а просто данные которые он запрашивал по причине их неполучения с сервера имеют значение nil, в результате из за этого скрипт отваливается с ошибкой, и после реконнекта квика с сервером он уже сам не запустится, и квик его тоже не собирается запускать, а пихать через строчку if isconnected()==1  then .... тоже не дело, в цикле main() я то такую строчку сделал но вот если команды внутри цикла уже начали выполнятся то обрыв связи и отвал скрипта.
2. Возможно ли приостанавливать скрипт по временным условиям (нерабочие часы и дни биржи) и также возобновлять его работу по этим условиям (наступление времени торговой сессии)

Вообще я такую временную приостановку в цикле main() сделал

    while isConnected()~=1 or нерабочее время do

    sleep (60000)

    end

где нерабочее время - функция путем нехитрых вычислений и системного времени выдающая true или false
но в итоге в нерабочее время весь квик просто зависает с курсором в виде крутящегося кругляшка а на следующий день при наступлении рабочего времени не развисает
функция времени у меня 100% рабочая много раз проверял багов там быть не может

2

Re: Возобновление работы скрипта после восстановления коннекта

Ответ на оба ваши вопроса - нет.
Никакой штатной возможности в квике не предусмотрено.
Проверяйте в скрипте все потенциально проблемные места. Да, занудно, а что делать.
Либо назначайте обработчик ошибок, хотя это тоже не так чтобы гладко. Проверка - вернее.

Про перезапуск скрипта после ошибки - на форуме квика висит пожелание, но пожелания там, как известно, разработчиков не парят.

3 (2020-03-01 01:11:47 отредактировано kalikazandr)

Re: Возобновление работы скрипта после восстановления коннекта

Действительно, арка не удосужилась возвращать из своих функций тот тип данных, который ожидается. Например функция getQuoteLevel2 может вернуть nil, table, string, вместо ожидаемого table.
Что бы не делать лишние проверки на nil, а потом на 0, то вот так:

function calculate(class_code, sec_code)
  local last = tonumber(getParamEx(class_code, sec_code, "last").param_value) or 0
  if last == 0 then return end --last не может быть 0, дальше считать нет смысла
  ...some code...
end
Nordman пишет:

функция времени у меня 100% рабочая много раз проверял багов там быть не может

что-то с трудом верится... может в ней есть циклы, ожидающие чего-то?

4 (2020-03-01 13:45:17 отредактировано toxa)

Re: Возобновление работы скрипта после восстановления коннекта

kalikazandr пишет:

Действительно, арка не удосужилась возвращать из своих функций тот тип данных, который ожидается. Например функция getQuoteLevel2 может вернуть nil, table, string, вместо ожидаемого table.

res = getQuoteLevel2(...)
if type(res) == 'table' then
    ...
end

5

Re: Возобновление работы скрипта после восстановления коннекта

Nordman пишет:

Всем доброго времени суток,  подскажите кто знает, возможно ли в QUIKе сделать две вещи:

на самом деле, обе эти вещи не нужны. по первому пункту - связь может отвалиться в любой момент, во время исполнения любой ветки вашего алгоритма, и повлиять на это никак нельзя. по-этому нужно писать устойчивый код, и не путем проверки соединения пред каждой строкой, а правильно обрабатывая значения, которые возвращают функции квика в разных ситуациях. по второму пункту - на самом деле, нет особого смысла останавливать скрипт. при помощи вашей функции, вычисляющей рабочее время (и я бы добавил проверку статуса инструмента на предмет приостановок) вы можете просто переводить свой скрипт в глобальное состояние "работаем" или "не работаем" взводя какую-то глобальную переменную, при этом вам не нужно задавать такие гигантские sleep'ы. sleep(1) - вполне достаточно, загрузка процессора будет близка к 0.

6

Re: Возобновление работы скрипта после восстановления коннекта

toxa пишет:
res = getQuoteLevel2(...)
if type(res) == 'table' then
    ...
end

Вот-вот, и точно так же проверять, если нет price/quantity в коллекции BID/ASK или они =0.
Т.е. по сути, торговая логика занимает всего 1% кода, остальные 99%, это проверки типов данных возвращаемых функциями qlua.dll

7 (2020-03-01 16:04:39 отредактировано toxa)

Re: Возобновление работы скрипта после восстановления коннекта

kalikazandr пишет:

Т.е. по сути, торговая логика занимает всего 1% кода, остальные 99%, это проверки типов данных возвращаемых функциями qlua.dll

не вижу смысла делать именно так, когда можно переопределить что угодно как угодно. например:

local __gql2 = getQuoteLevel2
getQuoteLevel2 = function(...) 
    local res = __gql2(...)
    if type(res) ~= 'table' then return {} else return res end
end

function main()
    -- somewhere inside your code:
    table.tostring(getQuoteLevel2('TQBR', 'SBER'))
    -- 
end

надо пояснять, как это работает?

ps: можно в res что-то добавлять, типа res.result = true когда ок или res.result = false когда не ок и вообще, ввести любую систему проверки результата.
pps: в этом примере точечки ... важны. в отличие от предыдущего моего примера выше по обсуждению, где точечки обозначали что-то  неопределенное