Nikolay (Автор тем)

Выбрать дату в календаре…Выбрать дату в календаре

Страницы: 1
Вопросы про OnParam
 
Т.к. эти вопросы были проигнорированы в соответствующей теме https://forum.quik.ru/messages/forum10/message83015/topic9604/#message83015

Вынесем в отдельную тему:

Почему callback OnParam игнорирует настройки терминала в разделе "Получение данных"?

Берем чистый терминал, открываем только одну таблицу текущих торгов, в ней выбраны конкретные инструменты. Выбрана настройка "умным заказом данных".
Никаких открытых графиков или других таблиц, только одна ТТТ. Нет запущенных скриптов, кроме тестового. В логах теста видим вызов OnParam для инструментов, которых нет в открытой ТТТ, нет открытых позиций, заявок по этим инструментам.
С точки зрения скрипта, где этот OnParam зарегистрирован (а нигде более этот метод и не используется) - это мусор, влияющий на работу всего терминала. Если же разорвать связь и получить OnCleanUp, то колбек будет вызван для всего от начала сессии, т.к. не учитывается фильтр "умного заказа данных".

...............
00002129    11:44:06.628    [1332] OnParam 2128 SPBFUT RAU6 last_price 1246.0    
00002130    11:44:06.629    [1332] OnParam 2129 SPBFUT FLU6 last_price 7975.0    
00002131    11:44:06.629    [1332] OnParam 2130 SPBFUT VBU6 last_price 5871.0    
00002132    11:44:06.629    [1332] OnParam 2131 SPBFUT CRZ6 last_price 12.167    
00002133    11:44:06.629    [1332] OnParam 2132 SPBFUT SiU6 last_price 80734.0    
00002134    11:44:06.629    [1332] OnParam 2133 SPBFUT ALU6 last_price 2220.0    
00002135    11:44:06.629    [1332] OnParam 2134 SPBFUT VKU6 last_price 1544.0    
00002136    11:44:06.629    [1332] OnParam 2135 SPBFUT EDU6 last_price 1.1432    
00002137    11:44:06.630    [1332] OnParam 2136 CROSSRATE CNY last_price 0.0    
00002138    11:44:06.690    [1332] OnParam 2137 CROSSRATE GLD last_price 0.0    
00002139    11:44:06.690    [1332] OnParam 2138 CROSSRATE CNY last_price 0.0    
00002140    11:44:06.750    [1332] OnParam 2139 CROSSRATE CNY last_price 0.0    
00002141    11:44:06.813    [1332] OnParam 2140 CROSSRATE CNY last_price 0.0    
00002142    11:44:06.935    [1332] OnParam 2141 SPBFUT SZU6 last_price 573.0    
00002143    11:44:06.935    [1332] OnParam 2142 SPBFUT RAU6 last_price 1246.0    
00002144    11:44:06.936    [1332] OnParam 2143 SPBFUT PHU6 last_price 5835.0    
00002145    11:44:06.936    [1332] OnParam 2144 SPBFUT VKU6 last_price 1544.0    
00002146    11:44:06.936    [1332] OnParam 2145 SPBFUT MMU6 last_price 2306.3    
00002147    11:44:06.936    [1332] OnParam 2146 SPBFUT GZU6 last_price 9578.0    
00002148    11:44:06.937    [1332] OnParam 2147 SPBFUT MXU6 last_price 230650.0    
00002149    11:44:06.937    [1332] OnParam 2148 SPBFUT RIU6 last_price 90110.0    
00002150    11:44:06.937    [1332] OnParam 2149 SPBFUT BRU6 last_price 88.65    
00002151    11:44:06.937    [1332] OnParam 2150 SPBFUT CKU6 last_price 6502.0    
00002152    11:44:06.937    [1332] OnParam 2151 SPBFUT LKU6 last_price 48859.0    
00002153    11:44:06.937    [1332] OnParam 2152 CROSSRATE GLD last_price 0.0    
00002154    11:44:06.937    [1332] OnParam 2153 CROSSRATE CNY last_price 0.0    
00002155    11:44:06.950    [1332] OnParam 2154 SPBFUT SNU6 last_price 15515.0    
00002156    11:44:06.950    [1332] OnParam 2155 SPBFUT MGU6 last_price 21122.0    
00002157    11:44:06.950    [1332] OnParam 2156 SPBFUT NMU6 last_price 7371.0    
00002158    11:44:06.950    [1332] OnParam 2157 SPBFUT GKU6 last_price 1191.0    
00002159    11:44:06.950    [1332] OnParam 2158 SPBFUT ALU6 last_price 2221.0    
00002160    11:44:06.950    [1332] OnParam 2159 SPBFUT IMOEXF last_price 2269.0    
00002161    11:44:06.950    [1332] OnParam 2160 SPBFUT X5U6 last_price 2115.0    
00002162    11:44:06.951    [1332] OnParam 2161 SPBFUT VBU6 last_price 5871.0    
00002163    11:44:06.951    [1332] OnParam 2162 SPBFUT SPU6 last_price 28329.0    
00002164    11:44:06.951    [1332] OnParam 2163 SPBFUT YDU6 last_price 4053.0    
00002165    11:44:06.951    [1332] OnParam 2164 SPBFUT NVU6 last_price 10553.0    
00002166    11:44:06.951    [1332] OnParam 2165 SPBFUT ONU6 last_price 3219.0    
00002167    11:44:06.951    [1332] OnParam 2166 SPBFUT GAZPF last_price 94.09    
00002168    11:44:06.951    [1332] OnParam 2167 CROSSRATE CNY last_price 0.0    
00002169    11:44:06.951    [1332] OnParam 2168 CROSSRATE CNY last_price 0.0    
00002170    11:44:06.996    [1332] OnParam 2169 CROSSRATE CNY last_price 0.0    
00002171    11:44:06.997    [1332] OnParam 2170 TQOY RU000A10DQB6 last_price 99.567    
00002172    11:44:06.997    [1332] OnParam 2171 TQOB SU26245RMFS9 last_price 85.493    
00002173    11:44:06.998    [1332] OnParam 2172 CROSSRATE CNY last_price 0.0    
00002174    11:44:07.132    [1332] OnParam 2173 TQOB SU26221RMFS0 last_price 70.893    
00002175    11:44:07.144    [1332] OnParam 2174 CROSSRATE CNY last_price 0.0    
00002176    11:44:07.147    [1332] OnParam 2175 CROSSRATE CNY last_price 0.0    
00002177    11:44:07.150    [1332] OnParam 2176 CROSSRATE CNY last_price 0.0    
00002178    11:44:07.153    [1332] OnParam 2177 CROSSRATE CNY last_price 0.0    
00002179    11:44:07.156    [1332] OnParam 2178 CROSSRATE CNY last_price 0.0    
00002180    11:44:07.159    [1332] OnParam 2179 CROSSRATE GLD last_price 0.0    
00002181    11:44:07.162    [1332] OnParam 2180 CROSSRATE CNY last_price 0.0    
00002182    11:44:07.165    [1332] OnParam 2181 CROSSRATE CNY last_price 0.0    
00002183    11:44:07.167    [1332] OnParam 2182 CROSSRATE CNY last_price 0.0    
00002184    11:44:07.170    [1332] OnParam 2183 CROSSRATE CNY last_price 0.0    
00002185    11:44:07.173    [1332] OnParam 2184 CROSSRATE CNY last_price 0.0    
00002186    11:44:07.211    [1332] OnParam 2185 CROSSRATE CNY last_price 0.0    
00002187    11:44:07.211    [1332] OnParam 2186 CROSSRATE CNY last_price 0.0    
00002188    11:44:07.211    [1332] OnParam 2187 CROSSRATE GLD last_price 0.0    
00002189    11:44:07.243    [1332] OnParam 2188 CROSSRATE CNY last_price 0.0    
00002190    11:44:07.244    [1332] OnParam 2189 CROSSRATE CNY last_price 0.0    
00002191    11:44:07.244    [1332] OnParam 2190 SPBFUT GZU6 last_price 9578.0    
00002192    11:44:07.244    [1332] OnParam 2191 SPBFUT X5Z6 last_price 2185.0    
...................

Также вопрос по памяти:
Если в скрипте зарегистрировать OnParam, даже пустой:

function OnParam()
end

то память, отображаемая в окне Доступные скрипты, почти не изменяется. А если же OnParam нет вовсе, то она бегает от начального значения до удвоения, и потом уже срабатывает GC, сбрасывая её. Особенно это заметно на "объёмных" скриптах с большим числом локальных переменных.

Т.е. наличие OnParam вызывает постоянный вызов GC, судя по всему при вызове OnParam. Это, конечно, наверно хорошо не расходовать память, но и агрессивный GC - это влияние на производительность.
...................

Также вопрос про OnCleanUp, который уже задавался:

если не было соединения достаточно долго, то брокер кидает OnCleanUp (это видно по логу и по параметру "число записей" в информационном окне, он скидывается в 0). Судя по всему, срабатывает условие "смена сессии". И в итоге загрузка данных происходит долго, очень долго. Допустим, что разрывы связи - это хоть и неприятно, но ожидаемое событие. Правда частота этого явления тоже вызывает вопросы. Но почему внутри сессии вызывается OnCleanUp?

Вчерашний лог брокера Финам:

[INFO  2026-09-08 10:02:45] :           OnDisconnected
[INFO  2026-09-08 10:03:29] :           OnCleanUp
[INFO  2026-09-08 10:03:30] :           OnConnected
[INFO  2026-09-08 10:04:57] :           OnDisconnected
[INFO  2026-09-08 10:05:07] :           OnCleanUp
[INFO  2026-09-08 10:05:08] :           OnConnected
[INFO  2026-09-08 10:20:07] :           OnDisconnected
[INFO  2026-09-08 10:20:17] :           OnCleanUp
[INFO  2026-09-08 10:20:19] :           OnConnected
[INFO  2026-09-08 10:31:12] :           OnDisconnected
[INFO  2026-09-08 10:31:24] :           OnCleanUp
[INFO  2026-09-08 10:31:28] :           OnConnected
[INFO  2026-09-08 11:15:36] :           OnDisconnected
[INFO  2026-09-08 11:15:41] :           OnConnected
[INFO  2026-09-08 11:20:20] :           OnDisconnected
[INFO  2026-09-08 11:20:36] :           OnCleanUp
[INFO  2026-09-08 11:20:38] :           OnConnected
[INFO  2026-09-08 12:24:08] :           OnDisconnected
[INFO  2026-09-08 12:24:23] :           OnCleanUp
[INFO  2026-09-08 12:24:29] :           OnConnected
[INFO  2026-09-08 12:54:37] :           OnDisconnected
[INFO  2026-09-08 12:54:51] :           OnCleanUp
[INFO  2026-09-08 12:54:53] :           OnConnected
[INFO  2026-09-08 12:56:35] :           OnDisconnected
[INFO  2026-09-08 12:56:39] :           OnConnected
[INFO  2026-09-08 13:43:17] :           OnDisconnected
[INFO  2026-09-08 13:43:22] :           OnConnected
[INFO  2026-09-08 13:47:37] :           OnDisconnected
[INFO  2026-09-08 13:47:49] :           OnCleanUp
[INFO  2026-09-08 13:47:51] :           OnConnected
Очередь сетевых сообщений
 
Есть такой параметр в информационном окне. И он, на самом деле, полезен, т.к. после разрыва связи или запуска терминала позволяет косвенно увидеть, что идёт загрузка отставших сообщений.

Но его нет в описании к методу getInfoParam. Как его получить?
Работа колбеков
 
Просто наблюдение. Пока не могу подтвердить реальным тестом.

В последних версиях терминала, по ощущениям начиная с 12-ой, наличие колбека в скрипте стало ощутимо "тормозить" терминал.
Естественно и раннее колбек использовался только для передачи в очередь. Но теперь даже это приводит к периодическим замираниям терминала.
Особенно если у скрипта есть и окно со своим колбеком на обновление.

Наблюдаю у разных брокеров. Есть те, у кого это, можно сказать, постоянно. А есть те, у кого это только в периоды повышенной ликвидности.

Сильнее это проявляется если запустить несколько скриптов и даже в спокойное время. При этом на демо Quik Junior, где поток данных очевидно низкий, это малозаметно.

Хотелось бы понять - это у меня что-то вылезло и надо глубоко копать или такое есть и других.

Примечательно, что есть скрипт из одной строки запускающий dll реализующий jRPC сервер из Квика на плюсах. И если подписаться в нём на OnQuote, то происходит то же самое. Казалось бы - библиотека на ++, нет окон - а терминал не даёт переключить закладки, думает.
Демо Quik Junior, Нет данных
 
Второй день в демо-терминале Junior нет данных по акциям.
Также некорректно передаются параметры, например размер лота. У Сбер = 1, хотя должен быть 10.

Т.к. данные акций не транслируются биржей, то явно есть проблема, мешающая тестированию скриптов.
Работа OnClose
 
Есть колбек OnClose. Казалось бы, он должен помочь понять, что терминал остановлен. Но явно что-то пошло не так.

Берем простой скрипт. Закрываем терминал через "крестик".

Ожидание - 1. OnClose, сбрасываем флаг. 2. выходим из main.
Код
local sleep  = _G.sleep
local isRun  = true
local AddLabel          = _G.AddLabel
local GetLabelParams    = _G.GetLabelParams
local logFile

local function log_tostring(...)
    local n = select('#', ...)
    if n == 1 then
    return tostring(select(1, ...))
    end
    local t = {}
    for i = 1, n do
    t[#t + 1] = tostring((select(i, ...)))
    end
    return table.concat(t, " ")
end

local function log(...)
    if logFile==nil then return end
    logFile:write(tostring(os.date("%c",os.time())).." "..log_tostring(...).."\n");
    logFile:flush();
end

function _G.OnStop()
    isRun = false
    log("Script Stoped")
    if logFile then logFile:close() end
end

function _G.OnClose()
    isRun = false
    log("Script OnClose")
    if logFile then logFile:close() end
end

function _G.main()

    logFile = io.open(_G.getScriptPath().."\\labels_test.txt", "w")

    local t_id = _G.AllocTable()
    _G.AddColumn(t_id, 1, 'test', true, _G.QTABLE_STRING_TYPE, 20)
    _G.CreateWindow(t_id)

    local tag = 'virt_test'
    local label_params = {}
    label_params.YVALUE = 324
    label_params.TEXT = 'TEST    |||||||||||||||||||||||||||||||||||||||||||||'
    label_params.HINT = 'Еще текст'
    label_params.DATE = 20260512
    label_params.TIME = 135000
    label_params.FONT_FACE_NAME = 'Arial'
    label_params.ALIGNMENT = 'RIGHT'
    label_params.FONT_HEIGHT    = 10
    label_params.TRANSPARENT_BACKGROUND    = 1
    local data = {price = 324}
    local l_id = AddLabel(tag, label_params)
    sleep(1000)
    
    while isRun do
        local i = 1
        while isRun and i < 10 do
            label_params = GetLabelParams(tag, l_id)
            if label_params then
                data.price = tonumber(label_params.yvalue) or 0
            end
            log(os.clock(), i, 'IsWindowClosed', tostring(_G.IsWindowClosed(t_id)), 'label_params', tostring(label_params), tag, 'l_id', l_id, tostring(data.price))
            i = i+1
        end
        log(os.clock(), 'sleep')
        sleep(100)
    end
end

Выводит метку на график, создаём окно. Далее выводим данные метки с графика и закрыто ли окно. Смотрим лог:

Tue May 12 15:07:59 2026 30.832 sleep
Tue May 12 15:07:59 2026 30.946 1 IsWindowClosed false label_params table: 00000205F30168A0 virt_test l_id 13.0 324.0
Tue May 12 15:07:59 2026 30.947 2 IsWindowClosed false label_params table: 00000205F3016BA0 virt_test l_id 13.0 324.0
Tue May 12 15:07:59 2026 30.947 3 IsWindowClosed false label_params table: 00000205F3017BA0 virt_test l_id 13.0 324.0
Tue May 12 15:07:59 2026 30.947 4 IsWindowClosed false label_params table: 00000205F3017160 virt_test l_id 13.0 324.0
Tue May 12 15:07:59 2026 30.947 5 IsWindowClosed false label_params table: 00000205F3018020 virt_test l_id 13.0 324.0
Tue May 12 15:07:59 2026 30.947 6 IsWindowClosed false label_params table: 00000205F30171A0 virt_test l_id 13.0 324.0
Tue May 12 15:07:59 2026 30.947 7 IsWindowClosed false label_params table: 00000205F30171E0 virt_test l_id 13.0 324.0
Tue May 12 15:07:59 2026 30.947 8 IsWindowClosed false label_params table: 00000205F3017F20 virt_test l_id 13.0 324.0
Tue May 12 15:07:59 2026 30.948 9 IsWindowClosed false label_params table: 00000205F3017A60 virt_test l_id 13.0 324.0
Tue May 12 15:07:59 2026 30.948 sleep

Окно ещё не уничтожено, но графика уже нет и данные метки не получены.
Tue May 12 15:07:59 2026 31.061 1 IsWindowClosed false label_params nil virt_test l_id 13.0 324.0
Tue May 12 15:07:59 2026 31.061 2 IsWindowClosed false label_params nil virt_test l_id 13.0 324.0
Tue May 12 15:07:59 2026 31.061 3 IsWindowClosed false label_params nil virt_test l_id 13.0 324.0
Tue May 12 15:07:59 2026 31.061 4 IsWindowClosed false label_params nil virt_test l_id 13.0 324.0
Tue May 12 15:07:59 2026 31.061 5 IsWindowClosed false label_params nil virt_test l_id 13.0 324.0
Tue May 12 15:07:59 2026 31.061 6 IsWindowClosed false label_params nil virt_test l_id 13.0 324.0
Tue May 12 15:07:59 2026 31.061 7 IsWindowClosed false label_params nil virt_test l_id 13.0 324.0
Tue May 12 15:07:59 2026 31.061 8 IsWindowClosed false label_params nil virt_test l_id 13.0 324.0
Tue May 12 15:07:59 2026 31.061 9 IsWindowClosed false label_params nil virt_test l_id 13.0 324.0
Tue May 12 15:07:59 2026 31.061 sleep

А здесь уже и окна нет
Tue May 12 15:08:00 2026 31.173 1 IsWindowClosed true label_params nil virt_test l_id 13.0 324.0
Tue May 12 15:08:00 2026 31.173 2 IsWindowClosed true label_params nil virt_test l_id 13.0 324.0
Tue May 12 15:08:00 2026 31.173 3 IsWindowClosed true label_params nil virt_test l_id 13.0 324.0
Tue May 12 15:08:00 2026 31.173 4 IsWindowClosed true label_params nil virt_test l_id 13.0 324.0
Tue May 12 15:08:00 2026 31.173 5 IsWindowClosed true label_params nil virt_test l_id 13.0 324.0
Tue May 12 15:08:00 2026 31.173 6 IsWindowClosed true label_params nil virt_test l_id 13.0 324.0
Tue May 12 15:08:00 2026 31.173 7 IsWindowClosed true label_params nil virt_test l_id 13.0 324.0
Tue May 12 15:08:00 2026 31.173 8 IsWindowClosed true label_params nil virt_test l_id 13.0 324.0
Tue May 12 15:08:00 2026 31.173 9 IsWindowClosed true label_params nil virt_test l_id 13.0 324.0
Tue May 12 15:08:00 2026 31.173 sleep

Только сейчас OnClose
Tue May 12 15:08:00 2026 Script OnClose

Сама по себе схема, вроде, корректна, если бы OnClose мог выполнится параллельно, не обращая внимания на работу main. Но это не так. В итоге OnClose вызывается когда уже уничтожено окно скрипта и нет графика. Т.е. некоторое время (а точнее пока не вызовется C функция) у нас есть подвешенное состояние - мы не знаем окно, график закрыты пользователем или нет.
В итоге, если в это время считаем метку, а её нет, можем принять не верное решение. Аналогично и по окну скрипта.

Что хотелось бы: вместо колбека иметь глобальный флаг, состояние или иное, сигнализирующее, что терминал закрывается. При этом он должен быть установлен быстро, перед уничтожением объектов терминала. Аналогия из электротехники - логическое 1 или 0 на контакте. Если 0, то уже всё, логика работы совершенно иная.

Текущая же реализация может работать, если бы OnClose вызывался до уничтожения объектов.
Картинка метка png
 
Случайно вывел картинку в метку в формате png и она вывелась. Что-то изменилось в последних версиях? Раннее, да и сейчас руками на график, только bmp.
Черный квадрат
 
Вот такую картинку получил при отладке индикатора с интенсивной записью в лог
Автоматическое выключение
 
Предложите способ корректного выключения терминала по времени. Возникла задача останавливать все в определенное время.
Но способы через скрипты Power-Shell, CMD использующие Stop-Process, taskkill - приводит к некорректному завершению терминала, без записи состояния.
Нужен способ, чтобы терминал выполнил все действия при завершении.
Индекс запсииси в таблице ордеров
 
В последнее время один из брокеров стабильно стал разрывать соединение в середине торговой сессии и после восстановления соединения очищает таблицы, вызывает колбек OnCleanUp.
Можно было бы сказать какого и зачем все чистить, но с этим уже бороться бессмысленно.

Более важно другое, после восстановления соединения в таблице ордеров наблюдаются совсем другие индексы записей. Был у записи индекс 15, а стал 20.
Хотя визуально таблица (без фильтров и сортировок ) представлена именно как была ранее, и там запись до сих пор 15.

Ранее такого поведения не наблюдалось. Сейчас приходится вводить дополнительные методы для восстановления соответствия записей и запомненных данных.
Индикатор с большим числом линий.
 
В последних версиях терминала если добавить индикатор где число линий, например, больше 50, то терминал просто "умирает". Этот же индикатор в 7-ой версии вполне себе работал, даже не на одном графике.

Вот простейший пример, ничего, по сути, не делающий, а просто выводит линии на график, демонстрирующий проблему.
Код


local lines = 100

Settings = {}
Settings.Name = "*test_lines"
Settings.price = 66960
Settings.delta = 1.0

function Init()
    Settings.line = {}
    for i = 1, lines do
        Settings.line[i] = {}
        Settings.line[i] = {Color = RGB(185, 185, 185), Type = TYPET_BAR, Width = 2}
    end
    return lines
end

function OnChangeSettings()
    Init()
end

function OnCalculate(index)
    if index < Size() then return end
    for i = 1, lines do
        SetRangeValue(i, index-100, index-1, Settings.price-i*Settings.delta)
    end
    return
end
Чудеса на виражах
 
Брокер Сбербанк. Действие 24.01.2025

Есть два брокерских счёта у него. Два терминала Квик. После очередного обрыва связи, которые на этой неделе почти каждый день, ордера из одного брокерского счёта стали видны в таблице Квика другого брокерского счёта. Буквально - есть записи с несуществующим кодом клиента для этого счёта, терминала. Что ещё забавно, если снять ордер в этом терминале (хотя этот ордер не принадлежит этому брокерскому счёту), то он также снимается и в другом. Вот такая загогулина. Если бы не было печально, то, наверно, можно было бы посмеяться. Возникает вопрос - как серверная часть терминала допускает такое? А если бы стали видны ордера совсем другого клиента?

Прикладываю картинку. Один терминал и окно другого терминала. Видны ордера из первого во втором. Если это не критическая уязвимость связки терминал-сервер, то я не знаю что это.
И просьба не говорить о том, что брокер может что-то настроить у себя на серверной части. Такого просто не может быть, ни при каких обстоятельствах.
limit_kind в таблице depo_limit
 
Сегодня на тестовом контуре в таблице depo_limit получил такое:

limit_kind = 20250116

Это что? Ясно что дата. Но с какой такой... Я не слышал о новом режиме торгов в виде даты. Есть Т0, Т+1, Т+2, TOD, TOM и новое Т365, отображаемое в терминале Тх.
Ответ транзакции
 
Тестовый контур Quik Junior 11.3.2.2

Ответ транзакции:
[INFO  2024-09-18 13:13:09] : OnTransReply all trans count: 8 | sec_code SiZ4 result_msg: Ответ из торговой системы не получен, статус исполнения транзакции неизвестен. За уточнением просьба обратиться к Вашему брокеру. status: 4 trans_id: 50553350 order_num: 0 price: 80013 qty: nil account SPBFUT000i4 client_code SPBFUT000i4 firmid nil brokerref SPBFUT000i4//NTR01


Не то чтобы нужен ответ, но просто хотелось бы понять причину. Это что-то новое: запрос сделан, ответ - кто же знает что там случилось.
Необъяснимоле чудо
 
Версия 11.3.1.2, демо-сервер ARQA

Вот такая замечательная картина. Ордера на покупку.
Данные параметров BID, OFFER
 
Есть два параметра таблицы текущих торгов - BID, OFFER.
Вопрос разработчикам - правильно ли я понимаю, что при отсутствии с одной из сторон данных (планка) будет возвращен 0 в качестве значения?  Либо result будет "0", сообщающий, что данные не получены?
Если просто 0, то как тогда это соотносится с возможностью нулевых цен для части инструментов. Не хотелось бы опрашивать стакан для такой простой задачи
TrustManager
 
Если ли доступ к таблицам, создаваемым модулем TrustManager из qlua?
При подключении модуля появляется тип транзакции NEW_GROUP_ORDER, судя по экспорту. Поэтому и возникает вопрос - как сформировать команду, читать данные и т.д.
Чтение данных метки, Зависание терминала
 
Версия 9.5


Скрипт простой: ставим метку и потом читаем данные.  После установки метки берем и перетаскиваем ее на графике, желательно  быстро. Терминал зависает. На таком простом скрипте это происходит не  сразу, поэтому можно просто двигать метку до выявления эффекта. Частично помогает избежать проблемы увеличение sleep до 500.

На версиях 8.* - сколько не двигал не получается эффект зависания, даже на sleep 55.


На самом деле - серьезная проблема, т.к. считывание данных с меток - это единственный способ взаимодействия пользователя  с скриптом через график.

Ссылка на запись эффекта: https://disk.yandex.ru/d/OaffyXPOxRlG_Q


Тестовый скрипт:
Код
local sleep = _G.sleep
local isRun = true

local AddLabel          = _G.AddLabel
local GetLabelParams    = _G.GetLabelParams

function _G.OnStop()
    isRun = false
end

function _G.main()

    local tag       = 'virt_test'

    local label_params = {}
    label_params.YVALUE = 119.5
    label_params.TEXT = 'TEST    |||||||||||||||||||||||||||||||||||||||||||||'
    label_params.HINT = 'Еще текст'
    label_params.DATE = 20220611
    label_params.TIME = 152000
    label_params.FONT_FACE_NAME = 'Arial'
    label_params.ALIGNMENT = 'RIGHT'
    label_params.FONT_HEIGHT    = 10
    label_params.TRANSPARENT_BACKGROUND    = 1

    local l_id = AddLabel(tag, label_params)
    sleep(1000)

    while isRun do
        label_params = GetLabelParams(tag, l_id)
        if label_params then
            _G.message(tostring(label_params.yvalue))
        end
        sleep(100)
    end
end
Время сервера, время последней сделки., Разное время передаваемое с сервера.
 
Прямо сейчас наблюдаю такую картину. Время сервера отстает на минуту от текущего времени (оно синхронизировано и корректно).
При  этом время последней сделки на минуту впереди времени сервера и близко к  правильному текущему времени, т.е. тоже опережает время сервера.

Я  могу понять, что это проблема брокера (Сбербанк), но с какой стати  время сделки в будущем относительно времени сервера брокера и времени  пакета?
Т.е. я понимаю, что время сделки просто транслирует биржа, но  серверная часть должна же не просто транслировать, но и как-то  контролировать, что она транслирует.
Демо счет.
 
Добрый день.

Не удается второй день подключится к демо серверу
SERVER: Информационно-торговая система ARQA, IPCOMMENT: JUNIOR 1

Ни в 8-ой, ни в 9-ой версии терминала. Пароль принимает нормально. Пишет, что до истечения пароля осталось столько-то, далее: Соединение установить не удалось.
Версия 9.* isDarkTheme в индикаторах
 
В описании доступных функций глобального контекста  индикатора для версии терминала 9.* есть isDarkTheme.
Однако, если присутствует ее вызов в теле индикатора, то он не показывается в списке выбора.
Если же убрать вызов, то индикатор становится доступен для добавления на график.

В 8-ой версии работает корректно.
На демо счете прошла кросс заявка.
 
Демо счет, Quik 8.13.0.106

Установлен лимитный ордер. Совершена ручная сделка, исполнившая этот ордер. В таблице сделок номер сделки задублирован.
Странная дата сервера
 
Что это за формат времени в поле Дата торгов? Как, спрашивается, понять, что здесь что?


getFuturesHolding
 
На версии 8.х столкнулся на реальных счетах разных брокеров, что функции получения текущих позиций как getFuturesHolding,
getDepoEx работают нестабильно. Чаще всего это происходит с getFuturesHolding на едином счете.
В течении сессии часто (обычно перед клирингом) функция не возвращает ничего. При этом если перебрать строки прямым итератором, то все нормально находится.

Приходится отказываться от использования функций. Но перебор - это существенный расход памяти и просто медленней.
Утечка памяти
 
Недавно началось очень странное поведение системы при работе Квика. Версия 8.3.1.38. При этом он был установлен еще в мае.

Памяти на рабочем месте 32 гб. Свободной полно. Но явно идет утечка памяти. Виртуальная память выделена > 80 ГБ.

То ли это Windows 10 так балуется, то ли у Квика лыжи не едут... Но, еще раз, полтора месяца с момента обновления, не было проблем.

https://funkyimg.com/i/3683s.png
Параметр STARTTIME, ENDTIME, Вечерняя сессия на фондовой секции
 
Начались торги в вечернюю сессию на фондовой секции. Я уже задавал вопрос про трансляцию времени сессии, но вот сейчас она идет и можно посмотреть на реальный поток данных.

Что мы видим:

Вот утро. Начало торгов. По фьючерсу все ожидаемо и понятно. Есть и времена и статус.
По акции я вижу только статус, а время заполнилось только утренним аукционом.


[INFO  2020-06-23 09:16:58] : SRU0 STATUS {param_image = "приостановлена", param_type = "4", param_value = "2.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 CLSTATE {param_image = "Назначен пр.", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 TRADINGSTATUS {param_image = "закрыта", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 MONSTARTTIME {param_image = "7:00:00", param_type = "5", param_value = "70000.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 MONENDTIME {param_image = "8:40:00", param_type = "5", param_value = "84000.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 STARTTIME {param_image = "10:00:00", param_type = "5", param_value = "100000.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 ENDTIME {param_image = "18:45:00", param_type = "5", param_value = "184500.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 EVNSTARTTIME {param_image = "19:00:00", param_type = "5", param_value = "190000.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 EVNENDTIME {param_image = "23:50:00", param_type = "5", param_value = "235000.000000", result = "1"}

[INFO  2020-06-23 09:16:58] : SBER STATUS {param_image = "торгуется", param_type = "4", param_value = "1.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SBER CLSTATE {param_image = "", param_type = "0", param_value = "0.000000", result = "0"}
[INFO  2020-06-23 09:16:58] : SBER TRADINGSTATUS {param_image = "закрыта", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SBER MONSTARTTIME {param_image = "", param_type = "0", param_value = "0.000000", result = "0"}
[INFO  2020-06-23 09:16:58] : SBER MONENDTIME {param_image = "", param_type = "0", param_value = "0.000000", result = "0"}
[INFO  2020-06-23 09:16:58] : SBER STARTTIME {param_image = "", param_type = "5", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SBER ENDTIME {param_image = "", param_type = "5", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SBER EVNSTARTTIME {param_image = "", param_type = "0", param_value = "0.000000", result = "0"}
[INFO  2020-06-23 09:16:58] : SBER EVNENDTIME {param_image = "", param_type = "0", param_value = "0.000000", result = "0"}

[INFO  2020-06-23 09:50:00] : SBER TRADINGSTATUS {param_image = "открытие", param_type = "4", param_value = "3.000000", result = "1"}
[INFO  2020-06-23 09:50:02] : SBER STARTTIME {param_image = "9:50:00", param_type = "5", param_value = "95000.000000", result = "1"}
[INFO  2020-06-23 09:59:33] : SBER TRADINGSTATUS {param_image = "закрыта", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 09:59:33] : SBER ENDTIME {param_image = "9:59:34", param_type = "5", param_value = "95934.000000", result = "1"}
[INFO  2020-06-23 10:00:00] : SRU0 STATUS {param_image = "торгуется", param_type = "4", param_value = "1.000000", result = "1"}
[INFO  2020-06-23 10:00:00] : SRU0 TRADINGSTATUS {param_image = "открыта", param_type = "4", param_value = "1.000000", result = "1"}
[INFO  2020-06-23 10:00:00] : SBER TRADINGSTATUS {param_image = "открыта", param_type = "4", param_value = "1.000000", result = "1"}

Вот данные пор акции внутри дня. Время утреннего акциона. Это как понимать? Уже сессия к концу идет, а время старое.
[INFO  2020-06-23 17:33:32] : SBER TRADINGSTATUS {param_image = "открыта", param_type = "4", param_value = "1.000000", result = "1"}
[INFO  2020-06-23 17:33:32] : SBER STARTTIME {param_image = "9:50:00", param_type = "5", param_value = "95000.000000", result = "1"}
[INFO  2020-06-23 17:33:32] : SBER ENDTIME {param_image = "9:59:34", param_type = "5", param_value = "95934.000000", result = "1"}


Вечер. По фьючерсам все адекватно, а вот по акциям:

[INFO  2020-06-23 18:40:00] : SBER TRADINGSTATUS {param_image = "закрыта", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 18:40:05] : SBER TRADINGSTATUS {param_image = "аукцион", param_type = "4", param_value = "4.000000", result = "1"}
[INFO  2020-06-23 18:40:16] : SBER STARTTIME {param_image = "18:40:01", param_type = "5", param_value = "184001.000000", result = "1"}
[INFO  2020-06-23 18:40:16] : SBER ENDTIME {param_image = "", param_type = "5", param_value = "0.000000", result = "1"}

[INFO  2020-06-23 18:45:15] : SBER TRADINGSTATUS {param_image = "ЦАЗ", param_type = "4", param_value = "5.000000", result = "1"}
[INFO  2020-06-23 18:45:16] : SBER STARTTIME {param_image = "18:45:14", param_type = "5", param_value = "184514.000000", result = "1"}

[INFO  2020-06-23 18:50:02] : SBER TRADINGSTATUS {param_image = "закрыта", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 18:50:04] : SBER ENDTIME {param_image = "18:50:00", param_type = "5", param_value = "185000.000000", result = "1"}
[INFO  2020-06-23 19:00:12] : SBER TRADINGSTATUS {param_image = "открытие", param_type = "4", param_value = "3.000000", result = "1"}
[INFO  2020-06-23 19:00:13] : SBER STARTTIME {param_image = "19:00:01", param_type = "5", param_value = "190001.000000", result = "1"}
[INFO  2020-06-23 19:00:13] : SBER ENDTIME {param_image = "", param_type = "5", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 19:04:54] : SBER TRADINGSTATUS {param_image = "закрыта", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 19:04:54] : SBER ENDTIME {param_image = "19:04:54", param_type = "5", param_value = "190454.000000", result = "1"}
[INFO  2020-06-23 19:05:00] : SBER TRADINGSTATUS {param_image = "открыта", param_type = "4", param_value = "1.000000", result = "1"}

[INFO  2020-06-23 19:21:34] : SBER STARTTIME {param_image = "19:00:01", param_type = "5", param_value = "190001.000000", result = "1"}
[INFO  2020-06-23 19:21:34] : SBER ENDTIME {param_image = "19:04:54", param_type = "5", param_value = "190454.000000", result = "1"}

Времена аукциона я еще могу понять. А вот что это такое при старте вечерней сессии уже с трудом. И опять - времена то где?
Почему нельзя заполнить времена прямо при подключению к серверу, как это делается для фьючерсов и менять их, если они меняются внутри дня? Поля же есть.

Часть акций торгуется, часть нет. А информации о времени сессии нет. Раньше можно было хотя бы определить константы, когда времена были фиксированными (хоть это было и спорное решение), но сейчас то как.
Вечерняя сессия на фондовом рынке., Вечерняя сессия на фондовом рынке.
 
В связи с началом торгов в вечернюю сессию на фондовом рынке, возникает вопрос: какие параметры будут транслироваться для списка бумаг допущенных к торгам?
В частности: TRADINGSTSTUS, ENDTIME, EVNSTARTTIME, EVNENDTIME.
Будут ли числовые значения статуса отличаться меджду основной сессией и вечерней?
Недельные опционы на демо счете
 
Добрый день.

Не могу найти в демо версии недельные опционы. Поток данных на демо контуре по ним вообще есть? Или это я не могу найти.
strict lua
 
Добрый день.

Если qlua это lua 5.1, то разве не должна быть поддержка библиотеки strict?
Динамическое количество линий индикатора
 
Добрый день.

Т.к. в индикаторе необходимо при инициализации указывать количество возвращаемых линий, то написана такая конструкция в функции init:
Код
for i = 1, lines do
        Settings.line[i] = {}
        Settings.line[i] = {Color = RGB(185, 185, 185), Type = TYPE_LINE, Width = 2}
    end
Алгоритм вводит линии по мере наполнения массива линий. Сначала их может быть 20, потом уже 100 и т.д. Для оптимизации линии выводятся только с не пустым значением.

Все бы хорошо, но заметил такую особенность (версия 7.19), если не вывести хотя бы один раз все линиий с не пустым значением, то потом они не отображаются на графике, хотя функция GetValue возвращает значение. Я долго не мог понять почему у меня линии не показываются с течением времени, а если заново инициализировать индикатор (через параметры графика), то все на месте.

Пришлось сделать такой странный костыль:
Код
if index == 1 then
    tmpOutlines = {}
    for i=1,lines do --необходимо вывести все линии хотя бы один раз, чтобы потом они отображались без проблем                  
       tmpOutlines[i] = O(Size())
    end
    return unpack(tmpOutlines)
end
if index == 2 then
    for i=1,lines do                  
        SetValue(1,i,nil)
    end
    return nil
end
Индекс бара
 
Добрый день.

Есть пожелание по вводу индекса бара (свечи) в контекстной подсказке при наведении на бар.
Сейчас выводится только дата, время и торговые параметры бара, но при отладе скриптов, да и просто для удобства задания диапазона,
хотелось бы видеть индекс без костылей в виде доп. индикаторов.
Высота метки в шагах цены
 
Добрый день.

Возникла проблема. Выводятся текстовые метки друг над другом. Задется высота шрифта 10.
А как перевести эту высоту в шаг цены? Сейчас приходится подбирать дельту цены, чтобы метки не накладывались.

Собственно очень не хватает процедур пересчета абсолютных координат окна (идеально еще бы иметь событие - "изменение масштаба") в ценовую и временную шкалы. Сразу бы решились многие проблемы. Сейчас просто невозможно рассчитать линию под определенным углом, или, наоборот, рассчитать угол линии.
Установка данных индикатора из скрипта
 
Добрый день.

Получение данных индикатора из скрипта возможно. А обратно?

У меня скрипт считает даные, хранит в таблице. Я хотел бы вывести их как значения индикатора. Т.е. сам индикатор будет пустой, возвращающий nil. А вот скриптом хотелось поставить значения, по примеру функции SetValue.
Обращение к внешним сервисам
 
Добрый день.

Кто-нибудь пробовал обращаться к внешним сервисам типа Twitter из qlua?
Есть у меня желание добавить себе в скрипт чтение ленты по ключевым словам.
Я нашел библиотеки Lua для подключения к тому же Twitter, вопрос только - заработет ли из Квика?
Может проще написать того же бота на питоне.
Возвращаемые данные для отрисовки индикатора
 
Добрый день.

Пишется индикатор с динамическим количеством линий.
Можно ли вместо данных типа ruturn out1, out2, out3 вернуть массив {}. Соответственно, данные линий - это индексные данные массива.

Уж больно некрасиво приходится делать большое количество переменных с запасом.

Есть еще вариант динамического описания кода. Есть ли в интерпретаторе qlua execute("Текст выполняемого кода")?
Вилы Эндрюса, уровни Фибоначчи, веер Ганна.
 
Добрый день.

Очень бы хотелось иметь достаточной простой интрумент как вилы Эндрюса.
Также очень хочется существующие уровни Фибоначчи строить не только горизонтально, но и под любым углом. Тем самым получая наклонные уровни.
А уж для полноты картины - веер Ганна был бы очень кстати.

Спасибо.
Страницы: 1
Наверх