Kolossi написал: А как насчет получения средней цены покупки по инструменту, точнее параметра "Балансовая цена" в таблице Состояние счета?
К сожалению, средствами QLUA данную таблицу не получить.
Однако параметры данной таблицы формируются на основе позиций клиента, которые отражены в соответствующих таблицах терминала, к которым в свою очередь можно получить доступ средствами QLUA. Подробное описание полей Таблицы "Состояние счёта" находится в Руководство пользователя QUIK v.9.7zip, 14.6 МБ -> Раздел 3. Просмотр информации -> 3.5 Состояние счета.
Да не получается. Конечно я веду среднюю позиции средствами и возможностями скриптов. Как правило она совпадает с балансовой ценой, но стоит провести сделку мимо скрипта и весь результат можно кидать в помойное ведро. Поэтому возможность получать данные с этой таблицы хотелось бы иметь.
Вы же хотите узнать цену сделки, так и читайте ее из таблицы сделок. причем здесь позиция по инструментам? и где Вы в позиции увидели цену?
Ну да, с ценой сделки козе понятно. ) А как насчет получения средней цены покупки по инструменту, точнее параметра "Балансовая цена" в таблице Состояние счета?
В документации QLua в разделе: "Функции для работы с таблицами Рабочего места QUIK" ------------------- написано: ----------------- В таблицах Рабочего места QUIK, созданных с помощью скриптов на языке Lua, поддержаны следующие возможности : .. пользовательские фильтры, ... ===========================
А где там написано про фильтры на Lua? Созданная на Lua таблица поддерживает установку пользовательских фильтров. Капризничаете. Дай вам волю так вы потребуете возможность убрать столбец с нумерацией и привязку таблицы к конкретному окну. Много вас таких, а разработчики серьезными делами заняты )))
nikolz написал: В друг откуда ни возьмись появилось...
в вызове функции NUMBER AddColumn (NUMBER t_id, NUMBER iCode, STRING name, BOOLEAN is_default, NUMBER par_type, NUMBER width) в примере документации (приложение 1) появляется функция формата: t:AddColumn("test1", QTABLE_INT_TYPE, 10, format1 ) --------------- Предупреждать надо.
Это откуда дровишки? В документации LUA в файловом архиве и в файлах последней версии на arqatech.com/ru такого нет.
Nikolay написал: OnQuote - это и есть доступный колбек. Объявленная глобально такая функция будет вызываться на каждый чих в стакане. Т.к. таких изменение очень, очень много, и на каждое изменение вызывается с, то память и забивается, т.к. getQuoteLevel2 возвращает две таблицы, две строки. А это не так и мало. И делается это так часто, что сборщик мусора просто не успевает.
Если Вам не нужны данные стакана в каждом срезе без пропусков, то в колбеке надо просто установить флаг, что есть новый стакан по инструменту, а в потоке main его прочитать.
Пардон, невнятно выразился. Полагаю что проблема не в OnQuote, в этом легко убедится убрав из функции getQuoteLevel2.
Описание проблемы: В случае прикрепления графика якорем к таблице текущих торгов функция AddLabel лепит метку согласно только идентификатору в текущий на графике инструмент. T.е. метка о сделке по любому тикеру выставляется в текущее окно графика. В итоге в одном окне мешанина из меток разнообразных инструментов, а при переключения на нужные они отсутствуют. В настоящее время способов автоматически правильно разносить метки на графики соответствующих тикеров нет. Единственный вариант какой я придумал - вручную открывать нужное окно и запускать скрипт который перебирает список UIDов меток относящихся к этому тикеру, поштучно удаляет ее и выставляет заново с другим uid что бы она появилась на текущем графике. Замечу, что метки покупки/продажи выставляемые самим Квиком попадают в окно нужного инструмента автоматически.
Предложение:
1. Доработать функцию AddLabel возможностью выставлять метку на график в соответствии с параметром "тикер инструмента". При отсутствии параметра пусть лепит в текущее окно.
или
2. Дать возможность позиционировать средствами qlua указатель в таблице текущих торгов на нужный тикер с тем что бы текущий график переключился на нужный инструмент. Тут наверное придется создать еще функцию получения текущей позиции укозателя.
Прошу рассмотреть данные предложения. Обязуюсь честно напоминать о них ежегодно )
А что, пожелания теперь не рассматриваются и не регистрируются?
Описание проблемы: В случае прикрепления графика якорем к таблице текущих торгов функция AddLabel лепит метку согласно только идентификатору в текущий на графике инструмент. T.е. метка о сделке по любому тикеру выставляется в текущее окно графика. В итоге в одном окне мешанина из меток разнообразных инструментов, а при переключения на нужные они отсутствуют. В настоящее время способов автоматически правильно разносить метки на графики соответствующих тикеров нет. Единственный вариант какой я придумал - вручную открывать нужное окно и запускать скрипт который перебирает список UIDов меток относящихся к этому тикеру, поштучно удаляет ее и выставляет заново с другим uid что бы она появилась на текущем графике. Замечу, что метки покупки/продажи выставляемые самим Квиком попадают в окно нужного инструмента автоматически.
Предложение:
1. Доработать функцию AddLabel возможностью выставлять метку на график в соответствии с параметром "тикер инструмента". При отсутствии параметра пусть лепит в текущее окно.
или
2. Дать возможность позиционировать средствами qlua указатель в таблице текущих торгов на нужный тикер с тем что бы текущий график переключился на нужный инструмент. Тут наверное придется создать еще функцию получения текущей позиции укозателя.
Прошу рассмотреть данные предложения. Обязуюсь честно напоминать о них ежегодно )
Kolossi написал: Я сохраняю UIDы меток выставленным скриптами в файл и потом если надо удаляю поштучно. Это полезно еще при необходимосте перезапуска метки в случае прочих косяков.
Я имел ввиду вариант удаления меток не при закрытии Квика, а при повторном запуске. К стати в приведенном коде OnDestroy() если в цикле for ... поставить явно
local res=DelLabel(Settings.tag, Labels[i]) message(tostring(res).."/"..Settings.tag.."/"..tostring(Labels[i]))
Я сохраняю UIDы меток выставленным скриптами в файл и потом если надо удаляю поштучно. Это полезно еще при необходимосте перезапуска метки в случае прочих косяков.
Старатель, это я к тому, что в ответ на предложение сделать привязку метки к тикеру мне саппорт посоветовал убрать галочку напротив пункта "Оставлять трендовые линии, фигуры и метки при смене инструмента". После чего бардак с метками на графике успешно превращается в полный бардак.
Предлагаем в настройках графика в левом выпадающем списке в пункте "Диаграмма" убрать галочку напротив пункта "Оставлять трендовые линии, фигуры и метки при смене инструмента" и нажать "Применить".
Даниил, все таки помогите пожалуйста разобраться убогому чем это Вот убрал я эту галочку. График привязан якорем к таблице текущих торгов, стоит идентификатор "RZ". В таблице текущих торгов выбран Газпром. В это время в скрипте срабатывает заявка по инструменту Сбербанк и скрипт выставляет метку с ценой и временем в график с идентификатором "RZ". Куда она выставляется? При переключении графика на Сбербанк метки нет. На графике Газпрома ее тоже нет. Но в системе по uid она находится.
Предлагаем в настройках графика в левом выпадающем списке в пункте "Диаграмма" убрать галочку напротив пункта "Оставлять трендовые линии, фигуры и метки при смене инструмента" и нажать "Применить".
Ага, заработало, спасибо. Тогда подскажите еще галочку что бы из меню правой клавиши при наведении на метку созданную средствами qlua при выборе "удалить" удалялачь одна метка а не все.
господа, если вы сделали в последних версиях якорь позволяющий привязывать к окну графика тикеры таблицы текущих торгов, то может быть пора обратить внимание на то, что метка привязывается только к идентификатору графика. В итоге на графике полная мешанина из меток при переключении текущего инструмента. Прошу рассмотреть возможность дополнительной привязки меток к тикеру инструмента что бы при переключении графика на нем оставались только метни касающиеся этого инструмента.
PS Знаю, сейчас мне покажут ссылку, где такое предложение одобрено разработчиками много лет назад и однажды будет реализовано. )) Но все же
Если в окне сообщений поставить фильтр по типу сообщения (там их три) то можно оставить только messages скрипта
Пример для звука:
Код
w32 = require("w32")
function main()
is_run=true
while is_run do
PlaySoundFile("c:\\QUIK_VTB_85\\MessTrader.wav")
is_run=false
sleep(500)
end
end
function OnStop()
is_run = false
end
-- функция проигрывания файла
-- вызов: PlaySoundFile("имя файла")
function PlaySoundFile(file_name)
w32.mciSendString("CLOSE QUIK_MP3")
w32.mciSendString("OPEN \"" .. file_name .. "\" TYPE MpegVideo ALIAS QUIK_MP3")
w32.mciSendString("PLAY QUIK_MP3 ")
end
--------------------- Могу предложить следующий алгоритм. общее число сделок берете из объема. Если свеча закрылась ниже открытия то на продажу было больше чем на покупку. По расстоянию от открытия до закрытия можете судить существенно больше или нет. ---------------------------- Считать по обезличенным сделкам можно, но бесполезно для торговли. ------------------------------- Приведенный мною алгоритм соответствует теории японских свечей, которая работает на практике. ---------------------- Учите теорию.
Сражен глубиной мысли и математическими познаниями. Мастера хрустального шара нервно икают
Отличный костыль. Только после старта main() нужно давать очень приличную задержку что бы окно открылось там где надо при перезапуске квика. Особенно если такой скрипт не один.
А что-то мы в текущем году это пожелание еще не регистрировали )
При подаче и обработке лимитных заявок давно использую простую последовательность:
sendTransaction(...)( задание TRANS_ID) --> OnTransReply(...)(получение номера заявки order_num )-->OnTrade(...)(обработка исполнения заявки с номером order_num) Функцию OnOrder() тут не использую благо до сих пор не было необходимости.
Попытка сделать подобную схему для стоп-заявки типа тэйк-профит поставила в тупик - полученный от OnTransReply при выставлении стоп-заявки order_num бесполезен т.к. после срабатывания условий тэйка сервером выставляется новая заявка с новым номером order_num который нужно как-то отфильтровать и получить.
Прошу у знатоков совета по оформлению последовательности функций обратного вызова для этого типа заявок.
Наверное я не точно сформулировал вопрос разработчикам и по этому не вижу ответа. Вопрос: Почему после закрытия пользовательской таблицы (см. пример) функцией DestroyTable(skt_id), функция IsWindowClosed(skt_id) считает что окно таблицы по прежнему открыто?
Вася, это только начало длинного пути в который мы посланы разработчиками очень давно. Не только с проблемой открытия таблицы в нужной вкладке, но и той что при перезапуске квика любая таблица открывается в последней открытой вкладке вместо нужной. Скоро отпразднуем 10-летний юбилей регистрации этих предложений.
Огромное спасибо Sverg и еще ребятам за то, что помогли частично закрыть эти проблемы. Ниже функция которую я использую. Требуется библиотека w32
Код
function OpenTable(Name,kid,pos) -- функция открытия таблицы (kid) с координатами (pos) в нужной вкладке (Name)
local mmes=""
local hQuikWnd = GetQuikMainWindowHandle() -- handle главного окна QUIK
local hTabWnd = 0 -- handle окна вкладок
if hQuikWnd > 0 then
hTabWnd = w32.FindWindowEx(hQuikWnd, 0, "SysTabControl32", "")
if hTabWnd ~= 0 and not w32.IsWindowVisible(hTabWnd) then -- отображение вкладок отключено
hTabWnd = 0
end
end
if hTabWnd > 0 then -- вкладки в терминале отображаются
local prevIdx = w32.TabCtrl_GetCurFocus(hTabWnd) -- индекс текущей активной вкладки
local idxGr = w32.TabCtrl_GetItemIndexByText(hTabWnd, Name) -- индекс заданной вкладки
if idxGr >= 0 then -- вкладка найдена
w32.TabCtrl_SetCurFocus(hTabWnd, idxGr) -- переключение на найденную вкладку
local txt = w32.TabCtrl_GetItemText(hTabWnd) -- название текущей активной вкладки
mmes=" Вкладка " .. tostring(txt)
CreateWindow(kid)
SetWindowPos(kid, pos.a, pos.b, pos.c, pos.d)
w32.TabCtrl_SetCurFocus(hTabWnd, prevIdx) -- назад на исходную вкладку
else
CreateWindow(kid)
SetWindowPos(kid, pos.a, pos.b, pos.c, pos.d)
local txt = w32.TabCtrl_GetItemText(hTabWnd)
mmes=" Вкладка не найдена. Текущая" .. tostring(txt)
end
else -- вкладки не отображены, открываем в текущей
CreateWindow(kid)
SetWindowPos(kid, pos.a, pos.b, pos.c, pos.d)
mmes=" Вкладка текущая"
end
return mmes
end
Почему-то в девятке возвращаемое значение getPortfolioInfoEx(...,2).all_assets абсолютно не соответствует значению соответствующего поля ТекСредства таблицы Клиентский портфель. В восьмерке такого не было (
Kolossi написал: Доброго дня всем. Споткнулся на попытке запустить Quik Android X. Не устанавливается соединение с сервером webquik.vtb.ru. С браузера на компе вебквик с этим логином и паролем работает. Попробовал достучатся до этого сервера с браузера смартфона - до формы входа дело не доходит, отлуп по таймауту. Сменил браузер - та же байда, другие сайты открываются нормально. Понятно, что что-то в настройках андроида. Может быть кто-то уже по этим граблям пробежался и подскажет где копать?
Вроде разобрался. В браузере был выключен ssl и битая версия webquik была взята с GetsApp
Доброго дня всем. Споткнулся на попытке запустить Quik Android X. Не устанавливается соединение с сервером webquik.vtb.ru. С браузера на компе вебквик с этим логином и паролем работает. Попробовал достучатся до этого сервера с браузера смартфона - до формы входа дело не доходит, отлуп по таймауту. Сменил браузер - та же байда, другие сайты открываются нормально. Понятно, что что-то в настройках андроида. Может быть кто-то уже по этим граблям пробежался и подскажет где копать?
Sergey Hlynovskii написал: Здравствуйте Kolossi, Проверьте, пожалуйста, в тот момент, когда Вы наблюдаете данную картину в таблице алго-заявок, видны ли биржевые инструменты в списке доступных инструментов или нет?
Точно так же c облигациями - пока после открытия не прошла хотя бы одна сделка last возвращает 0 и цена последней сделки в таблице текущих торгов стоит нулевая.
А можно узнать у уважаемых разработчиков по какой причине в таблице алгоритмических заявок утром до начала торгов по каждой заявке пустое поле "Инструмент сокр."? Какой смысл тогда заполнения остальных полей этой таблицы в это время?
Был косяк в версии 8.11.0.66, в 8.12 был исправлен Так что либо обновиться, либо (если не желаете обновляться) перед закрытием программы, отключитесь и подключитесь к серверу заново, тогда настройки котировок сохранятся.
Спасибо. Потрясу бубном пока брокер не обновит версию.
Я чего-то недопонимаю в логике настроек переноса заказа данных в настройки (?). Стоял фильтр заказа котировок. Снимаю галочку "фильтр инструмента" класса в /Программа/Получение данных/Котировки и уверен что все хорошо. Однако при следующем входе галка на месте. Ручное сохранение настроек эффекта не дает. Версия 8.11
Артем написал: Kolossi, это неважно - размер датасорца меняется в момент завершения загрузки данных. При работе с колбеками тоже неважно - они явно указывают какая свеча была загружена.
Те вы утверждаете, что ds(Size) будет отличен от нуля только после завершения загрузки?
Подскажите, есть ли возможность получить с сервера в свою таблицу список ВСЕХ тикеров по конкретному классу? Типа той которая используется в таблицах квика для настройки фильтров и тп.
Как много ответов от умных людей. Читал, много думал.)) Может быть все можно будет сделать гораздо проще, если кто-нибудь скажет правду: c какой свечи CreateDataSource начинает грузить данные - с нулевой или с последней?
Артем написал: QUIK в этом плане ничем не отличается от обычного программирования - изо всех модулей и файлов допустимо иметь ровно один бесконечный цикл, тот который в main(). Все остальные модули должны работать по вызову и должны возвращать управление обратно в main. В Lua можно имитировать многопоточность с помощью сопрограмм ("coroutine").
Антон, НО в квике же это реализовано!!! Мы же вручную можем запустить несколько файлов(скриптов), и они могут работать параллельно!! Я только это имею ввиду, мне не надо распараллеливать задачи по процессорам, только лишь обратиться к ответственному за запуск модулю квика из своего скрипта передав ему путь и имя файла со скриптом, который я хотел бы запустить, точно так же как я это делаю через таблицу доступных скриптов. И запускай хоть с main,хоть с бесконечным циклом. Вот в чем задача.
Поддержу Юрия. Мне бы тоже хотелось запускать все свои скрипты при помощи одного. Как это делается в операционках при помощи .bat или .sh файлов. Однако я полагаю такая мечта несбыточна. Может быть в следующих версиях мы увидим еще перенос какого-то параметра из одного пункта меню, однако полагаю что мне уже не увидеть даже иконки окна скриптов на панели или привязку пользовательской таблицы к вкладке. Жизнь коротка (