Скрипт для перезапуска другого скрипта

Страницы: 1
RSS
Скрипт для перезапуска другого скрипта
 
Добрый день. Никогда сам не писал на LUA, но есть скрипт который тащит за собой DLL и который постоянно и неприлично увеличивает размер используемой памяти. Подскажите, можно ли написать скрипт, который бы перезапускал первый скрипт допустим раз в день в определенное время. Буду признателен, если кто-то напишет пример, полагаю что если возможно, то это пара строчек. Спасибо
 
Цитата
Aleb написал:
Добрый день. Никогда сам не писал на LUA, но есть скрипт который тащит за собой DLL и который постоянно и неприлично увеличивает размер используемой памяти. Подскажите, можно ли написать скрипт, который бы перезапускал первый скрипт допустим раз в день в определенное время. Буду признателен, если кто-то напишет пример, полагаю что если возможно, то это пара строчек. Спасибо
Прикольно.
Написать не можете, но заранее знаете , что это пара строчек.  
 
Цитата
nikolz написал:
Написать не можете, но заранее знаете , что это пара строчек.  
Очевидно же:
1. myScript = FindScript("MyScript")
2. RestartScript(myScript)
Всегда так делаю.
 
А зачем перезапускать скрипт?
Чисто теоретически ничего не мешает в скрипте в определенное время занилить используемые переменные после чего запустить сборщик мусора.
 
Цитата
Kalmar написал:
Очевидно же:1. myScript = FindScript("MyScript")2. RestartScript(myScript)Всегда так делаю.
Спасибо большое, я и не сомневался что для тех кто пишет на LUA в quik это будет очевидно. МОжет еще подскажете, как сделать чтобы он срабатывал переодически по времени?
 
Цитата
BlaZed написал:
А зачем перезапускать скрипт?Чисто теоретически ничего не мешает в скрипте в определенное время занилить используемые переменные после чего запустить сборщик мусора
Утекает она собсвенно в dll, сам скрипт просто ее загрузчик
 
Цитата
Спасибо большое, я и не сомневался что для тех кто пишет на LUA в quik это будет очевидно. МОжет еще подскажете, как сделать чтобы он срабатывал переодически по времени?
По всей видимости, это был сарказм. Окружение терминала в рамках qlua не предоставляет методов по доступу к окну доступных скриптов lua.

Вариантов два:
-- Разобраться с утечкой памяти. Это будет единственно правильным решением.\
-- Написать некий proxy-метод в библиотеке, который будет приводить к перезапуску основной логики. И дергать его по таймеру уже из скрипта lua или прямо организовать цикличность в запуска в самой библиотеке.

Правда есть еще вариант: написать скрипт, использующий w32.dll. Найти окно доступных скриптов, виртуально нажать кнопки остановки и запуска. Для примера, как это сделано в автологинах.
 
Nikolay, Есть и четвёртый вариант: написать скрипт на чистом Lua, вообще не пользоваться никакими dll и не перезапускать скрипт никогда. Всегда так делаю. :smile:  
 
Цитата
Владимир написал:
Nikolay, Есть и четвёртый вариант: написать скрипт на чистом Lua, вообще не пользоваться никакими dll и не перезапускать скрипт никогда. Всегда так делаю. ::  
есть много готовых библиотек написанных на СИ и следовательно работающих на порядок быстрее, чем на чистом луа.
Да и сомневаюсь я что-то, что Вы сможете написать на чистом луа, например, torch7,
который написан на основе  библиотек для научных расчетов  на фортране, которые имеют обертки на СИ .
-------------------  
Библиотеки на чистом луа - это для чайников.
 
nikolz, А я не чайник - я профессионал. И как бы я ни матерился на Lua, у меня никогда не возникало ни малейших сомнений, что писать нужно ТОЛЬКО на нём. Проблем с производительностью, как я уже писал, у меня не было никогда - в отличие от регулярно плачущих здесь пользователей таких библиотек. Никакого "torch7" я писать не собираюсь, и даже не собираюсь выяснять, что это вообще такое. А в моей "библиотеке", целиком расположенной в коде моего единственного скрипта и уже много месяцев обеспечивающего возможность полноценной торговли... ща посчитаю... ровно 21 функция.
 
Цитата
Aleb написал:
Подскажите, можно ли написать скрипт, который бы перезапускал первый скрипт допустим раз в день в определенное время.

Тут все умело постебались.
Но ответ прост: возможности такой нет.
Обратитесь к автору dll, пусть устранит проблему с потреблением памяти.
 
Цитата
Kalmar написал:
Очевидно же:1. myScript = FindScript("MyScript")2. RestartScript(myScript)Всегда так делаю.
Интересно, понадобилась такая операция в Qlua, в питоне с этим проблем нет, все отлично перегружается и скрипт как свеже запущенный ))

А вот тут что-то не хочет, может я что не так делаю.

if бла бла
...........................
myScript = FindScript("robot_v8.lua")
Restart_Script (myScript)

дает ошибку    attempt to call a nil value (global 'FindScript')

в чистом луа нашел похожую функцию, но тоже не работает.
 
Цитата
Денис написал:
в
Ликбез:
Вообще-то, скрипт запускается не в QLUA, а в терминале QUIK.
QLUA - это библиотека на CИ для обращения на языке луа к функциям и архиву данных терминала QUIK.
Поэтому нет в библиотеках луа функции запуск скрипта терминала из подобного скрипта
===============
Можно из скрипта терминал квик запускать  еще скрипты в дополнительных потоках, но это не тоже самое и функции в чистом луа для этого нет.
-------------------
 
при запуске скрипта в терминале создается VMLua в ней вызывается  в дополнительном потоке функция main как дочерняя.  
 
Цитата
Денис написал:
дает ошибку    attempt to call a nil value (global 'FindScript')в чистом луа нашел похожую функцию, но тоже не работает.
Было же очевидно, что коллеги стебутся
 
возможно Вы хотите запустить скрипт из файла как дополнительную библиотеку или исполняемый код - это можно стандартной функцией dofile
 
Понятно, стебутся коллеги значит )))

Может быть можно перезапустить как-то функцию main()?
Как выйти из нее это понятно, но есть ли перезапуск?
 
Цитата
Денис написал:
Понятно, стебутся коллеги значит )))

Может быть можно перезапустить как-то функцию main()?
Как выйти из нее это понятно, но есть ли перезапуск?
Поясните подробнее, что и зачем хотите сделать, возможно объясню как это реализовать.
 
Цитата
nikolz написал:
Цитата
Денис написал:
Понятно, стебутся коллеги значит )))

Может быть можно перезапустить как-то функцию 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

Основная часть кода (получение баров с графика,расчеты и прочее )

end
end
 
Цитата
Денис написал:
FUTURES_CLIENT_HOLDING
openbuys - Активные на покупку
opense[[s - Активные на продажу

Эти переменные содержат число, а не логическую переменную
В них либо ноль либо не ноль, а не TRUE и FALSE
--------------------------
Но запускать заново скрипт или main нет надобности в вашем случае.
 
Цитата
nikolz написал:
Цитата
Денис написал:
FUTURES_CLIENT_HOLDING
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
 
Цитата
Денис написал:
Цитата
nikolz написал:
 
Цитата
Денис  написал:
FUTURES_CLIENT_HOLDING
 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
Страницы: 1
Читают тему
Наверх