Добрый день. Никогда сам не писал на LUA, но есть скрипт который тащит за собой DLL и который постоянно и неприлично увеличивает размер используемой памяти. Подскажите, можно ли написать скрипт, который бы перезапускал первый скрипт допустим раз в день в определенное время. Буду признателен, если кто-то напишет пример, полагаю что если возможно, то это пара строчек. Спасибо
Aleb написал: Добрый день. Никогда сам не писал на LUA, но есть скрипт который тащит за собой DLL и который постоянно и неприлично увеличивает размер используемой памяти. Подскажите, можно ли написать скрипт, который бы перезапускал первый скрипт допустим раз в день в определенное время. Буду признателен, если кто-то напишет пример, полагаю что если возможно, то это пара строчек. Спасибо
Прикольно. Написать не можете, но заранее знаете , что это пара строчек.
А зачем перезапускать скрипт? Чисто теоретически ничего не мешает в скрипте в определенное время занилить используемые переменные после чего запустить сборщик мусора.
Kalmar написал: Очевидно же:1. myScript = FindScript("MyScript")2. RestartScript(myScript)Всегда так делаю.
Спасибо большое, я и не сомневался что для тех кто пишет на LUA в quik это будет очевидно. МОжет еще подскажете, как сделать чтобы он срабатывал переодически по времени?
BlaZed написал: А зачем перезапускать скрипт?Чисто теоретически ничего не мешает в скрипте в определенное время занилить используемые переменные после чего запустить сборщик мусора
Утекает она собсвенно в dll, сам скрипт просто ее загрузчик
Спасибо большое, я и не сомневался что для тех кто пишет на LUA в quik это будет очевидно. МОжет еще подскажете, как сделать чтобы он срабатывал переодически по времени?
По всей видимости, это был сарказм. Окружение терминала в рамках qlua не предоставляет методов по доступу к окну доступных скриптов lua.
Вариантов два: -- Разобраться с утечкой памяти. Это будет единственно правильным решением.\ -- Написать некий proxy-метод в библиотеке, который будет приводить к перезапуску основной логики. И дергать его по таймеру уже из скрипта lua или прямо организовать цикличность в запуска в самой библиотеке.
Правда есть еще вариант: написать скрипт, использующий w32.dll. Найти окно доступных скриптов, виртуально нажать кнопки остановки и запуска. Для примера, как это сделано в автологинах.
Nikolay, Есть и четвёртый вариант: написать скрипт на чистом Lua, вообще не пользоваться никакими dll и не перезапускать скрипт никогда. Всегда так делаю.
Владимир написал: Nikolay, Есть и четвёртый вариант: написать скрипт на чистом Lua, вообще не пользоваться никакими dll и не перезапускать скрипт никогда. Всегда так делаю. ::
есть много готовых библиотек написанных на СИ и следовательно работающих на порядок быстрее, чем на чистом луа. Да и сомневаюсь я что-то, что Вы сможете написать на чистом луа, например, torch7, который написан на основе библиотек для научных расчетов на фортране, которые имеют обертки на СИ . ------------------- Библиотеки на чистом луа - это для чайников.
nikolz, А я не чайник - я профессионал. И как бы я ни матерился на Lua, у меня никогда не возникало ни малейших сомнений, что писать нужно ТОЛЬКО на нём. Проблем с производительностью, как я уже писал, у меня не было никогда - в отличие от регулярно плачущих здесь пользователей таких библиотек. Никакого "torch7" я писать не собираюсь, и даже не собираюсь выяснять, что это вообще такое. А в моей "библиотеке", целиком расположенной в коде моего единственного скрипта и уже много месяцев обеспечивающего возможность полноценной торговли... ща посчитаю... ровно 21 функция.
Ликбез: Вообще-то, скрипт запускается не в QLUA, а в терминале QUIK. QLUA - это библиотека на CИ для обращения на языке луа к функциям и архиву данных терминала QUIK. Поэтому нет в библиотеках луа функции запуск скрипта терминала из подобного скрипта =============== Можно из скрипта терминал квик запускать еще скрипты в дополнительных потоках, но это не тоже самое и функции в чистом луа для этого нет. -------------------
Может быть можно перезапустить как-то функцию main()? Как выйти из нее это понятно, но есть ли перезапуск?
Поясните подробнее, что и зачем хотите сделать, возможно объясню как это реализовать.
Если коротко, то первый запуск кода в цикле - все хорошо, но потом, после снятия лимитного ордера, у меня почему-то не сбрасывается переменная openbuys из "FUTURES_CLIENT_HOLDING" , хотя если лимитка на покупку еще не выставлена, то openbuys = False, вроде все хорошо, но после снятия лимитки - openbuys = True все равно. Но я снимаю лимитку без Order_Key, универсальным методом, поиском всех активных и снятием. Вот и думаю где собака зарыта. Cтруктура кода примерно такая :
stopped = false function OnStop() stopped = true return 5000 end ...................................... всякие разные функции ............................ function main() тут при первом запуске снимаем все что можно снять (лимитки, стоп-ордера, закрытие открытых позиций) - работает ...................... while stopped == false do
Основная часть кода (получение баров с графика,расчеты и прочее )
openbuys - Активные на покупку opense[[s - Активные на продажу
Эти переменные содержат число, а не логическую переменную В них либо ноль либо не ноль, а не TRUE и FALSE -------------------------- Но запускать заново скрипт или main нет надобности в вашем случае.
openbuys - Активные на покупку opense[[s - Активные на продажу
Эти переменные содержат число, а не логическую переменную В них либо ноль либо не ноль, а не TRUE и FALSE -------------------------- Но запускать заново скрипт или main нет надобности в вашем случае.
Тут сорян, я не все написал видимо, то что переменные сравниваются с цифрами это так, я просто потом новую ввожу если ~=0 то запоминаю как TRUE, что есть активная лимитка. По поводу возвращаемых данных есть смысл писать в функции Return? или в LUA в коде можно сразу писать например -- If Buy_Active_Limit == true и т.д.?
function check_active_position () for i = 0,getNumberOf("FUTURES_CLIENT_HOLDING") - 1 do if getItem("FUTURES_CLIENT_HOLDING",i).sec_code == instrument then if getItem("FUTURES_CLIENT_HOLDING",i).openbuys ~= 0 then Buy_Active_Limit = true;
openbuys - Активные на покупку opense[[s - Активные на продажу
Эти переменные содержат число, а не логическую переменную В них либо ноль либо не ноль, а не TRUE и FALSE -------------------------- Но запускать заново скрипт или main нет надобности в вашем случае.
Тут сорян, я не все написал видимо, то что переменные сравниваются с цифрами это так, я просто потом новую ввожу если ~=0 то запоминаю как TRUE, что есть активная лимитка. По поводу возвращаемых данных есть смысл писать в функции Return? или в LUA в коде можно сразу писать например -- If Buy_Active_Limit == true и т.д.?
function check_active_position () for i = 0,getNumberOf("FUTURES_CLIENT_HOLDING") - 1 do if getItem("FUTURES_CLIENT_HOLDING",i).sec_code == instrument then if getItem("FUTURES_CLIENT_HOLDING",i).openbuys ~= 0 then Buy_Active_Limit = true;
end; end; end; return Buy_Active_Limit end
Ликбез: луа отличается например от СИ тем, что 0 - это не false, а true. Т е все числа - это true. ---------------------- return надо писать если что-то возвращаете из функции. ---------------- Ваш пример лучше написать так:
Код
function check_active_position ()
for i = 0,getNumberOf("FUTURES_CLIENT_HOLDING") - 1 do
local x=getItem("FUTURES_CLIENT_HOLDING",i);
if x.sec_code == instrument then
if x.openbuys ~= 0 then return x.openbuys; end;
end
rnd
end
В этом варианте два момента. 1) работает быстрее так как у Вас три раза ходите в архив, что существенно дольше чем работа с локальной переменной х 2) если x.oprnbus не равен нулю то функция вернет это значение иначе она вернет nil - а это false