Evgeniy Karnaukhov написал: так как строка уже удалена и не найдена, она будет добавлена вновь.
Зачем?
Цитата
Evgeniy Karnaukhov написал: Проблема вызвана тем, что работа с таблицей в скрипте осуществляется из разных потоков без синхронизации.
Можете предложить рабочий пример? Такой вариант тоже не работает:
Код
function OnAllTrade()
if not run then return end
alltrade = true
for i = 1, rows do
table.ssort({0, 0}, function()
DeleteRow(id, 1)
InsertRow(id, rows)
return true
end)
end
end
Надо делать так, как надо. А как не надо - делать не надо.
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 строка. Первая строка становится недоступна для редактирования.
Anna Lozenko, уже почти неделя прошла. Прошло несколько клирингов. Думаю, после расширения лимитов в следующий клиринг ситуация исправляется, но точно не скажу, т.к. не отслеживал данную ситуацию.
Надо делать так, как надо. А как не надо - делать не надо.
Дубль 2 После расширения планок в результате стоп-торгов в поле ввода заявки не рассчитывается максимальное возможное количество лотов по ценам выше/ниже каких-то (непонятных) границ (и эти границы не связаны с макс./мин. возможной ценой инструмента). Так, в раннее описываемом случае для цены 23,01 количество рассчитывалось, для цены 23,00 не рассчитывалось, в то время, как текущая цена была в районе 19,5. Данный bug вы также можете наблюдать на своём игровом сервере.
Надо делать так, как надо. А как не надо - делать не надо.
Sergey Gorokhov написал: в представленном коде SEC_PRICE_STEP используется в математических операциях, так что проблема точно не с ним, а с тем что в результате попадает в tostring
в tostring как раз попадает float из-за возвращаемого значения в getParamEx.
Цитата
Sergey Gorokhov написал: Но стоит поменять инструмент на любой другой в котором дробный шаг цены и ошибка опять бы появилась.
Какая ошибка будет для инструмента с дробным шагом цены?
Цитата
Sergey Gorokhov написал: По этому правильно форматировать то что попадает непосредственно в параметры транзакции, а не то что было до этого.
Правильно всё же работать с правильными значениями. Так, для целочисленных вычислений все входящие параметры необходимо привести к integer. Не после, а до вычислений!
Скрытый текст
Конечно, это не отменяет того факта, что если price, подающийся на вход в sendTransaction получен в результате вычислений, предполагающих некратность шагу цены, его необходимо привести к шагу цены инструмента. И в этом случае нужен не string.format
В данном случае проблема именно в самом QUIK. Так, например, getParamEx(CLASS_CODE,SEC_CODE,"BID").param_value даст вам значение, которое вы не сможете подать в sendTransaction без лишних вычислений.
Надо делать так, как надо. А как не надо - делать не надо.
Sergey Gorokhov, Так проблема в самом QUIK, который в getParamEx возвращает строку с дробной частью: "1.000000" вместо "1", а на входе в sendTransaction для того же инструмента требует строку без разделителя.
Надо делать так, как надо. А как не надо - делать не надо.
Именно в процессе работы. Списки сбрасываются при загрузке настроек из *.wnd при установленном соединении с сервером. При перезапуске Квика соединение ещё не установлено.
Надо делать так, как надо. А как не надо - делать не надо.
for i, bumaga in pairs(sec_code) do
LowDnya = getParamEx (class_code, bumaga, "LOW").param_value
Last = getParamEx (class_code, bumaga, "LAST").param_value
Raznica = math.abs(LowDnya - Last)
if Raznica > 1 then
message(tostring(bumaga .. " " .. Raznica ))
sec_code[i] = nil
end
end
Вариант 2:
Код
for i = #sec_code, 1, -1 do
local bumaga = sec_code[i]
LowDnya = getParamEx (class_code, bumaga, "LOW").param_value
Last = getParamEx (class_code, bumaga, "LAST").param_value
Raznica = math.abs(LowDnya - Last)
if Raznica > 1 then
message(tostring(bumaga .. " " .. Raznica ))
table.remove(sec_code, i)
end
end
Надо делать так, как надо. А как не надо - делать не надо.
Anton написал: при переподписке квик будет получать тот же самый мэппинг без выгрузки/загрузки всего и вся, т.е. вхолостую, это уменьшит накладные расходы
Тест проводился на виртуальном диске в ОЗУ. Т.ч., не могу подтвердить или опровергнуть ваше предположение.
Надо делать так, как надо. А как не надо - делать не надо.
Sergey Gorokhov написал: описанного поведения НЕ должно быть вообще. Вы описываете проблему с которой надо разобраться. И только если вдруг после разбора окажется что так и должно быть тогда да, будет пожелание. Сейчас это больше выглядит как баг, а не отсутствие функционала.
Что в итоге? Так и должно быть или баг?
Надо делать так, как надо. А как не надо - делать не надо.
Появилось немного времени, решил потестить. При при пустом alltrade.dat заказ обезличенных сделок по классу EQOB (1393 бумаги) занимает 5 сек, при заполненном alltrade.dat (в конце торгов) 30 мин! Это на быстром диске, на HDD такое делать в середине-конце торгов не рекомендуется )) Посмотрел, что делает в это время QUIK: при подписке на каждый инструмент идёт множественное обращение к файлу alltrade.dat, и чем больше записей есть в таблице, тем больше будет обращений к файлу. Если заказывать обезличенные сделки не скриптом, а через меню, то обращения к alltrade.dat минимальны или отсутствуют.
Надо делать так, как надо. А как не надо - делать не надо.
Latrop написал: На чем основано данное несогласие?
Захват входящих пакетов на роутере с сервера QUIK. В случае заказа сделок по всем классам без фильтров трафик значительно больше. Если ошибся, прошу сотрудников Арки прокомментировать.
Цитата
Latrop написал: Что по доработкам потока обезличенных сделок (тиков) скажете?
Ломать, тем более автоматику не нужно. Нужно лишь научиться не изменять список инструментов в сторону уменьшения, как указал в первом сообщении этой темы.
Надо делать так, как надо. А как не надо - делать не надо.
Latrop написал: Как удалось разобраться, если заказано получение тиков хоть одного инструмента, то на клиент льется вообще весь поток всех(!) тиков. Фильтр по отдельным инструментам никакой экономии трафика не дает
Не соглашусь, при использовании фильтров трафик уменьшается.
Надо делать так, как надо. А как не надо - делать не надо.
Latrop написал: Если заказать ParamRequest(class1, sec1, par1) и ParamRequest(class1, sec2, par2) Т.е. для разных инструментов одного и того же класса будут заказаны разные параметры.То фактически терминал что сделает?
Цитата
Latrop написал: Будет неявно заказывать оба параметра для обоих инструментов
Да. Где-то была тема на форуме. QUIK не умеет фильтровать заказанные параметры внутри класса и будет слать все заказанные явно или неявно параметры для одного класса.
Надо делать так, как надо. А как не надо - делать не надо.
Sergey Gorokhov, У вас есть событие QTABLE_CONTEXTMENU, вот и обыграйте его. Вижу два варианта:
1) По умолчанию контекстное меню не показывается. Чтобы показать, надо вызвать функцию в коде:
Код
SetTableNotificationCallback(id, function(id, msg, row, col)
if msg == QTABLE_CONTEXTMENU then
ShowContextMenu()
end
end)
2) Второй вариант прямо противоположный. По умолчанию, при срабатывании события, отображается контекстное меню. Чтобы не отображать меню, надо принудительно запретить его в коде:
Код
SetTableNotificationCallback(id, function(id, msg, row, col)
if msg == QTABLE_CONTEXTMENU then
return
end
end)
Надо делать так, как надо. А как не надо - делать не надо.
Нужно сделать операцию обновления ячеек атомарной, чтобы быть уверенным, что другой поток не изменит номер обновляемой строки. Это будет возможно после исправления ошибки?
Надо делать так, как надо. А как не надо - делать не надо.
Создаём QLua-окно, назначаем ему колбек на события QTABLE_CHAR и/или QTABLE_VKEY. Если переключиться на контрол "Edit" или "ComboBox" на панели инструментов ("Поиск инструмента", "Окно сообщений" и пр.), а затем активировать окно кликом на его заголовок, то события, назначенные раннее не работают. Чтобы заработали, нужно активировать кликом внутри окна.
Надо делать так, как надо. А как не надо - делать не надо.