Создаём QLua-окно, назначаем ему колбек на события QTABLE_CHAR и/или QTABLE_VKEY. Если переключиться на контрол "Edit" или "ComboBox" на панели инструментов ("Поиск инструмента", "Окно сообщений" и пр.), а затем активировать окно кликом на его заголовок, то события, назначенные раннее не работают. Чтобы заработали, нужно активировать кликом внутри окна.
Надо делать так, как надо. А как не надо - делать не надо.
local AllTrades = {}
function main()
ID = AllocTable()
AddColumn(ID, 1, '1', true, QTABLE_INT_TYPE, 20)
CreateWindow(ID)
row = InsertRow(ID, -1)
while not stoped do
if #AllTrades ~= 0 then
local trade_num = table.sremove(AllTrades, 1).trade_num
table.ssort({0, 0}, function()
SetCell(ID, row, 1, ''..trade_num)
return true
end)
else sleep(1) end
end
end
function OnAllTrade(alltrade)
table.sinsert(AllTrades, alltrade)
end
Через непродолжительное время терминал вешается. Зависание происходит при выполнении инструкции SetCell в main.
Надо делать так, как надо. А как не надо - делать не надо.
Скрипт отправляет транзакцию на снятие заявки. Допустим, OnOrder получен раньше или OnTransReply вообще не пришел. Есть возможность установить инициатора снятия: сам скрипт, пользователь (вручную) или, может, другой бот?
Надо делать так, как надо. А как не надо - делать не надо.
local run = true
local function f()
for i = 1, 2000000 do
local a = 1 + 2 * 3 / 4
end
return run
end
function main()
local t_id = AllocTable()
AddColumn(t_id, 1, "", true, QTABLE_DOUBLE_TYPE, 20)
CreateWindow(t_id)
InsertRow(t_id, -1)
while run do
local r = f()
SetCell(t_id, 1, 1, tostring(r))
sleep(1)
end
message('Exit')
end
function OnStop()
run = nil
message('OnStop')
return 5000
end
Почему после остановки скрипта main не завершается (чаще всего) должным образом?
Надо делать так, как надо. А как не надо - делать не надо.
Старая проблема. Настроен список инструментов для получения информации по обезличенным сделкам. К примеру, получаем сделки по классу FORTS, фильтр инструментов не включен. Открываем новую таблицу ТВС и указываем только один инструмент из класса FORTS для вывода в эту таблицу. В результате настройки сбрасываются, сделки по остальным инструментам прекращают поступать.
Надо исправить: при открытии новой таблицы список инструментов не должен изменяться в сторону уменьшения.
Надо делать так, как надо. А как не надо - делать не надо.
info.exe 7.14.1.7 StratVolat.dll 2.1.61.1 Неверно отображается прибыль при цене БА, равной страйку, на момент экспирации. И как не меняй масштаб, добиться шага цены 100, чтобы страйк попал на одно из делений на шкале, невозможно.
Надо делать так, как надо. А как не надо - делать не надо.
1. Каким образом происходит обновление графиков при смене (идентификатора) сессии? Путём дозаписи в конец? 2. Если у брокера произошёл сбой, и часть графика за какой-то период не отображается, а затем он положил на сервер корректные данные, как получить корректный график, не потеряв при этом накопленную историю свыше 3000 свечей, которой нет на сервере?
Надо делать так, как надо. А как не надо - делать не надо.
Функция CalcBuySell() возвращает значение в зависимости от установленной настройки "Исходя только из собственных средств", т.е. ведёт себя непредсказуемо. Предлагаю добавить в функцию опциональный параметр, аналогичный этой настройке.
Надо делать так, как надо. А как не надо - делать не надо.
В меню <Система / Заказ данных / Поток обезличенных сделок...> выбран класс целиком. Если теперь создать Таблицу обезличенных сделок и добавить в неё или добавить в раннее открытую таблицу одну бумагу из выбранного класса, то в <Поток обезличенных сделок...> установится фильтр на заказ только одной бумаги из всего класса. Можно сделать так, чтобы открытие или редактирование ТОС не сбрасывало инструменты, заказанные через <Поток обезличенных сделок...>?
Надо делать так, как надо. А как не надо - делать не надо.
run, t_id = true
function main()
t_id = AllocTable()
CreateWindow(t_id)
while run do
sleep(1) -- можно sleep убрать, чтоб наверняка
end
end
function OnStop()
run = nil
DestroyTable(t_id)
end
function OnDisconnected()
OnStop()
end
При разрыве соединения в темной теме QUIK падает. Как временное решение проблемы - поставить небольшую задержку в конце main()
Надо делать так, как надо. А как не надо - делать не надо.
QUIK 7.10.0.76. Иногда при подключении к серверу скрипт падает с ошибкой
Цитата
attempt to call global 'W' (a nil value)
W - это функция, которая крутится в цикле main. Она никак не может быть nil. Вот фрагмент кода:
Код
function OnConnected()
Sort = true
end
function W()
return nil
end
function main()
...
while run do
if Sort then
table.sort({0, 1}) -- сортировка никак не связана с функцией W, но без сортировки проблема не воспроизводится
Sort = nil
elseif not W() then -- тут возникает ошибка
else sleep(100) end
end
end
Целый день убил на поиск проблемы, пока не заглянул в глобальную таблицу _G. А её и нет: когда изменил код так:
Код
function main()
while run do
if Sort then
table.sort({0, 1})
Sort = nil
else
if not _G then message('Ahtung! Not _G', 3)
elseif not W() then
else sleep(100) end
end
end
end
то при подключении скрипт стал однократно выдавать сообщение об отсутствии _G (т.е. впоследствии _G снова обнаруживается) или падать с ошибкой
Цитата
attempt to call global 'W' (a table value) (неожиданно!)
Скрипт использует только функции из qlua.dll, не модифицирует функцию W, и не работает напрямую с глобальной таблицей.
Соответственно, вопрос разработчикам: есть ли в QLua какие-либо механизмы, способные так повлиять на работу?
Надо делать так, как надо. А как не надо - делать не надо.
Несмотря на то, что инструменты сохраняются в sec.dat и таблице securities, графики - в кэше archive, по инструментам с истёкшим сроком не открываются графики. Зачем это ограничение?
Надо делать так, как надо. А как не надо - делать не надо.
Вопрос к разработчикам: Вы можете предложить надёжный способ убедиться, что getParamEx даёт действительно последнюю цену инструмента, а не её отсутствие?
Надо делать так, как надо. А как не надо - делать не надо.
Это верно, что во время работы колбэка OnStop работа потока main приостанавливается? Кроме того, скрипту даётся время на завершение работы, которое отсчитывается не по окончании OnStop (как это показано на вашей схеме), а от начала работы функции OnStop. Т.о., схема должна выглядеть так:
Скрытый текст
Надо делать так, как надо. А как не надо - делать не надо.
Предлагаю модифицировать функцию getDataSourceInfo: добавить необязательный параметр: STRING Tag и сделать функцию доступной как в индикаторах так и в обычных скриптах. При задании параметра функция будет возвращать параметры графика с идентификатором Tag.
Надо делать так, как надо. А как не надо - делать не надо.
Если в настройках получения данных стоит галка "Исходя из настроек открытых пользователем таблиц", то ни ParamRequest ни CreateDataSource не могут заказать получение параметров Таблицы текущих торгов с сервера. При этом они радостно сигнализируют об успехе. Нужно изменить такое поведение.
Надо делать так, как надо. А как не надо - делать не надо.
function func(v)
return v * v
end
s = {
f = function(v)
local r = s.r
if not r then
r = func(v)
s.r = r
end
return r
end
}
print(tostring(s.f(3)))
print(tostring(s.f(3)))
Функция s.f() запоминает вычисленное значение и при повторном обращении возвращает раннее вычисленное значение. Можно ли описать её через setmetatable? PS: возвращать она должна раннее сохранённое значение, независимо от переданного аргумента при повторном вызове.
Надо делать так, как надо. А как не надо - делать не надо.
Если рассчитывать среднюю стоимость позиции по прошедшим сделкам, возникает вопрос: Может ли колбэк по сделке прийти позже колбэка OnDepoLimit или OnFuturesClientHolding?
Надо делать так, как надо. А как не надо - делать не надо.
В среде QUIK скрипты выполняются в несколько раз дольше, чем в командной строке. Вот такой скрипт
Код
function main()
print = message or print
local abs = math.abs
local t = os.clock()
for i = 1, 100000000 do abs(-1234.56789) end
t = os.clock() - t
print(string.format('%0.1f', t))
end
if not message then main() end
в командной строке выполняется 3.5 сек, в QUIK - 8.8 сек. В 2.5 раза дольше! Почему так?
PS: ЦП: 2 ядра, 4 логических процессора.
Надо делать так, как надо. А как не надо - делать не надо.
Добрый день. Предлагаю дать доступ на чтение к фильтру по кодам клиентов из QLua и, соответственно, добавить колбэк при изменении этого поля. Будет полезно для брокеров и управляющих.
Надо делать так, как надо. А как не надо - делать не надо.
Добавьте в функцию параметр, задающий количество совпадений, после которых прекращать поиск. А то если нужно циклически пройтись по таблице для поиска всего одного значения, то занимает слишком много времени.
Надо делать так, как надо. А как не надо - делать не надо.
f_cb = function(t_id, msg, par1, par2)
if msg == QTABLE_LBUTTONDBLCLK then
message("QTABLE_LBUTTONDBLCLK")
elseif msg == QTABLE_LBUTTONUP then
message("QTABLE_LBUTTONUP")
elseif msg == QTABLE_LBUTTONDOWN then
message("QTABLE_LBUTTONDOWN")
end
end
SetTableNotificationCallback(t_id, f_cb)
Есть простой способ отличить двойной клик от одинарного? А то срабатывают сразу все события:
local t_id = AllocTable()
for i = 1, 12 do AddColumn(t_id, i, "", true, QTABLE_STRING_TYPE, 20) end
CreateWindow(t_id)
for i = 1, 5 do InsertRow(t_id, -1) end
SetWindowPos(t_id, 0, 0, 1270, 120)
Появляется скрол:
хотя высоты хватает:
Надо делать так, как надо. А как не надо - делать не надо.
Здравствуйте. Добавьте, пожалуйста, опциональную настройку, запрещающую создавать очередь событий OnQuote. Т.е, чтобы с сервера всегда поступало только последнее событие, а не вся очередь. (Такой эффект можно наблюдать в моменты высокой активности на рынке, когда стакан сначала замирает на некоторое время, а затем ускоренно "прокручивает" все пропущенные котировки. В реал-тайм торговле в этом нет особого смысла.)
Надо делать так, как надо. А как не надо - делать не надо.
Здравствуйте. В каких ситуациях может прийти OnTransReply со статусом 0 или 1? Какие возможные значения может принимать status при выставлении стоп-заявок?
Надо делать так, как надо. А как не надо - делать не надо.
Измените QLua-функцию getQuoteLevel2 таким образом, чтобы она возвращала значения типа number вместо строковых. (Я не могу придумать ни одного варианта, когда было бы необходимо (или даже возможно) использовать данные того формата, что сейчас возвращает функция... Даже в sendTransaction без форматирования эти данные не подойдут.) Конечно, всё форматирование можно написать в своей программе, но форматирование в число занимает гораздо больше времени, чем в C-коде внутри самого терминала. Особенно, если нужно обработать несколько строк бидов и офферов. Это не дело.
Далее, при отсутствии заявок на покупку/продажу "таблицы" bid/offer имеют строковый тип. Логичнее было бы возвращать либо пустую таблицу {}, либо nil.
Надо делать так, как надо. А как не надо - делать не надо.
В QUIK есть условные заявки типа "Со связ. заявкой". При частичном исполнении связанной заявки объем стоп-заявки уменьшается до величины неисполненного остатка лимитированной заявки. Предлагаю на основе данного функционала добавить функцию изменения некоторых параметров (объёма, цены...) любых стоп-заявок без необходимости снятия/выставления новой заявки, т.е. в таблице стоп-заявок это будет та же самая заявка. И также добавление нового вида ("ACTION") транзакции "MOVE_STOP_ORDER", при выполнении которой номер стоп-заявки остаётся прежним.
Надо делать так, как надо. А как не надо - делать не надо.
При наведении курсором на линию условной заявки на графике всплывает подсказка с её параметрами. На обеих линиях отображается параметр "Стоп-цена". Сделайте на тейк-профит линии название параметра "Тейк-цена", чтобы понятней было.
И ещё: я правильно понимаю, что после того как сработал сигнал по тейк-профит и начался расчёт min/max, то стоп-условие уже не рассматривается?
Надо делать так, как надо. А как не надо - делать не надо.
NUMBER InsertRow(NUMBER t_id, NUMBER key) Примечание: При добавлении данных в новую таблицу в первую очередь выполните данную функцию с параметром «key» равным «-1». При этом строка добавится в конец таблицы.
Почему при добавлении в новую таблицу key должен быть равен -1? Что произойдёт, если добавлять в новую таблицу с другим, отличным от -1, значением?
Надо делать так, как надо. А как не надо - делать не надо.
Иногда, например во время клиринга, в таблицах QUIK транслируются нули вместо реальных позиций. Эти нули присылает биржа или QUIK сам подставляет их вместо null?
Как можно понять, когда там действительно нули, а когда позиции пока ещё не загружены?
Надо делать так, как надо. А как не надо - делать не надо.