Тестовый скрипт:
Скрытый текст |
---|
Код |
---|
function OnInit()
is_run = true
path = (getScriptPath() .. "\\")
Arrow_B = (path .. "Arrow_B.bmp") -- Стрелки
Arrow_S = (path .. "Arrow_S.bmp")
iStr = "Rv-1" -- Идентификатор графика.
end
function OnStop()
DelAllLabels(iStr)
is_run = false
return 3000
end
function main()
while is_run do
local cdls = -1
repeat
local cdls0 = cdls
sleep(10)
cdls = getNumCandles(iStr)
until cdls > 0 and cdls == cdls0 -- Ждем, пока загрузятся все свечи.
local tc, nc, leg = getCandlesByIndex (iStr, 0, math.floor(cdls/2), 3)
if leg ~= old_leg and leg ~= "GZU3 [Price]" and leg ~= "" then -- Если на графике сменился инструмент. Один оставляем пустым.
old_leg = leg
LinePrnt("\n \n", leg)
--sleep(500) -- Костыль. Чем больше меток, которые нужно убить, тем больше должна быть задержка.
---[[
if lbl_ID then
for i=1, 700 do
t_Lbl = GetLabelParams(iStr, i) -- После смены инструмента идентификаторы меток тоже изменяются.
if t_Lbl then
last = i
end
end
end
--]]
LinePrnt(cdls, lbl_ID, last)
local image;
local aligt;
DelAllLabels(iStr) -- Если отключить, то quik просто зависает, без "General Protection Fault".
local start = os.clock()
for i=1, 100 do -- Кол-во меток.
local date = string.format("2023%02d%02d", math.random(3, 6), math.random(1, 30)) -- Диапазон месяцев и дней.
local time = string.format("%02d%02d00", math.random(10, 22), math.random(1, 59)) -- Диапазон часов и минут.
local price = tc[1].close + math.random(-100, 100)*tc[1].close/1000 -- Диапазон цен.
--LinePrnt(date, time, price)
local hint = tostring(date.."\n"..time.."\n"..price)
local txt = tostring("Lbl "..i)
if math.floor(i/2) == i/2 then
image = Arrow_B
aligt = "BOTTOM"
else
image = Arrow_S
aligt = "TOP"
end
arr = {
TEXT = "", -- txt
FONT_FACE_NAME = "Arial",
FONT_HEIGHT = 9,
R = 250,
G = 250,
B = 250,
IMAGE_PATH = image, -- Без картинок всё ОК, quik не падает.
TRANSPARENCY = 0,
TRANSPARENT_BACKGROUND = 1,
ALIGNMENT = aligt,
DATE = tonumber(date), -- Работает даже если STRING, зачем DOUBLE - не понятно...
TIME = tonumber(time),
YVALUE = price,
HINT = hint
}
lbl_ID = AddLabel(iStr, arr)
end
LinePrnt(os.clock() - start, lbl_ID)
end
sleep(30)
end
end
-------------------------------------------------------
function LinePrnt(...)
local lin = ""
for i, v in ipairs {...} do
lin = (lin ..(tostring(v)).." ")
end
PrintDbgStr(lin)
end
|
|
По-видимому, если во время восстановления меток после смены инструмента (график подключен к каналу), вызвать DelAllLabels, QUIK не выдерживает такой "шизофрении", и падает с криком "Internal exception happened".
Помогает только задержка, позволяющая QUIK восстановить все метки.
Как поймать момент окончания прорисовки, мне придумать так и не удалось, может быть разработчики что-нибудь подскажут?
Версия терминала - 10, но и на 7-ой всё то же самое.