При постановке заявок с графика в Linux/Wine все глюки пропали - и приклеивающаяся подсказка и проблемы с установкой количества лотов и дублирование формы .... сейчас все ОК, спасибо. Что-то радикально изменили ? Quick 9.5.0.42 Wine 6.23 Linux - Slackware 15.0
PSПравила: Проверьте, не был ли уже решен ваш вопрос, воспользовавшись поиском по архивному форуму.
Daniil Pozdnyakov написал: Прежде всего предлагаем выполнить рекомендации указанные в сообщении #2 данного трэда.
>опция «Исходя из настроек открытых пользователем таблиц» в пункте меню «Система» / «Настройки» / «Основные настройки» / «Программа» на вкладке «Получение данных». Нет такой (18.13.3.1)
2. Сначала нужно было ее найти :), добавить в панель инструментов. Добавил. Никакие комбинации - вкл/выкл, указать в окошке счет или выбрать <не указан> ничего не меняют - счет не подставляется, можно только выбрать вручную.
2. Сначала нужно было ее найти :), добавить в панель инструментов. Добавил. Никакие комбинации - вкл/выкл, указать в окошке счет или выбрать <не указан> ничего не меняют - счет не подставляется, можно только выбрать вручную.
3. Указал вверху/слева - ничего не изменилось, подсказака приклеена к курсору, при нажатии где-либо мышью создается вторая, третья, .... форма. А это вообще - та подсказака ? При "вверху/слева" там появляется текстовая подсказка, при указани "рядом с указателем" текстовой подсказки вобще нет, вместо этого пытается появиться всплывающая, но исчезает,
а при вводе заявки с графика всплывающая приклеена к курсору, не дает ничего сделать ...
4. Да, очень хотелось бы иметь возможность сохранять настройки в один-два клика. С отдельной опцией "без подтверждения" можно было бы вообще в один клик или Ctrl+S.
6. Еще по формам ввода - почему при попытке увеличить(уменьшить) кол-во лотов стрелкой в окно вставляется какое-то сумасшедшее число (~2 млрд)
При подаче заявки, при попытке указать торговый счет вываливается "Черный квадрат Малевича" :), сбивает с толку (в нестройках не выбран торговый счет).
При указании в настройках (Троговля) Значения по умолчанию - кол-во лотов и код клиента (всегда брать код клиента по умолчанию) : кол-во лотов подставляется, а код клинета нет.
При попытке поставить заявку с графика поверх формы выскакивает назойливая подсказка, которая не дает ничего ввести ...
Страя просьба - для того, чтобы сохранить конфигурацию приходится кликать мышью аж 4 (четыре) раза, многовато ! При частых изменениях конфигурации очень раздражает.
Почему бы не сделать два, например Ctrl+S, "Yes"
Нет горячей клавиши для создания окна Котировок с графика (только через контекстное меню, чтобы его вызвать нужно еще попасть ...)
Надеяться на Linux-версию не стоит, будем реалистами. А вот если бы разработчики учитывали пожелания тех, кто использует Linux+Wine было бы неплохо. Тем более, что все, в принципе, работает за исключением досадных мелких глюков с шрифтами, цветами и т.п. Думается это потребуети больших усилий. Может стоит откерыть на форуме отдельную ветку "Linux" ?
Ранее пожелание по автоматической "адаптации" настроек (размеры окон и т.д.) к разрешению ПК при переносе файла настроек я уже высказывал, ждем реализации ...
Николай Камынин написал: каким образом будет формироваться идентификатор по умолчанию - это определят разработчики. Например, к имени окна дописывается имя инструмента(для инструмента) , либо имя индикатора(для индикатора). ------------------------------- Важно два момента. 1) идентификатор по умолчанию устанавливается лишь в пустую позицию 2) возможность замены идентификатора из скрипта .
Я в свое время призывал при создании новой диаграммы вместо чего-то типа "Графики" и необходимости потом вручную править заголовок окна давать осмысленный заголовок (ведь добавляемый инструмент известен). И вот мы теперь имеем: "SRM6 Графики цены и объема #2". То есть код инструмента добавляется и даже порядковый номер появляется. Создаем еще окно, "SRM6 Графики цены и объема #3". "Графики цены и объема" здесь явно лишнее, достаточно было бы SRM6#2. И опят-таки, "возможность замены идентификатора из скрипта" - идентификатора какого графика ? Чтобы заменить идентификатор графика, необходимо знать идентификатор того самого графика, идентификатор которого вы хотите заменить :). Чем SRM6#2 плох ?
Николай Камынин написал: . Предлагаю сделать: 1) установку идентификатора графика по умолчанию. 2) установку идентификатора графика из скрипта. 3) чтение в скрипте списка идентификаторов на графике.
А как вы это себе представляете ? Вот открыл я два окна и в каждом график Сбера, какие идентификаторы должны получить эти два графика ? Для того, чтобы установить идентификатор графика на него надо как-то сослаться (идентифицировать), как ?
Тэг - это идентификатор конкретного графика на одной из диаграмм. Для того, чтобы "навесить" что-либо на график, нужно знать, как его идентифицировать, то есть знать его тэг.
В данном случае проверяется код класса и имя параметра если он есть. В случае несуществующего инструмента - не nil.
В каком данном случае ? Почему функция не делает элементарную проверку ? Инструмент не существует, а источник данных по нему "создается. То есть в случае простой опечатки не будет возможности обнаружить, что код по одному из инструментов не работает ...
CreateDataSource(class,sec,int) возвращает nil если задан неверный класс, однако задание несуществующего инструмента возвращает таблицу (не nil) Вместо констант INTERVAL_M? удобно указывать переменную с целыми значениями (минутами), однако функция не производит проверку и принимает любое значение.
ds: SetUpdateCallback ( function (index) cb(index,class,security) end )
Здесь не cb определяет , а мы явно передаем security. Кроме того, такой метод имеет одну крайне неприятную особенность. Вот если, например, сделать так:
то сразу будет видно, что callback в момент вызова получает не значение параметра security в момент его связывания с ds, а просто переменную security и любое ее изменение в main првиедет к измнению работы callback'a. А почему нельзя в CreateDataSource, SetUpdateCallback предусмотреть чтобы и class и security и ds были доступны cb ? Но только не переменные с такими именами, а их значения.
Vitaly Skorobogatov написал: Тема вызвала большой резонанс, поэтому чувствуем необходимость прояснить свою позицию по данному вопросу. Нам действительно не хочется продолжать поддерживать QPILE, тут секрета никакого нет. Но окончательного решения по этому вопросу не принято и тема была поднята для выяснения отношения общественности к этому вопросу. На основании Ваших ответов мы будем думать, что делать дальше. Если вскроется, что существует целый пласт задач, которые можно решить только на QPILE - решение о прекращении поддержки QPILE будет отложено на неопределенное время. До тех пор, пока существующие ограничения LUA не будут каким-то образом преодолены. Сейчас мы просто собираем информацию и благодарны за то, что ей с нами делятся.
Ситуация понятная. QPILE имеет ряд "родовых" пороков, его нужно упразднять .. Силы лучше направить на развитие и поддержку более современных/мощных средств. Lua - достойный выбор, однако к QLua постоянно всплывает ряд вопросов. Вот на этом и следует сосредоточиться. И ... документация, боже, она что, специально пишется с целью запудрить пользователям мозги и сделать использование QUIK невозможным ?
Андрей 77 написал: "В LUA нет пары тройки функций от QPILE Но в QPILE нет сотен тысяч функций LUA"
LUA - не QLUA. Трейдерам не нужны "сотни тысяч" функций Lua, им нужны десятки функций, но такие, которыми можно пользоваться,надежно реализовывать алгоритмы, а не ломать постоянно голову, что это за зверь и как его вообще можно с пользой применить ...
А чем не устраивают имеющиеся функции? Только пожалуйста давайте обсуждать конкретику а не общий случай.
Я уже писал про SearchItems, сейчас борюсь с SetUpdateCallback. Не подскажите, как из callback'a этой функции узнать, какой инструмент ее вызвал ?
"В LUA нет пары тройки функций от QPILE Но в QPILE нет сотен тысяч функций LUA"
LUA - не QLUA. Трейдерам не нужны "сотни тысяч" функций Lua, им нужны десятки функций, но такие, которыми можно пользоваться,надежно реализовывать алгоритмы, а не ломать постоянно голову, что это за зверь и как его вообще можно с пользой применить ...
Странная наблюдается закономерность. Как и в случае с SearchItems, https://forum.quik.ru/messages/forum10/message15516/topic36/#message15516 пользоваться функциями QLUA непосредственно в реальных ситуациях крайне неудобно. Всегда нужны какие-от дополнительные обертки, костыли ... Вот и SetUpdateCallback для CreateDataSource. В руководстве приведен замечательный пример, который сразу же вызывает вопросы (такие же как и в случае с SearchItems) Там функция обратного вызова содержит явное использование источника данных, который никак туда не передается. Это что же, для каждого источника писать свою функцию, даже когда нужна одинаковая стандартная обработка ? Фактически так и есть и остроумное решение https://forum.quik.ru/messages/forum10/message1689/topic233/#message1689 лишь скрывает этот факт (еще одна обертка).
С другой стороны, ds:SetUpdateCallback(ucb) эквивалентен ds.SetUpdateCallback(ds,ucb) и источник данных должен быть доступен в SetUpdateCallback через self, но тогда что мешает явно передать его ucb ?
Еще один вариант. Суть та же, но чуть попроще, чем у Михаила (я минималист :)). По сути - одна дополнительная универсальная функция, 17 строк. Работает так же, даже чуть быстрее (на 2%), правда у меня ПК в 4 раза медленнее, чем у Михаила :(
Код
-- SelectItems
-- Возвращает таблицу с номерами элементов в 'tables', удовлетворяющих
-- набору критериев вида p = { par1=val1, par2=val2, ... }
-- s - start, e - end
--
function SelectItems(tables,s,e,p)
local t,fields={},""
for key,val in pairs(p) do
fields = fields .. "," .. tostring(key)
t[#t+1] = val
end
local function fn(...)
local args = {...}
for key,val in ipairs(args) do
if t[key] ~= val then
return false
end
end
return true
end
return SearchItems(tables,s,e,fn,fields)
end
-- ---------------------------------------------------------------------
-- Пример использования SelectItems
-- ---------------------------------------------------------------------
function main()
local table,n,N,params
table = "all_trades"
n = getNumberOf(table)-1
params = {sec_code='RIM6',class_code='SPBFUT',qty=1}
N = 100
message("Selecting from "..table.." ("..n..") "..N.." times")
_start = os.clock()
for i = 1, N do
st = SelectItems(table,0,n,params)
end
_end = os.clock()
time = _end - _start
message("Found: "..#st..",time: "..string.format("%.1f",time),1)
end
Это все замечательно, но не меняет того странного обстоятельства, что вызов функции SearchItems не предполагает передачу значений параметров. Вместо написания конкретной функции fn для каждой выборки вы предлагаете использовать громоздкую новую функцию, вся задача которой - передавать значения параметров в SearchItems.
Проблема в самой реализации SearchItems. Очевидно, все определяется тем, как SearchItems вызывает fn. Нельзя ли дополнить ее таким образом, чтобы можно было передавать параметры и их значения в самой SearchItems ? Либо в виде последовательности параметров и значений (как в моем примере) либо в виде единой строки "par1=val1,par2=val2".
Так вот оно в чем дело ! Спасибо, а то я уже голову сломал :) Ну разумеется, не удивительно, что именно у метки продажи - перевернутого цветного треугольника верхний левый пиксель имеет цвет (красный), причем отличный от фона и потому прозрачность не работает. Он должен быть цвета фона или альфа.
Обнаружил ОЧЕНЬ странное поведение QUIK при обработке меток с TRANSPARENT_BACKGROUND = 1. Началось с того, что при включении прозрачности одна метка (buy - 32 bit, зеленый треугольник с альфа каналом) отображается нормально, другая (точно такой же, но красный - sell) вообще практически не отображается. Попытки пересоздать красный треугольник из зеленого к успеху не привели :(. Зато другая метка - красная стрелка размером побольше на черном фоне, прекрасно отображается с прозрачным фоном. Попытка уменьшить ее работает, но до некоторого размера, потом тоже все ломается ...
--
-- SearshTables
--
--
-- Универсальная функция обратного вызова для SearchTables.
-- Реализует проверку условий для переменного набора параметров
-- Возвращает true если удовлетворены ВСЕ условия (AND), иначе - false
--
function fn(t,...)
local arg = {...}
for k,v in ipairs(arg) do
if k % 2 == 1 then
key = v
else
val = v
if t[key] ~= val then
return false
end
end
end
return true
end
--
-- Функция поиска элементов (таблиц) удовлетворяющих набору критериев.
-- Переменное число параметров и соответствующих значенией, например :
--
-- SearchTables("trades",0,getNumberOf("trades")-1,fn,"seccode","SBER","qty",1,"price",120)
--
-- Возвращает таблицу, сожержащую сделки (таблицы) по SBER с qty=1 И price=120.
function SearchTables(tables,s,e,fn,...)
local f = {},k
local arg = {...}
k = 0
for n = s,e do
local t = getItem(tables,n)
if fn(t,...) then
k = k+1
table.insert(f,k,t)
end
end
return f
end
--
-- Пример использования SearchTables
--
function main()
st = SearchTables("trades",0,getNumberOf("trades")-1,fn,"seccode","SRM6","price",12138,"qty",1)
message("Found trades: "..#st,1)
end
В данном случае замедления не будет, а удобство налицо - fn один раз приводится для любых проверок/выборок с любым набором параметров. А раз все равно getItem используется, то такой подход дает максимальное удобство при сохранении скорости. Конечно, если понадобится другой тип выборки (например qty > 1 and qty < 10) то придется отдельную функцию писать.
"Никто не мешает в fn передавать какие нибудь параметры."
Дело даже не в значениях параметров. В приведенных примерах fn - принципиально различные функции. Одна принимает таблицу и проверяет один конкретный параметр, другая получает и проверяет три параметра.
Например, вот такая универсальная функция получает произвольное число параметров (пар имя, значение) и проверяет то, что ВСЕ они для заданной таблицы удовлетворены.
Код
function fn(t,...)
local arg = {...}
for k,v in ipairs(arg) do
if k % 2 == 1 then
key = v
else
val = v
if t[key] ~= val then
return false
end
end
end
return true
end
Пытаюсь постичь глубокий смысл этой функции. Но, что-то не получается. Примеры, приведенные в руководстве, содержат функции обратного вызова с
Код
function fn(t)
if t.qty == 103 then
или
Код
function fn(par1, par2, par3)
if par1 == 103 and par2 == “SPBFUT” and par3 == “RIM3” then
Это что же, для каждой конкретной выборки свою функцию писать !?
Хотелось бы иметь универсальную fn, а набор контролируемых параметров и их значения задавать при вызове SearchItems.
В принципе, я написал такую функцию, function SearchTables(tables,s,e,fn,...). Работает с переменным списком аргументов, а универсальная fn(t,...) выбирает таблицы, удовлетворяющие ВСЕМ условиям, например:
Код
st = SearchTables("trades",0,getNumberOf("trades")-1,fn,"price",119.35,"qty",10)
Но она использует getItem(), а как я понимаю, именно из-за слишком медленной ее работы и была создана SearchItems ...
При вызове окна редактирования таблиц отображаются списки "Доступные параметры" и "Выбранные параметры". Было бы удобнее и логичнее, если бы в Доступных отображались только те параметры, которые не были выбраны (отсутствуют в списке "Выбранные параметры").
Хотелось бы понять, какой смысл имеет, например, Приложение 1 в справках по QLUA, где используется некая "quik_table_wrapper.lua". Вместо того, чтобы показать как правильно использовать описанные в руководстве функции.
Как, на мой взгляд, должен выглядеть этот интерфейс. Во-первых, как я уже писал когда-то, иконки (красный)треугольник и (зеленый)квадрат всюду и везде означают Play и Stop, Если уж их использовать, то они должны располагаться на кнопках Запустить (треугольник) и Остановить (квадрат).
Хотелось бы иметь горячую клавишу (Ctrl-U) сразу открывающую панель "Сервисы/Луа скрипты", Подпись: "Доступные скрипты в C:\QUIK\scripts" (текущий каталог скриптов, например "C:\QUIK\scripts", его нужно сохранять независимо от других, хорошо бы здесь же менять) и ниже - перечень ИМЕН всех файлов с расширением lua (то есть без вызова доп. панели Windows, все время виснет ...), кнопку "Добавить" - удалить вообще или заменить на "Каталог". В первой колонке напротив имен - красный кружок напротив загруженных, но не запущенных скриптов (активна кнопка Запустить), зеленый - напротив работающих (активна кнопка Остановить), ничего нет напротив не загруженных скриптов - для них активна кнопка "Загрузить" (вместо Добавить).
Достаточно было бы добавить возможность назначать горячую клавишу на "Сохранить настройки в файл" и убрать раздражающий запрос на подтверждение перезаписи файла (введя обязательное создание резервной копии с возможностью ее быстрого восстановления).
В стандартной теме еще как-то видно, включен режим или нет, а в темной нет. Лучше бы сделать так, чтобы сама иконка (мишень) менялась. Впрочем, не уверен, что эта кнопка вообще нужна. Чтобы ввести заявку с диаграммы еще постараться нужно в свечку попасть ...
PS Для смены темы нужна перезагрузка приложения :(( Хорошо, что не Windows :) А что, тему сохранять/загружать невозможно, только выбрать из двух :( ?
Когда то уже поднимал эту тему, может стоит вернуться ... Иногда хочется бросить взгляд на ВСЕ графики на текущей закладке с другим интервалом. Переключать по очереди 10-15 окон, потом возвращать обратно ... !? Для изменения интервала активного окна ведь уже есть контекстное меню, зачем же дублировать, почему бы не использовать кнопку на верхней панели для задания интервала всех окон.
Правда может быть так, что различные окна открыты с различными интервалами. Хорошо бы запоминать эти величины и иметь средство быстрого восстановления (одна из опций той же кнопки).
sandyman написал: Может сразу, как в ворде - "Сохранять файл настроек каждые ... минут"? и вообще нажимать ничего не надо))
PS лично мне это не надо, я папку копирую до и после серьёзных изменений - просто предложил вариант
Это лишнее. Достаточно горячей клавиши или кнопки. А копировать папку - это отсутствие элементарного сервиса. Должно быть так: изменил что-то, клик (сохранил), изменил, клик ... oops, Ctrl-Z, ...