Денис (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Как получить значение Лимита открытых позиций по фьючерсам или как получить элемент из таблицы?
 
Цитата
Игорь М написал:
Цитата
Денис написал:
 
Код
    Мне приходится решать эту задачку так:
Table_  getFuturesLimit     =   {}   -- создается переменная таблица для получения значения, возвращаемого функцией getFuturesLimit  

Table_  getFuturesLimit     =     getFuturesLimit   (  "SPBFUT"  ,  "SPBFUT  *    *    *    *    *   " ,   0  ,  " SUR" )   -- результат работы функции getFuturesLimit помещается в созданную таблицу   


  if   Table_  getFuturesLimit     and   next(Table_  getFuturesLimit  )   then     -- если результат работы функции не nil и не пустая таблица, то можно обратиться к соответствующему полю.  

    FutLimit   =    Table_  getFuturesLimit  .cbplimit   -- получается значение интересующего поля  

  end     -- end if      
 
Прокомментирую: Первая строка не нужна, Table_getFuturesLimit лучше залокалить, а next(Table_getFuturesLimit) заменить на проверку Table_getFuturesLimit.cbplimit. Если таблица пустая, то Table_getFuturesLimit.cbplimit будет nil без ошибки и условие не выполнится, но может быть так: Table_getFuturesLimit.cbplimit = nil, а next(Table_getFuturesLimit) будет true (другие поля существуют) - условие выполнится и вы присвоите переменной FutLimit этот nil.

Здравствуйте, уважаемый Игорь М! Спасибо за Ваши комментарии.
К Вашим комментариям у меня тоже родились комментарии  :wink:

На счет первой строки - согласен. Я ее привел для того, чтобы обозначить желаемый от функции getFuturesLimit результат. На счет локальности - ну это, да - азбука  :lol:  

Цитата
но может быть так: Table_getFuturesLimit.cbplimit = nil, а next(Table_getFuturesLimit) будет true (другие поля существуют) - условие выполнится и вы присвоите переменной FutLimit этот nil.

В этом случае ничего страшного не происходит. Управление остается в скрипте, а контролировать содержимое FutLimit все-равно придется, также как и Table_getFuturesLimit.cbplimit, вопрос в том, что надо как-то на это реагировать. А вариантов реакции может быть несколько, все зависит от того, где FutLimit планируется использовать. То есть, то ли повторно запрашивать лимиты, а если повторно, то сколько раз? Или, отказаться от использования FutLimit, если она -  nil.

Главный момент, который я хотел отметить своим постом, это тот факт, что в функциях QLUA вредно использовать синтаксический сахар Lua для обращения к полям таблицы результатов без дополнительных проверок.
Как получить значение Лимита открытых позиций по фьючерсам или как получить элемент из таблицы?
 
Цитата
Иван Сергеевич написал:
Код
FutLimit =  getFuturesLimit ( "SPBFUT" ,  "SPBFUT*****" ,  0 ,  "SUR" ).cbplimit

При таком подходе к функциям QLUA Вы периодически будете сталкиваться с подобными ошибками.

Смотрите, в описании функции сказано:

Цитата
Функция предназначена для получения информации по фьючерсным лимитам. Функция возвращает таблицу Lua с параметрами Лимиты по фьючерсам. В случае ошибки функция возвращает «nil»

Вообще-то, из опыта, любая функция QLUA может вернуть nil. В этом случае обращение к несуществующему полю таблицы .cbplimit вызовет ошибку "attempt to index a nil value" .

Код
Мне приходится решать эту задачку так:
Table_getFuturesLimit = {} -- создается переменная таблица для получения значения, возвращаемого функцией getFuturesLimit

Table_getFuturesLimit = getFuturesLimit ( "SPBFUT" ,  "SPBFUT*****" ,  0 ,  "SUR" ) -- результат работы функции getFuturesLimit помещается в созданную таблицу 


if Table_getFuturesLimit and next(Table_getFuturesLimit) then -- если результат работы функции не nil и не пустая таблица, то можно обратиться к соответствующему полю.

    FutLimit =  Table_getFuturesLimit.cbplimit -- получается значение интересующего поля

end -- end if
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
 
Цитата
swerg написал:
Тут бы пример.Честно говоря не верится мне, что если OnStop() содержит только{   Stopped = true;   return 5;}то переменные, используемые только в main() внезапно становятся равными nil после этого.Ну а по примеру уже можно было бы и подсказать что там не так.

Пример привести сложно, ибо, он боевой и его долго "чистить" перед выкладкой "на показ". А моделировать ситуацию искусственно - боюсь не сумею.


Дело в том, что код мой разбит на модули, которые, может, подключены некорректно. Хотя, сам принцип брал из кусков Вашего кода на Вашем форуме и QLUA не ругался на меня ни разу.

Код
-- получается адрес рабочей папки
Adress_Work_DIR = getScriptPath()

-- Добавляется к переменной поиска окружения адрес папки скрипта,
-- чтобы интерпретатор знал, где искать модули
package.path = package.path..";"..Adress_Work_DIR.."\\?.lua"

require "stand_mod"
require "init_mod"
require "scan_mod"
require "quik_mod"


В общем, цель поста была не в том, чтобы разобраться почему приведенный пример не работает, а в том, чтобы сделать так, чтобы оно работало.
Меня вовсе не устраивало, когда скрипт завершал свою работу в любом месте, которое я не могу предсказать.

Я сделал логгирование в файл и писал туда после завершения OnStop() системное время с микросекундами.
Без использования return в файл писалось как раз на пять секунд записей. QUIK работал стабильно.

После использования return 5000 тоже несколько запусков писалось на пять секунд записей, но после некоторого времени (минут пять или семь) QUIK умирал напрочь при нажатии любого пункта меню.
Собственно, именно этот эксперимент и побудил меня просить помощи на форуме.

А сообщением "attempt to use a closed file" я лишь хотел подчеркнуть, что управление все-равно возвращается в main(), даже не взирая на return 0 и там что-то успевает происходить.
То есть, как раз удачный случай, чтобы показать, что прерывание скрипта может произойти в любой момент, в том числе уже после анализа условия условного оператора вернуться в его тело и выполнить его уже не зная, что условие изменилось.

Надеюсь, что теперь - все стройно получилось. main() получает сигнал, что OnStop() его "прибьет" скоро и выходит из цикла ожидания, чтобы снять заявки, закрыть файлы, почистить перья и только потом, разрешает OnStop() его "прибить".
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
 
Цитата
:lol: swerg написал:
Открываем файл в main(), а закрываем зачем-то в другом потоке в OnStop().
Здравствуйте, уважаемый swerg !
Прежде всего, низкий Вам поклон за Ваш форум, если бы не он, я бы бросил изучать Lua ровно там же, где и начал. К сожалению, на Вашем форуме рассматриваются более глубокие вопросы и там я не решился спрашивать советов.

Теперь, позволю себе пояснить откуда родился такой "кракозябр". Я столкнулся с проблемой, что прерывание OnStop() прилетает в любом операторе main() и после своего завершения вызывает ошибки в операторах, в которых ошибок быть не должно.

Например, в скрипте получены значения переменных и он должен просто их сложить. Все прекрасно до тех пор, пока не нажата кнопка "Остановить" - тут скрипт вылетает со словами "Не могу сложить а и б, потому что б равно nil.
С какого перепугу, имеющая определенное значение переменная б, вдруг, его теряет после отработки функции OnStop?

Первое, что пришло в голову - это сделать функцию OnStop последней, так как поведение скрипта в main() после ее запуска теряет штатную предсказуемость. Ну, не могу же я каждый оператор "обернуть" if not Stopped then... Да и бесполезно это, есть ведь еще и функции QLUA, там, уж, точно ничего не обернешь.

А раз она (OnStop()) последняя - то она и должна, снять все заявки, закрыть все файлы и сохранить данные, подлежащие хранению.

Но, чтобы я не делал, управление после завершения работы OnStop() все-равно передавалось в main() и он эпизодически вылетал с руганью на nil различных переменных.

Собственно, простое лечение этой беды подсказал уважаемый Anton - достаточно запретить OnStop() завершаться раньше, чем закончится main() и вуаля, проблема решена. Мне, на шестом десятке лет, решившему, вдруг, изучать программирование "себе на дому", да еще с Lua, не зная ни одного диалекта C, конечно, такое простое и изящное решение в голову прийти не могло.


Цитата
swerg написал:
2. Из OnStop() возвращаем 0
Зачем? принуждаем QUIK мгновенно по выходу из OnStop() прибиваь поток main() - чтобы что? чтобы не дать функции потока корректно доработать (хотя доработает она очень быстро в приведенном слуучае), т.к. взводим флаг Stopped
Делаем всё, чтобы насильно прибить потоковую функцию, от нее ожидаемо повисают сопли незакрытых ресурсов, куски незафинализированных вызовов Lua.
А после - удивительно! - оставшаяся часть софта начинает глючить (и я подозреваю, что QUIK эти 5..7 минут не просто сам по себе живет, наверняка выполняются другие Lua-скрипты)

Ну т.е. сделано все, чтобы ожидаемо получить глюки.
Но зачем?? В чем ценность этой демонстрации?
Вот, именно, отсюда и родился return 0, чтобы после завершения OnStop() не было глюков при завершении скрипта main() Мне нужно было, чтобы после завершения функции OnStop() ни один оператор main() не выполнялся, чтобы скрипт не вылетал по ошибке со всеми "грязными" вытекающими последствиями в виде незакрытых файлов и недосохраненных данных.

Но мне и в голову не приходило, что можно "притормозить" OnStop() от завершения, а в это время спокойно и без глюков доработать до оператора end

Цитата
swerg написал:
Ну т.е. сделано все, чтобы ожидаемо получить глюки.
Но зачем?? В чем ценность этой демонстрации?

Это была не демонстрация, а просьба о помощи  :lol:  
Добавление графика по ISIN
 
Цитата
Денис написал:
Но, конкретно - эта бумага снята с торгов по причине дефолта, если что... Так, что в Квике ее не найти, наверное, никак...

Можно данные у ФИНАМа попробовать скачать по ссылке для бумаги ОРГруппБО7
https://www.finam.ru/profile/moex-obligacii/or-bo-07_ru000a0jx8e6-tqir/export/?market=600&em...
Добавление графика по ISIN
 
Цитата
Lexkvint написал:
Цитата
Karina Dmitrieva написал:
Добрый день!  Поиск в окне "Выбор источника данных" при построении графика осуществляется только по наименованию и коду инструмента.

как   узнать код инструмента и  добавить в окно график цены облигации:

международный код (номер)  идентификации ценных бумаг (ISIN) RU000A0JX8E6, регистрационный номер выпуска 4В02-07-16005-Rот 21.03.2016 г. Эмитент облигаций ООО «ОР» ,  OR GROUP (MOEX: ORUP)
Можно в строку поиска на сайте биржи вбить ISIN код бумаги, появится ссылка с полным описанием, где и код и название для Квика есть.
Сайт биржи moex.com, если что... бумага называется Облигация биржевая БО-07 ООО "ОР"

Но, конкретно - эта бумага снята с торгов по причине дефолта, если что... Так, что в Квике ее не найти, наверное, никак...
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
 
Цитата
Владимир написал:
Денис, Кстати, есть ещё одно решение - я даже когда-то хотел его реализовать: вообще отказаться от OnStop, а выход реализовать по собственному обработчику событий (по мышке или по клавише). В этом случае всё прекрасно отработает - и с файлами, и с таблицами. Отказался потому, что когда-нибудь рука всё равно даванёт на кнопку "остановить", и я останусь без результатов торговли последнего запуска. Потом, правда, я всё равно стал сбрасывать дамп каждые 5 минут (по другим причинам - Квик стал вылетать "без объявления войны"), так что можно бы сделать и так, но мне уже лень там что-либо перестраивать.

Решений может быть множество :) Кстати, возник вопрос. Функции обратного вызова перестают работать после окончания работы функции OnStop() или после ее вызова?
Возможно, без return на цикле со sleep(0) удерживая OnStop() от завершения - можно продолжать пользоваться всеми благами цивилизации?
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
 
Цитата
Anton написал:
Владимир, тут речь именно про return 0 из OnStop, что форсирует прибитие мейна. Логически мы все делаем в OnStop, потом из него выходим и оставляем какой-то таймаут, чтобы мейн успел добежать до своего end, т.е. физически он свое "ничего" делает последним, а логически из ничего и выходит ничего.


Anton, если Вы подключены к системе СБП от ЦБ и напишете мне в личку номер Вашего мобильника - готов выслать "на пиво" в честь великого праздника души моей, Вами устроенного!
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
 
В общем, последнее слово я все-таки оставил за OnStop(), но говорить она будет только тогда, когда main() все свои дела закончит.
Итоговый код для "Hello World" получился такой:

Код
Stopped = false

-- для имени файла отладки
File_Name_Log_Debugger = "Log_test_OnStop.txt"

-- для сигнала, что main() готово к завершению
Flag_Svetofor = "Green"

function OnStop()      

   Stopped = true
   while tostring(Flag_Svetofor) == "Red" do 
      sleep(0)
   end

end                  -- конец функции обратного вызова OnStop()

function main()

-- Запрещается функции OnStop() остановка скрипта в теле цикла
   Flag_Svetofor = "Red"

-- Открывается отладочный файл лога
   File_Log_Debugger = io.open(File_Name_Log_Debugger, "w")

   while not Stopped do   
      
      if File_Log_Debugger and tostring(File_Log_Debugger) ~= "file (closed)" then
         File_Log_Debugger:write("Тестовая строка\n")
         File_Log_Debugger:flush()
      end -- end if

      sleep(0)
   end -- end while конец обработки цикла ожидания робота выход по останову   

   File_Log_Debugger:close() -- закрывается файл отладчика      
   
   Flag_Svetofor = "Green"
   
end -- Конец функции main()
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
 
Цитата
Anton написал:
Цитата
Денис написал:
попробую без оператора return
Ага, я не заметил, return 0 надо убрать, выше написал почему, квик видит ноль и прибивает мейн немедленно, хотя тот уже и сам хотел завершиться.

Все, спасибо огромное! Прибил return вообще. Он и не нужен для лечения моего горя, я его как костыль прикручивал. А тут, все вроде, красиво получилось.
Что значит совет знающего человека! Я доволен, как слон. Могу двигаться дальше.
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
 
Цитата
Anton написал:
Денис,  все же в мейне конец чуть иначе предполагался

И туда вставил, и сюда вставил... Но QUIK все-таки умер. Не так сразу, как раньше но умер. Пока, попробую без оператора return

Код
Stopped = false

-- для имени файла отладки
File_Name_Log_Debugger = "Log_test_OnStop.txt"

-- для сигнала, что main() готово к завершению
Flag_Svetofor = "Green"

function OnStop()      

   Stopped = true
   while tostring(Flag_Svetofor) == "Red" do 
      sleep(0)
   end
   File_Log_Debugger:close() -- закрывается файл отладчика   

return 0   
end                  -- конец функции обратного вызова OnStop()

function main()

-- Открывается отладочный файл лога
   File_Log_Debugger = io.open(File_Name_Log_Debugger, "w")

   while not Stopped do   
   
      Flag_Svetofor = "Red"
      
      if File_Log_Debugger and tostring(File_Log_Debugger) ~= "file (closed)" then
         File_Log_Debugger:write("Тестовая строка\n")
         File_Log_Debugger:flush()
      end -- end if

      sleep(1)
   end -- end while конец обработки цикла ожидания робота выход по останову   

   Flag_Svetofor = "Green"
   
end -- Конец функции main()
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
 
Итак, благодаря пользователю Anton (дай бог ему здоровья и хорошего настроения), который дал рецепт, кажется, лекарство мне помогло.

Добавил цикл в функцию обратного вызова OnStop(), который ждет сигнала от main(), что все функции цикла выполнены и процесс готов к завершению.
В начале цикла main() ставит сигнал красного светофора для OnStop(), а в конце цикла ставит сигнал зеленого светофора для функции OnStop()
То есть, если знак светофора - зеленый, то OnStop() может завершиться.

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

Код
Stopped = false

-- для имени файла отладки
File_Name_Log_Debugger = "Log_test_OnStop.txt"

-- для сигнала, что main() готово к завершению
Flag_Svetofor = "Green"

function OnStop()      

   Stopped = true
   while tostring(Flag_Svetofor) == "Red" do 
      sleep(0)
   end
   File_Log_Debugger:close() -- закрывается файл отладчика   

return 0   
end                  -- конец функции обратного вызова OnStop()

function main()

-- Открывается отладочный файл лога
   File_Log_Debugger = io.open(File_Name_Log_Debugger, "w")

   while not Stopped do   
   
      Flag_Svetofor = "Red"
      
      if File_Log_Debugger and tostring(File_Log_Debugger) ~= "file (closed)" then
         File_Log_Debugger:write("Тестовая строка\n")
         File_Log_Debugger:flush()
      end -- end if

      Flag_Svetofor = "Green"
      sleep(1)
   end -- end while конец обработки цикла ожидания робота выход по останову   
   
end -- Конец функции main()
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
 
Цитата
Старатель написал:
Так зависает не во время работы скрипта. Сначала скрипт штатно останавливается, при этом никаких ошибок не выдаёт. Затем скрипт уже перестаёт запускаться. И при попытке вызове какого-нибудь меню квик вешается.

Все верно. Именно, такое горе и происходит. Функции закрытия файлов и выталкивания буфера - это системные функции. Вполне, допускаю, что они греховно остаются частично работать в системе после остановки скрипта.
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
 
Цитата
Старатель написал:
Цитата
Денис написал:
после нажатия кнопки "Остановить" скрипт, вроде бы, штатно останавливается - но затем через пять-семь минут при нажатии на любой пункт меню QUIK намертво зависает.
Проверил - да, так и есть.
Хоть с квиком работаю уже много лет, но на чём квик сейчас застопорился не пойму.

Ну, я подозреваю, что из-за непредсказуемости происходящего - возникает конфликт с открытием-закрытием файла и записью в него буфера данных. Вот, выше по тексту, один грамотный человек, дай бог ему здоровья, рассказал, как можно этот процесс упорядочить, то есть синхронизировать между потоками. Еще не пробовал его лекарство, но рецепт выглядит внушительно.
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
 
Цитата
Anton написал:
Цитата
Денис написал:
прямого ответа на свой вопрос еще не встречал
Словами кратко
1) из OnStop как-то посигнальте мейну, что пора завершаться

Вот, тут, я и поплыл... Как посигналить? Если Stopped = true, то этот самый флаг мониторить в каждом операторе main() ?
То есть, матчасть моя тут слаба и где поправить это бедствие - не знаю пока. Ведь, OnStop() прилетает в неизвестно-случайном месте main()

Цитата
Anton написал:
2) придержите OnStop с помощью цикла со слипом (обязательно со слипом), пока мейн не просигналит в ответ, что он вот-вот завершится

Это понятно. Спасибо. Даже не догадывался до такого приемчика.

Цитата
Anton написал:
3) придержите OnStop еще чуть-чуть тем же способом, чтобы мейн точно уже завершился

То есть еще один цикл со sleep(0)?

Цитата
Anton написал:
4) вуаля, OnStop последний из могикан, мейна уже нет.
Но убедитесь, что мейн не выбросит ошибки, пока OnStop его ждет, иначе как раз и получится описанная ситуация с зависанием всего.

Вот... Вопрос, который мог бы заполнить пробел в моих знаниях.

Правильно ли я понимаю, что в то время, пока в основном потоке OnStop() подвешен на цикле со слипом - операторы main() в дополнительном потоке продолжают выполняться?

Если это верно, тогда и непонимание по ответу 1) снято.

Ну, и это - теперь уже не авансом - большое спасибо и дай бог Вам - здоровья!
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
 
Цитата
Anton написал:
Цитата
Денис написал:
Вставьте в функцию main() оператор while true do end и никакого принудительного завершения не произойдет. QUIK повиснет намертво из-за бесконечного цикла в main()
А вставьте оператор while true do sleep(0) end и принудительное завершение таки произойдет. Чудеса да и только.

Здравствуйте, уважаемый Anton!

Большое спасибо, что уделили время моему горю.
sleep(0) - я плакаль... Утирая слезу пытался понять, как это я догадался написать sleep(1) и не догадался про sleep(0)
Вот если бы авторы этот пассаж в штатную документацию тиснули - было бы просто здорово!

Цитата
Anton написал:
Цитата
Денис написал:
поделится опытом использования в скриптах функции OnStop()
Уже  делился , там дальше по ветке разбросано несколько вопросов-ответов, почему так и зачем так. И в целом можно по форуму поискать всякого разного, как там потоки переключаются и прочая. В частности, вышеименованные чудеса перестанут таковыми быть.

Ваши ответы требуют времени на изучение. Благодарю Вас заранее, авансом значится и отправляюсь изучать Ваш опыт.
Этот форум я периодически читаю, но прямого ответа на свой вопрос еще не встречал и решил его задать, по профессии я не программист и в силу возраста до меня туго доходят иногда очевидные вещи.
Как грамотно сделать функцию OnStop() последней в теле скрипта?, Скудное описание функции обратного вызова OnStop() в официальной документации
 
Хочу, чтобы функция OnStop() прерывала работу скрипта и выполнялась последней после нажатия кнопки "Остановить", но никак не могу этого добиться.
В штатной документации написано, что если добавить оператор return с количеством миллисекунд то это определит "время жизни" функции main() после завершения функции OnStop()

Сказано, что оператору return следует указать число.

"0" - это число? Указываю return 0

Пытаюсь запускать вот такой простенький код:

Код
Stopped = false

-- для имени файла отладки
File_Name_Log_Debugger = "Log_test_OnStop.txt"

function OnStop()      

   Stopped = true   
   File_Log_Debugger:close() -- закрывается файл отладчика   

return 0   
end                  -- конец функции обратного вызова OnStop()

function main()

-- Открывается отладочный файл лога
   File_Log_Debugger = io.open(File_Name_Log_Debugger, "w")

   while not Stopped do   
   
      if File_Log_Debugger and tostring(File_Log_Debugger) ~= "file (closed)" then
         File_Log_Debugger:write("Тестовая строка\n")
         File_Log_Debugger:flush()
      end -- end if

      sleep(1)
   end -- end while конец обработки цикла ожидания робота выход по останову   
   
end -- Конец функции main()

Иногда это работает. Но чаще всего, после нажатия кнопки "Остановить" скрипт, вроде бы, штатно останавливается - но затем через пять-семь минут при нажатии на любой пункт меню QUIK намертво зависает.

Иногда выбрасывает такую ошибку:



То есть, не смотря на указание return 0 - управление все равно возвращается в main() и там чего-то и сколько-то пытается выполняться...

Впрочем, если я пробую в функции OnStop() использовать оператор return с любым допустимым значением - то рано или поздно QUIK все-равно зависает. Без этого оператора "чудес" при остановке одинакового набора скриптов не возникает.

Смена версии Lua с 5.3.5 на 5.4.1 ничего в ситуации не меняет. QUIK от брокера ВТБ версия 9.2.3.15


Буду благодарен, если кто-нибудь поделится опытом использования в скриптах функции OnStop(), который будет чуть шире скудного описания авторов:


Цитата
Функция вызывается терминалом QUIK при остановке скрипта из диалога управления и при закрытии терминала QUIK.

Формат вызова:

[NUMBER time_out] OnStop(NUMBER flag)

Функция возвращает количество миллисекунд, которое дается скрипту на завершение работы. Если функция не возвращает число, то таймаут завершения работы скрипта остается равным 5 секундам.

По истечении интервала времени, данного скрипту на завершение работы, функция main() завершается принудительно. При этом возможна потеря системных ресурсов.
При остановке или удалении работающего скрипта Lua из диалога управления «Доступные скрипты» параметр вызова flag принимает значение «1». При закрытии терминала QUIK – значение «2».

Особенно, вызывает недоумение фраза о принудительном завершении функции main()

Вставьте в функцию main() оператор while true do end и никакого принудительного завершения не произойдет. QUIK повиснет намертво из-за бесконечного цикла в main()
Существующее положение вещей никак нельзя назвать принудительным завершением. Это QUIK принудительно завершается из окна дисптечера задач Windows, вот это действительно принудительное завершение.
Страницы: 1
Наверх