-- перезапуск скрипта в терминале QUIK
-- Версия: 1.0
R_NAME = "MAIN_SCRIPT_NAME"; -- скрипт работу, которого отслеживает данный вспомогательный робот
local w32 = require("w32");
--local WM_COMMAND = 0x0111 -- константа из windows.h
timeout = 10000; -- таймаут между проходами основного цикла
is_run = true;
function OnInit()
LOG_DATE = DateConvertion(); --getInfoParam("TRADEDATE")
SWCH_FILE= "\\"..R_NAME.."_"..LOG_DATE.."_swch.txt"; -- файл переключатель
LOG_FILE = "\\"..R_NAME.."_"..LOG_DATE.."_swch_log.txt"; -- файл для записи лога событий
-- подготовка тестового лог файла для записи событий удалить после отладки
log = io.open(getScriptPath()..LOG_FILE,"r+");-- Пытается открыть файл в режиме "чтения/записи"
if log == nil then -- Если файл не существует
log = io.open(getScriptPath()..LOG_FILE,"w"); -- Создает файл в режиме "записи"
log:close(); -- Закрывает файл
log = io.open(getScriptPath()..LOG_FILE,"r+");-- Открывает уже существующий файл в режиме "чтения/записи"
end;
log:seek("end",0);
log:write("log file opened "..os.date("%X").."\n"); -- "\n" признак конца строки
--********************** конец подготовки лог файла удалить после отладки
-- подготовка файла переключателя
SWCH_log = io.open(getScriptPath()..SWCH_FILE,"r+");
if SWCH_log == nil then -- Если файл не существует
SWCH_log = io.open(getScriptPath()..SWCH_FILE,"w"); -- Создает файл в режиме "записи"
SWCH_log:close();-- Закрывает файл
SWCH_log = io.open(getScriptPath()..SWCH_FILE,"r+");-- Открывает уже существующий файл в режиме "чтения/записи"
SWCH_log:seek("end",0); --позиционирует курсор на конец файла
SWCH_log:write(os.date("%X")..";OFF".."\n"); -- дописывает состояние по умолчанию
end;
SWCH_log:flush();
SWCH_log:close();
---------------------------------------
T_DP = { -- waiting periods table start-stop
["00:00:01"]="09:55:10", --
["13:59:55"]="14:01:00", -- morning clearing time - с лагом
["18:49:59"]="19:01:00", -- evening clearing time - с лагом
["20:38:00"]="23:59:59", --
};
ServDate=getInfoParam("TRADEDATE"); -- получаем дату сервера в формате дд/мм/гггг
end;
function main()
while is_run do
ServTimeSec = os.time(os.date("*t")); -- конвертируем текущее время сервера из таблицы в секунды
local waiting = false;
for k,v in pairs(T_DP) do -- выключаем работу в период клиринга и периоды вне рабочего времени
if k~=nil then
StartSec = os.time(TimeConvertion(ServDate,tostring(k))); -- конвертируем время начала паузы в секунды
StopSec = os.time(TimeConvertion(ServDate,tostring(v))); -- конвертируем время конца паузы в секунды
if StopSec>ServTimeSec and ServTimeSec> StartSec then
waiting = true;
end;
end;
end;
if not waiting then
local MainScriptOff=false;
-- открывает файл переключатель для чтения
local TP = io.open(getScriptPath()..SWCH_FILE,"r");
local k=0;
for LINE in TP:lines() do
k=k+1; -- счетчик строк
end;
TP:close(); -- Закрывает файл переключатель
local TP = io.open(getScriptPath()..SWCH_FILE,"r");
local i=0;
for LINE in TP:lines() do
i=i+1; -- счетчик строк
local a=0;
if k>1 then
a = k-1;
else
a=k;
end;
if i==a then
-- в последней строке файла переключателя по разделителю определяем наличие данных
local POS = string.find(LINE,";");
if POS ~= nil then
local j = LINE:len();
local i = POS;
local STATE = LINE:sub(i+1,j);
--log:write(STATE.."\n");
if STATE=="OFF" then
MainScriptOff=true;
end;
end;
end;
end;
TP:close(); -- Закрывает файл переключатель
if MainScriptOff then
local hScriptWnd = FindScriptWindow();
local nBtnSlctAll=0;
local nBtnRun=0;
local nBtnStop=0;
local nBtnDel=0;
local hLdScr=0;
if hScriptWnd ~= 0 then
local hChldWnd=0;
for k=0,1 do
hChldWnd = w32.FindWindowEx(hScriptWnd, hChldWnd, "", "");
if hChldWnd~=0 then
local wndt = w32.GetWindowText(hChldWnd,wndt,256);
--log:write(" hChldWnd "..hChldWnd.." hChldWnd text "..tostring(wndt).."\n");
local hSChldWnd=0;
for i=0,1 do
hSChldWnd = w32.FindWindowEx(hChldWnd, hSChldWnd, "", "");
if hSChldWnd~=0 then
local wndt = w32.GetWindowText(hSChldWnd,wndt,256);
--log:write("i"..i.." hSChldWnd "..hSChldWnd.." hSChldWnd text "..tostring(wndt).."\n");
local hS2ChldWnd=0;
for j=0,10 do
hS2ChldWnd = w32.FindWindowEx(hSChldWnd, hS2ChldWnd, "", "");
if hS2ChldWnd~=0 then
local wndt = w32.GetWindowText(hS2ChldWnd,wndt,256);
--log:write("j"..j.." hS2ChldWnd "..hS2ChldWnd.." hS2ChldWnd text "..tostring(wndt).."\n");
if wndt=="Run" or wndt=="Запустить" then
nBtnRun=hS2ChldWnd;
log:write("nBtnRun "..nBtnRun.." nBtnRun text "..tostring(wndt).."\n");
elseif wndt=="Stop" or wndt=="Остановить" then
nBtnStop=hS2ChldWnd;
log:write("nBtnStop "..nBtnStop.." nBtnStop text "..tostring(wndt).."\n");
elseif wndt=="Select all" or wndt=="Выделить все" then
nBtnSlctAll=hS2ChldWnd;
log:write("nBtnSlctAll "..nBtnSlctAll.." nBtnSlctAll text "..tostring(wndt).."\n");
elseif wndt=="Loaded scripts" or wndt=="Загруженные скрипты" then
hLdScr=hS2ChldWnd;
log:write("hLdScr "..hLdScr.." hLdScr text "..tostring(wndt).."\n");
elseif wndt=="Delete" or wndt=="Удалить" then
nBtnDel=hS2ChldWnd;
log:write("nBtnDel "..nBtnDel.." nBtnDel text "..tostring(wndt).."\n");
end;
end;
end;
end;
end;
end;
end;
w32.SetFocus(nBtnSlctAll); -- кнопка выбрать все
w32.PostMessage(nBtnSlctAll, w32.BM_CLICK, 0, 0);
w32.SetFocus(nBtnRun); --кнопка запустить
w32.PostMessage(nBtnRun, w32.BM_CLICK, 0, 0);
--[[ -- нерабочая часть - нужно выбрать конкретный скрипт для запуска
if hLdScr~=0 then
for k=0,10 do
hChldWnd = w32.FindWindowEx(hLdScr, hChldWnd, "", "");
if hChldWnd~=0 then
local wndt = w32.GetWindowText(hChldWnd,wndt,256);
log:write("hLdScr hChldWnd "..hChldWnd.." hChldWnd text "..tostring(wndt).."\n");
end;
end;
end;
]]
--[[ -- функции из автологина
hWnd = w32.FindWindow("InfoClass",""); -- поиск главного окна
-- нажимаем кнопку
w32.PostMessage(hWnd,WM_COMMAND,100,0) -- нажать на кнопку "Установить связь с..."
-- w32.PostMessage(hWnd,WM_COMMAND,101,0) -- нажать на кнопку "Разорвать связь с..."
--w32.SetWindowText(hLogin, QUIK_LOGIN);
--w32.SetWindowText(nPassw, QUIK_PASSW);
]]
end;
--[[ -- для тестов ставим переключатель здесь, в рабочем режиме переключатель в ON ставит основной скрипт при запуске
local TP = io.open(getScriptPath()..SWCH_FILE,"r+");
TP:seek("end",0);
TP:write(os.date("%X")..";ON".."\n");
TP:flush();
TP:close();
]]
end;
end;
sleep(timeout);
end;
log:flush();
log:close();
end;
function OnStop()
timeout = 1;
is_run = false;
end;
function TimeConvertion(CDate, CTime) -- конвертирует текстовый формат даты и времени в таблицу datetime
if CDate == nil or CDate == 0 then -- если при вызове функции дата не указана - то берем текущую
--[[ функция os.date("%x") возвращает дату в формате мм/дд/гг, что не соотвествует
формату getInfoParam('TRADEDATE') дд/мм/гггг, поэтому форматируем вручную
]]
CDate = getInfoParam('TRADEDATE');
if CDate == 0 then
local day = (os.date("%d"));
local month = (os.date("%m"));
local year = (os.date("%Y"));
CDate = day.."/"..month.."/"..year;
end;
end;
if CTime == nil or CTime == 0 then
CTime = getInfoParam('SERVERTIME'); -- если при вызове функции время не указано - то берем текущее
if CTime == 0 then
CTime = os.date("%X");
end;
end;
-- преобразуем дату/время в таблицу вида datetime
local dt = {};
dt.day,dt.month,dt.year,dt.hour,dt.min,dt.sec = string.match(CDate..' '..CTime,"(%d*).(%d*).(%d*) (%d*):(%d*):(%d*)");
for key,VALUE in pairs(dt) do dt[key] = tonumber(VALUE) end;
return dt; -- таблица вида datetime
end;
function DateConvertion() -- форматирует дату в текстовое значение
local day = (os.date("%d"));
local month = (os.date("%m"));
local year = (os.date("%Y"));
ConvertedDate = year..month..day;
return ConvertedDate; -- текстовый формат год-месяц-день без разделителя
end;
function FindScriptWindow()
local hScriptWnd = 0;
local hWnd = w32.FindWindow("InfoClass",""); -- поиск главного окна
local hChldWnd=0
for i=0,100 do
hChldWnd = w32.FindWindowEx(hWnd, hChldWnd, "", ""); -- 1й уровень дочерних окон
local hSChldWnd=0;
for k=0,50 do
hSChldWnd = w32.FindWindowEx(hChldWnd, hSChldWnd, "", ""); -- 2й уровень дочерних окон
local wndt = w32.GetWindowText(hSChldWnd,wndt,256);
if wndt=="Available scripts" or wndt=="Доступные скрипты" then
hScriptWnd=hSChldWnd;
--log:write("hScriptWnd "..hScriptWnd.." hScriptWnd text "..tostring(wndt).."\n");
break; -- прерываем цикл
end;
end;
if hScriptWnd~=0 then break; end;
end;
return hScriptWnd;
end;