Работа с метками, ошибки при закрытии/открытии программы Quik.

Страницы: 1
RSS
Работа с метками, ошибки при закрытии/открытии программы Quik., Свои уровни на графике из файла.
 

Предлагаю вашему вниманию скрипт (5.4.1) демонстрирующий эту проблему. Суть скрипта: взять значения уровней из файла и через механизм меток отобразить линии (картинки) на графике. Это упрощенный вариант, для его запуска необходимо внести идентификатор «Slot_A» на график и уровень трех цен в переменные «PRICELINE 1, 2, 3 ».

О самих ошибках, их два вида.

1. Скрипт уничтожает созданные метки двумя путями. Через OnClose(), и по завершению main(). Это прекрасно работает, если руками включать и выключать скрипт через «доступные скрипты». Но если скрипт оставить запущенным, а Квик закрыть через крестик сверху, слева, то уничтожение созданных меток не происходит. Это хорошо видно при следующем запуске Квика. Для этого добавлена пауза 10*1200 на старте, когда Квик не в сети. Квик запускается уже с линиями, а через 12 секунд они моргают, т.е. происходит их перерисовка. Как удалять метки при закрытии программы? Сейчас ощущение, что Луа не закрывается, а просто прихлопывает процесс.

2.Задержки 10*1200, 1200, 700 пришлось еще добавить по причине фантомных ошибок при загрузке самого Квика или Загрузки данных с сервера. Повторить их сложнее. Такой скрипт на 18 меток запущен три раза, а самих графиков 12 штук. Суть в том, что если без задержек в скрипте, запустить Квик, одновременно запускается и Луа машина со скриптом. НО, Квик еще подгружает историю из своего файлового КЭШа на графики, а ему уже getCandles…и возникает ошибка. Необходимо дожидаться с запасом полной загрузки данных. Можно ли отложить запуск Луа машины или как то получить готовность графиков? Аналогично провалы/ошибки могут возникнуть в момент обновления данных с сервера при подключении, особенно если пропустить торги день, два.

Скрипт

 
AndyWise, добрый день!

1. Проблема изучается, постараемся в ближайшее время дать ответ.

2.
Цитата
AndyWise написал:
Можно ли отложить запуск Луа машины или как то получить готовность графиков?
В текущей реализации такой возможности нет. Перед началом работы действительно рекомендуется подождать некоторое время, чтобы терминал прогрузил всю необходимую информацию.
 
Добрый день,

В коде main() скрипта видим такое:

if cndlNum==nil or cndlNum==0 then message(EstrNOINDF); IsRun=false; return; end;

Т.е. сбрасывается флаг продолжения работы. В результате скрипт завершается не дождавшись OnClose. Если для примера закомментировать этот кусок кода, то всё работает корректно.

 
if cndlNum==nil or cndlNum==0 then……
if tCN[0]==nil then…….

Это аварийное завершение скрипта, означающее, что графики еще не прогрузились, а к ним уже идет запрос. Либо проблема с индификатором. В любом случае, об этом будет сообщение, и эта критическая ошибка в 99,99% времени не происходит. Авария - это не много не то.

Проблема в том, что каждый раз, в рабочем режиме!, только при закрытии Квика через крестик не происходит полное выполнение main, либо вызова OnClose.

Я добавил message("111") в конец main. message("222") в конец OnStop. message("333") в конец OnClose.
Если закрываю скрипт через «доступные скрипты», вижу 222 и 111. Если закрываю через крестик – не вижу ничего, процесс просто разрушается!
 
AndyWise, попробуйте вот что поменять:
1)
Код
function OnInit()
   IsRun  = true; --Скрипт запущен!
   IsStopped = false;  --------------------------<
   WrkDir = getScriptPath().."\\";
   PicDir = WrkDir.."Lua_Pict\\";
   ...
end
2)
Код
function main()
   ...
   DelAllLabels(GRAPF_ID);
   IsStopped = true;  ---------------------------<
end
3)
Код
function OnClose()
   IsRun = false;
   sleep(500); -- половина задержки мейна, потом начинаем поллинг
   while not IsStopped do sleep(50) end;
end
Словами: в OnClose сбросить IsRun и не возвращаться из колбека, пока мейн не завершится как обычно. Но не наглухо колбек повесить, иначе мейн будет ждать и зависнем.
 
Не сработало, даже 1500 задержка в OnStop и OnClose(). Ощущение, что они не вызываются при закрытие квика крестиком
 
AndyWise,  OnClose вызывается, скрипт даже файл создать успевает. Вариант засинхронизировать в обе стороны, как здесь, тоже ничего не дает. То есть завершается все точно в правильной последовательности (иначе зависло бы), но метка так и остается (про метку код убрал для простоты).
Код
local run = true
local running = true

function OnStop()
   run = false
   while running do sleep(50) end
   running = true
end

function OnClose()
   local f = io.open(getScriptPath() .. '\\HELLO.txt', 'w')
   f:write('HELLO')
   f:flush()
   f:close()
   run = false
   while running do sleep(50) end
   running = true
   sleep(100)
end

function main()
   while run do
      sleep(100)
   end
   running = false
   while not running do sleep(50) end
end
 
Кто-то из поддержки вроде писал, что удалить метки не получится, так как графика уже нет, то есть при завершении работы терминала вы их не удалите, поэтому удаляйте старые метки при запуске.
 
При запуске и удаляю, но иногда подглючивает.... видимо опять же Луа стартует на перегонки с загрузкой кэша...
 
Цитата
AndyWise написал:
видимо опять же Луа стартует на перегонки с загрузкой кэша
Lua стартует наперегонки с загрузкой окон QUIK (видимо, в т.ч. и графиков).
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:
Цитата
AndyWise написал:
видимо опять же Луа стартует на перегонки с загрузкой кэша
Lua стартует наперегонки с загрузкой окон QUIK (видимо, в т.ч. и графиков).
Попробуйте поставить ожидание времени сервера при старте КВИК.
 
Цитата
nikolz написал:
Цитата
Старатель написал:
 
Цитата
AndyWise  написал:
видимо опять же Луа стартует на перегонки с загрузкой кэша
 Lua стартует наперегонки с загрузкой окон QUIK (видимо, в т.ч. и графиков).
Попробуйте поставить ожидание времени сервера при старте КВИК.
Так уже.., очень редко косячит иногда... Получается задержка нужна на отрисовку по загрузке и по подключению к серверу... С первой еще понятно, а со второй -переподключения на тормозящем сервере бывают...Сколько ждать?
 
При любой установке соединения с сервером необходимо "ждать" момента когда соединение есть и пропущенные данные получены.
Отследить установку соединения - не проблема. А вот подгрузку данных - уже приходится контролировать некие параметры. Для примера разность времени сервера и времени последнего полученного пакета.
Пока пакеты не "догонят время", стоит подождать.

Правда по наблюдениям за процедурой старта терминала видно, что сначала отрисовываются окна, потом устанавливается соединение. Поэтому если скрипт просто подождет установки соединения, то графики, скорее всего, уже есть.
 
Цитата
Nikolay написал:
Пока пакеты не "догонят время", стоит подождать.
Спасибо за идею!
Страницы: 1
Читают тему
Наверх