Пожалуйста уточните, как можно понять, что скрипт lua перестал работать или не запустился вместе со стартом квика (например по ошибке) и отправить в результате сообщение?
Хотел написать отдельный скрипт на autoit, но непонятно к чему привязаться, как отслеживать отвалившийся Lua скрипт?
если скрипт запускается автоматом со стартом квика (т.е. один раз скрипт запустил и забыл), то при какой то ошибке (при запуске или в течении работы квика), квик должен вывалить сообщение, что, мол, синтаксическая ошибка в строке такой то скрипта такого то, или (если скрипт уже работает) - обращение к массиву, который nil (ошибка логики). дублируются эти сообщения в том же окне, где список луа скриптов. при выборе нужного скрипта, внизу будет написана последняя ошибка
пока, наверное, единственный вариант - как-то сигнализировать из самого скрипта "я запустился". Вариантов можно придумать разных (создать файл с датой/временем запуска, например, сразу при старте скрипта).
Вообще, на мой взгляд, идея хорошая как пожелание: сделать явную индикацию, что при старте QUIK не запустился какой-то скрипт, который должен был запуститься автоматически при старте.
Валентин написал: квик должен вывалить сообщение, что, мол, синтаксическая ошибка в строке такой то скрипта такого то, или (если скрипт уже работает) - обращение к массиву, который nil (ошибка логики).
дублируются эти сообщения в том же окне, где список луа скриптов. при выборе нужного скрипта, внизу будет написана последняя ошибка
Вот в этом и проблема - не могу привязаться к окну и отследить сообщение об ошибке. Разбор окна "Lua скрипты" неясно как провести - перебирать все строки со скриптами через клики мышью? Не пройдет, квик может быть свернут да и вообще крайне ненадежно.
Думал над вариантом общего окна системных сообщений, например:
1 - Ошибки скриптов валятся в окно "Системные сообщения", скриптом autoit я это окно найду. 2 - Признак сообщений с ошибкой скрипта это "Syntax error while compiling...", и здесь проблема, которую не могу решить - как вытащить эти сообщения для разбора в autoit?
http://quik2dde.ru/viewtopic.php?id=108 в скрипте раз в н-времени выводить контрольную строку. где то сторонней программой их вылавливать. если контрольная строка пропала - значит бобик уже не гавкает
Евгений Петров, если допускается, что сам Quik или .dll плагин в нём могут "упасть", то вариант Валентина на мой взгляд, лучший из возможных. если падения наблюдаются в самом скрипте (ошибки Lua), то можно написать к нему обёртку такого вида, которая будет проксировать все вызовы функций основного скрипта.
Код
local MAIN_SCRIPT = "main_script";
-- в Lua 5.1 не функции table.pack, которая присутствует в Lua 5.2
function table.pack(...)
return { n=select('#', ...); ... }
end
table.unpack = unpack;
package.path = string.format('%s;%s\\?.lua', package.path, getScriptPath());
if not pcall(require, MAIN_SCRIPT) then -- безопасно загружаем main_script.lua (основной скрипт) из папки с этим скриптом
error("Error loading " .. MAIN_SCRIPT .. ".lua");
end
local function create_proxy(func_name)
if (_G[func_name] == nil) then
return;
end
local old = _G[func_name];
_G[func_name] = function(...)
local res = table.pack(pcall(old, ...));
if res[1] then
return table.unpack(res, 2, res.n);
else
-- вызов функции завершился с ошибкой
-- здесь можно выполнить любого рода код, сообщающий об ошибке.
-- Чтобы прикратить выполнение скрипта в этот момент с той же
-- ошибкой, которая произошла в вызываемом коде, достаточно:
error(res[2]);
end
end
end
-- список функций, которые вызывает Quik
local func_list = {
"main",
-- список callback'ов из документации Quik 7.1.1.16
"OnAccountBalance",
"OnAccountPosition",
"OnAllTrade",
"OnCleanUp",
"OnClose",
"OnConnected",
"OnDepoLimit",
"OnDepoLimitDelete",
"OnDisconnected",
"OnFirm",
"OnFuturesClientHolding",
"OnFuturesLimitChange",
"OnFuturesLimitDelete",
"OnInit",
"OnMoneyLimit",
"OnMoneyLimitDelete",
"OnNegDeal",
"OnNegTrade",
"OnOrder",
"OnParam",
"OnQuote",
"OnStop",
"OnStopOrder",
"OnTrade",
"OnTransReply",
};
for _,v in ipairs(func_list) do
create_proxy(v);
end
Пожалуйста уточните, как можно понять, что скрипт lua перестал работать или не запустился вместе со стартом квика (например по ошибке) и отправить в результате сообщение?
Хотел написать отдельный скрипт на autoit, но непонятно к чему привязаться, как отслеживать отвалившийся Lua скрипт?
Коллеги, хотелось бы присоединиться к обсуждению и оживить тему - уже давно раздумываю над ее решением, вызрела собственная идеология и алгоритм.
0) ВВОДНАЯ. При выставлении лимитных ордеров и/или отсутствии стоп приказов контроль за работой скрипта принципиален с точки зрения риск-менеджмента.
1) Оптимальное решение - контроль за работой скрипта с другого устройства - ПК или мобильного телефона, который сигнализировал бы при наличии проблемы. Иначе необходимо будет сидеть за терминалом постоянно, торговлю уже нельзя считать полностью автоматизированной
2) Проблема с работой скрипта отнюдь не ограничивается самим этим скриптом (по моему опыту приблизительно в половине случаев она лежит за его пределами). Иерархия (от частного к общему) типовых проблем такова : - ошибка в работе скрипта - потеря соединения с сервером брокера - ошибка в работе Quik (нехватка памяти, падение программы) - проблемы в работе ПК (падение системы, отключение в результате отключения электричества, отсутствие Интернета) - проблемы у брокера (отсутствие соединения с биржой по каналу брокера -- такой на моей памяти дважды случалось у Альфа-директ) Любая из указанных проблем лишает скрипт работоспособности и чревата потерями, но вот масштаб проблемы и ее решения в каждом случае разнятся ))
2) Отдельное сообщение от скрипта не устраняет большинства рисков, для контроля за работой скрипта он должен отсылать сообщения регулярно. Наличие ошибки должно определяться либо по отсутствию регулярного сигнала (в результате падения ПК или отсутствия Интернета на нем), или же на основе особых состояний сигнала ( / Quik не запущен / торговая сессия идет, связи с сервером нет / скрипт не запущен).
3) Как верно отмечено - контроль должен быть реализован в стороннем по отношению к Quik приложении, которое должно функционировать на базовом и удаленном устройстве.
4) Полностью устранить риски не удастся (проблема у брокера нашими силами не разрешима в принципе, есть риск неработоспособности программы или удаленного устройства, а также канала связи между ними), однако, на один или два порядка риски проблем снизить можно .
Интересно послушать мнения о возможностях технической реализации, в первую очередь протоколах передачи данных и каналах связи. Возможно попытаюсь реализовать задачу своими силами.
Для отслеживания, что скрипт живой/сдох, можно поступить так: 1) скрипт периодически даёт знать, что он жив; 2) имеется внешний наблюдатель, который просигнализирует о том, что скрипт не дал о себе знать в течение некоторого времени.
Варианты реализации пунктов 1 и 2 могут быть разными. Например, скрипт раз в 5 секунд записывает в некоторый файл текущее время, а наблюдатель раз в 10 секунд читает этот файл и, если записанное в файле время отличается от текущего времени более чем на 60 секунд или не удалось прочитать файл 5 раз подряд, то наблюдатель считает, что скрипт умер и сигнализирует куда-нибудь об этом, например по электронной почте. Вместо файлов и электронной почты можно применять сокеты и смс или ещё что-нибудь.
У нас применяется вариант с файлами и электронной почтой. Наблюдатель реализован в виде консольного java-приложения. Туда же до кучи приделано оповещение об ошибках, возникающих в скрипте: дисконнекты терминала и сервера QUIK, непонятные изменения статусов заявок (например, если заявку выставил робот, а сняли руками), невозможность выставить заявку из-за нехватки средств и др. С какими-то ошибками скрипт справляется сам, но уведомляет об этом, а какие-то ошибки требуют уже ручного вмешательства.
Наблюдателя надо делать как можно более надёжным (внешнее приложение по отношению к терминалу или даже на другом устройстве).
Возможно, что надо ещё наблюдать за наблюдателем, а то ошибки повалятся, а мы не в курсе, поскольку наблюдатель сам сдох.
В дополнение на торгующем компьютере стоит UPS, который шлёт по электронной почте предупреждения об отключении и включении электричества.
В целом, такой самодельный комплекс у нас более-менее работает.
_sk_ спасибо за комментарий! Однако, предложенная схема вызывает некоторые вопросы. Не совсем понимаю, как РЕГУЛЯРНАЯ связь реализуется через почту? Это какое же количество сообщений будет генерироваться за торговую сессию? Более удачным кажется вариант постоянной связи терминала с удаленным клиентом - по аналогии с тимвьювером. Кстати, возможно удаленный клиент мог бы поддерживать постоянную работу того же тимвьювера и, в таком случае, он бы был способен еще и обрабатывать некоторые ошибки связанные с работой квик или скрипта, например, прекращение работы скрипта. Упс, естественно установлен, думаю, как и у всех других торговцев. Беда, что не надолго его хватает... Интересно - каким образом реализована отправка сообщений при выключении питания. Специальное ПК-шное приложение? Родное приложение UPS?
П.С. Думаю интегрированное универсальное приложение с устойчиво работающей схемой было бы весьма востребовано в среде (алго)трейдеров.
Если есть критичные ошибки либо падения/запуск скриптов за последние 30 секунд, отправляется письмо со списком этих ошибок и смс на телефон, что есть проблемы и надо читать почту. Обычно такие ошибки возникают блоками (несколько писем с интервалами по 30 секунд между ними) по несколько раз в месяц в среднем.
На всякий случай, два раза в день приходят письма со списком работающих скриптов.
Несколько раз в день приходит письмо с оценками P&L портфеля с начала дня для каждого из скриптов.
Письма про проблемы с электропитанием пишет приложение UPS, которое вместе с этим UPS поставляется. Питания хватает на 20-30 минут. Случаев, когда питания не хватало, бывает пару раз в год.
Иван Ру написал: Не совсем понимаю, как РЕГУЛЯРНАЯ связь реализуется через почту? Это какое же количество сообщений будет генерироваться за торговую сессию?
я тоже уже некоторое время озадачился подбным отслеживанием и пришел к выводу, что можно арендовать на хостинге ресурс vps , развернуть на нем ubuntu и установить туда quik. Тогда с телефона через интернет можно отслеживать полностью работу quik. Приложение на андроид для доступа к панели управления имеется, попробу в выходные настроить идею https://cp.beget.com/vps
наиболее надежно будет если поставить специальное приложение либо настроить службу винды на контроль за состоянием квика. кроме того, не все ошибки библиотеки QLUA перехватываются квиком. Именно эти ошибки и приводят к полному зависанию либо закрытию квика. Если надо решить эту проблему то надо ставить свой перехватчик ошибок (это на СИ с использованием API). ------------------ что же касается синтаксических ошибок то их надо отлаживать не на боевом КВИКЕ а в тестовых режимах и например в трансляторе редактора текстов SCITE.