Старатель (Автор тем)

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

Страницы: 1 2 3 След.
Кривые шибки в QLua
 
Здесь будут публиковаться кривые ошибки, возникающие, очевидно, из-за двухпоточной схемы работы QLua.
Некоторые ошибки указаны здесь: Потокобезопасные функции в Lua 5.3
Зависание QUIK
 
Добрый день.

QUIK 8.8.4.3. Стандартная схема оформления.
Иногда после нескольких дней работы зависает. При этом загрузка ЦП процессом 0
Сначала грешил на потокобезопасные функции. Но анализ логов показывает, что зависании происходит вне потокобезопасных функций (но это не точно ))
Можно ли по стеку определить последнюю вызванную QLua функцию?
SetCell
 
SetCell стал ругаться false на такую конструкцию для строковых ячеек:
Код
SetCell(id, row, col, tostring(value), tonumber(value) or 0)
Потокобезопасные функции в Lua 5.3
 
Скрипт 1:
Скрытый текст

Скрипт 2:
Скрытый текст

При запущенных обоих скриптах изредка в строке
Код
while #AllTrades > 0 do
возникает странная ошибка:
Цитата
attempt to compare number with function
Для воспроизведения можно Получить заново данные по обезличенным сделкам.
Получение данных из таблиц при автостарте
 
Добрый день.

Есть скрипт, который стартует автоматически при запуске QUIK. В самом начале идёт поиск заданного торгового счета:
Код
function main()
  local Index = SearchItems("trade_accounts", 0, getNumberOf("trade_accounts")-1, function(trdaccid) return trdaccid == Account end, "trdaccid")
  ...
end

В настройках стоит "Очищать данные после смены даты: На сервере (при установлении связи)". Т.е., при первичном старте скрипт берёт данные из кэша.
Запуск QUIK происходит долго, открыто несколько тиковых графиков и индикаторов.
Но обычно скрипт работает нормально. Но сегодня SearchItems не нашла торговый счёт и вернула nil. Повторный запуск скрипта вручную (до подключения к серверу) отработал корректно.

По какой причине данный код мог дать сбой?
ParamRequest и getParamEx2, Как получить актуальные данные через getParamEx2?
 
Начну из далека.
При заказе таблицы котировок используем
Код
Subscribe_Level_II_Quotes(class, sec)  -- Для заказа котировок с сервера
getQuoteLevel2(class, sec)  -- Для получения котировок
Мы либо получаем актуальные котировки, если стакан открыт, либо незаполненную таблицу, если стакан закрыт или котировки ещё не подгрузились с сервера.
Если закрыть стакан (отменить заказ на получение котировок с сервера), то getQuoteLevel2 вернёт незаполненную таблицу.
Т.о., мы понимаем, что, если getQuoteLevel2 вернул данные, то они актуальны.
Использование простое:
Код
function main()
  Subscribe_Level_II_Quotes(class, sec)
  -- Получаем актуальные котировки, если они есть:
  Quotes = getQuoteLevel2(class, sec)
end
-- Дальнейшие изменения в стакане можно ловить в OnQuote:
function OnQuote(class, sec)
  Quotes = getQuoteLevel2(class, sec)
end


С getParamEx2 намного сложнее. Если getParamEx2 вернул данные, то они актуальные или старые? Может, пять часов назад их заказывали, потом подписку отменили, а данные остались в кеше.
Если же брать парамтры только в OnParam, то по неликвидному инструменту их можно ждать бесконечно долго.
[BUG] QUIK вешается при использовании DestroyTable из main
 
Ошибка плавающая. Причину установить не удалось.
Но замечено, что виснет с большей вероятностью, если одновременно с DestroyTable происходит какое-то событие.
Для воспроизведения написал следующий скрипт:
Код
function main()
  ID = {}
  for i = 1, 20 do
    ID[i] = AllocTable()
    CreateWindow(ID[i])
    SetTableNotificationCallback(ID[i], function(id, event)
      if event == QTABLE_CLOSE then
        run = false
      end
    end)
  end
  run = true
  while run do sleep(1) end
  for _, id in pairs(ID) do
    DestroyTable(id)
  end
end
Использование: Запустить скрипт без подключения к серверу. Чтобы посыпались события, установить соединение с сервером, и сразу закрыть одно из окон скрипта.
[BUG] При подключении под новым пользователем на графиках остаются сделки и заявки от предыдущего пользователя
 
Если залогиниться в QUIK под другим пользователем (не закрывая программу), то на открытых графиках остаются треугольники от сделок и линии заявок от предыдущего пользователя.
Доступные скрипты, Значки для скриптов с ошибками
 
Сделать другие значки для скриптов:
1) остановившихся в результате ошибки;
2) в которых возникла ошибка, но скрипт продолжил работу (ошибка в колбеке)
Lua: изменить название колонки
 
Сделать функцию для изменения названий колонок в QLua-таблицах.
Появляется лишняя строка в таблице
 
Демонстрационный скрипт:
Код
function OnStop()
  run = nil
  SetCell(id, 1, 1, string.format('Size: %u', GetTableSize(id)))  -- Почему-то попадаем в строку 2
end

local alltrade
function OnAllTrade()
  if not run then return end
  alltrade = true
  for i = 1, 30 do
    DeleteRow(id, 1)
    InsertRow(id, 30)
  end
end

function main()
  id = AllocTable()
  AddColumn(id, 1, 'Size', true, QTABLE_INT_TYPE, 15)
  CreateWindow(id)
  SetWindowPos(id, 0, 0, 100, 520)
  for i = 1, 30 do
    InsertRow(id, -1)
  end

  run = true
  while run do
    if alltrade then
      alltrade = nil
      SetCell(id, 30, 1, string.format('%u', GetTableSize(id)))
    else sleep(1) end
  end
end

Через некоторое время работы появляется 31 строка. Первая строка становится недоступна для редактирования.

Видео
[BUG] Не рассчитывается максимальное возможное количество лотов в заявке
 
Для BRK0 на момент написания этого поста не рассчитывалось количество при цене ниже 23,01
Возможно это связано с расширением планок.
Показывать коды классов в настройках списков заказа данных, Заказ данных -> Поток котировок, Поток обезличенных сделок
 
Отображать код класса в указанных окнах
CalcBuySell, Долгая работа функции
 
Среднее время выполнения функции CalcBuySell 6-7 мс. Как-то долго.
Может, можно что-то подкрутить в настройках?
Перестают работать события SetTableNotificationCallback
 
Создаём QLua-окно, назначаем ему колбек на события QTABLE_CHAR и/или QTABLE_VKEY.
Если переключиться на контрол "Edit" или "ComboBox" на панели инструментов ("Поиск инструмента", "Окно сообщений" и пр.), а затем активировать окно кликом на его заголовок, то события, назначенные раннее не работают. Чтобы заработали, нужно активировать кликом внутри окна.
Контекстное меню в Lua-таблицах
 
QUIK 8.2.0.78
При клике правой кнопкой мыши в Lua-таблице появляется контекстное меню. Как убрать?
Метки
 
Где теперь устанавливается прозрачность метки и фона?
table.ssort, зависает терминал при выполнении table.ssort в main
 
Демонстрационный скрипт:
Код
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.
Клиентский портфель, Настройки обновления
 
Цитата
Система / Настройки / Основные настройки… раздел «Торговля» / «Клиентский портфель»
Влияют ли эти настройки на значения, получаемые из Lua, например, getPortfolioInfo, getPortfolioInfoEx и др.?
OnOrder, снятие заявки
 
Скрипт отправляет транзакцию на снятие заявки.
Допустим, OnOrder получен раньше или OnTransReply вообще не пришел.
Есть возможность установить инициатора снятия: сам скрипт, пользователь (вручную) или, может, другой бот?
Не завершается main после остановки скрипта
 
Код
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, чтобы страйк попал на одно из делений на шкале, невозможно.
Различаются графики в QUIK и экспорт с Финама
 
У кого-нибудь есть свежая история торгов непосредственно с биржи?
А то не совпадают данные из QUIK с экспортом с Финама
Скрытый текст

Как видно на скриншоте идёт смещение на одну минуту.
И такая беда по многим бумагам, которые проверил.
QUIK не может установить соединение с сервером.
 
У меня одного если QUIK работает несколько дней, то иногда после перезагрузки сервера, клиент не может установить соединение с сервером?
История торгов
 
1. Каким образом происходит обновление графиков при смене (идентификатора) сессии? Путём дозаписи в конец?
2. Если у брокера произошёл сбой, и часть графика за какой-то период не отображается, а затем он положил на сервер корректные данные, как получить корректный график, не потеряв при этом накопленную историю свыше 3000 свечей, которой нет на сервере?
CalcBuySell()
 
Функция CalcBuySell() возвращает значение в зависимости от установленной настройки "Исходя только из собственных средств", т.е. ведёт себя непредсказуемо.
Предлагаю добавить в функцию опциональный параметр, аналогичный этой настройке.
Заказ обезличенных сделок
 
В меню <Система / Заказ данных / Поток обезличенных сделок...> выбран класс целиком.
Если теперь создать Таблицу обезличенных сделок и добавить в неё или добавить в раннее открытую таблицу одну бумагу из выбранного класса, то в <Поток обезличенных сделок...> установится фильтр на заказ только одной бумаги из всего класса.
Можно сделать так, чтобы открытие или редактирование ТОС не сбрасывало инструменты, заказанные через <Поток обезличенных сделок...>?
QUIK 7.11.0.88, Не подставляется "Кол-во лотов" по умолчанию
 
После обновления до 7.11.0.88 игнорируется значение параметра "Кол-во лотов" на вкладке "Торговля"
Падение QUIK при DestroyTable
 
Код
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()
Пропадает глобальная таблица _G
 
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, по инструментам с истёкшим сроком не открываются графики.
Зачем это ограничение?
Гарантийное обеспечение, В руководстве ошибка
 
Цитата
Значения параметров функций

54 BUYDEPO NUMERIC Гарантийное обеспечение продавца
55 SELLDEPO NUMERIC Гарантийное обеспечение покупателя
getParamEx
 
Код
Price = tonumber(getParamEx('FUTSPREAD', 'RIM7RIU7', 'last').param_value)
message(tostring(Price))
--> 0

Вопрос к разработчикам:
Вы можете предложить надёжный способ убедиться, что getParamEx даёт действительно последнюю цену инструмента, а не её отсутствие?
Самопроизвольная остановка Lua-скриптов, при замене инструментов с истекающим сроком обращения
 
При замене инструментов с истекающим сроком обращения останавливаются Lua-скрипты.
Почему так происходит?
OnStop
 
Это верно, что во время работы колбэка OnStop работа потока main приостанавливается?
Кроме того, скрипту даётся время на завершение работы, которое отсчитывается не по окончании OnStop (как это показано на вашей схеме), а от начала работы функции OnStop. Т.о., схема должна выглядеть так:
Скрытый текст
getDataSourceInfo
 
Предлагаю модифицировать функцию getDataSourceInfo: добавить необязательный параметр: STRING Tag и сделать функцию доступной как в индикаторах так и в обычных скриптах.
При задании параметра функция будет возвращать параметры графика с идентификатором Tag.
ParamRequest и CreateDataSource не заказывают получение параметров Таблицы текущих торгов
 
Если в настройках получения данных стоит галка "Исходя из настроек открытых пользователем таблиц", то ни ParamRequest ни CreateDataSource не могут заказать получение параметров Таблицы текущих торгов с сервера. При этом они радостно сигнализируют об успехе.
Нужно изменить такое поведение.
setmetatable
 
Код
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: возвращать она должна раннее сохранённое значение, независимо от переданного аргумента при повторном вызове.
AddColumn
 
Цитата
width – ширина в условных единицах.
Что это за условные единицы такие? Они привязаны к шрифту? Если да, то каким образом?
Сделки с вечерней сессии FORTS
 
Здравствуйте.

Как в коде определить, относится ли вечерняя сделка к текущей торговой сессии?
Редактирование настроек при добавлении индикатора
 
Куда пропало окно с настройками при первичном добавлении индикатора?
getFuturesHolding()
 
Скрытый текст

Может ли в таблице "futures_client_holding" с одним набором firmid, trdaccid, sec_code быть несколько строк с разными типами лимита type?
Рассчитать среднюю стоимость позиции
 
Если рассчитывать среднюю стоимость позиции по прошедшим сделкам, возникает вопрос:
Может ли колбэк по сделке прийти позже колбэка OnDepoLimit или OnFuturesClientHolding?
Почему скрипты в QUIK выполняются дольше
 
В среде 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 логических процессора.
Копирование значения ячейки в таблице
 
Добрый день.
Добавьте пункт меню "Копировать ячейку" (для копирования кодов бумаг, ISIN и пр.)
Фильтр по кодам клиентов, Доступ к фильтру из QLua
 
Добрый день.
Предлагаю дать доступ на чтение к фильтру по кодам клиентов из QLua и, соответственно, добавить колбэк при изменении этого поля.
Будет полезно для брокеров и управляющих.
SearchItems
 
Добавьте в функцию параметр, задающий количество совпадений, после которых прекращать поиск. А то если нужно циклически пройтись по таблице для поиска всего одного значения, то занимает слишком много времени.
OnFuturesClientHolding, session_status
 
Добрый день.

Подскажите, по какой причине во время основной сессии (в 14:16) параметр session_status может иметь значение 3?
Страницы: 1 2 3 След.
Наверх