Nikolay написал: Ну, у окна доступные скрипты до сих пор нельзя изменить размер, древнейшая кодировка ANSI - и это не критически важная часть, явно только клиент. А Вы на святое замахнулись, сервер.
Это да, на эту проблему "ваше пожелание принято" не так давно отпраздновало десятилетний юбилей. Но все же предлагаю добавить параметры сделок для каждой свечи любого интервала.
Sergey Gorokhov написал: Это не так. Cвечи формирует сервер QUIK, а не биржа. Но свечи формируются по сделкам полученным с биржи.
Если я правильно понимаю, свечи формируются из тиковой базы сделок. Так в чем проблема передавать в свечи не только те кастрированные параметры которые придумали японцы сто лет назад? Там ведь добавить всего ничего.
Подскажите возможно ли каким-то образом получение данных для свечи с интервалом от 1 мин или более с разбивкой объема сделок V на "покупка" и "продажа" как это сделано в ленте сделок? Выбирать это из тиковой базы уж очень затратно по ресурсам, особенно если не по одному инструменту.
nikolz написал: на самом деле это не так реально это не поможет экономить деньги. Так как комиссия брокера остается, а она всегда существенно больше биржевой. Если заявка не пассивная, то она просто отклоняется и правило это лишь к лимитированным заявкам.
Я тут пользую визуальный индикатор работы скрипта который показывает его замедление или затык при выполнении. Веселенький такой крутилок в крайней ячейке таблицы. Может кому пригодится. С Новым Годом!
Код
function cyrcle(c) -- крутилок
local t=os.time()
if c=="|" then
return "/", t
elseif c=="/" then
return "--", t
elseif c=="--" then
return "\\", t
elseif c=="\\" then
return "|", t
else
return "" ,t
end
end
-- Пример (цветовые функции здесь не привожу)
go,gt="",0
...
...
function main()
is_run=true
...
while is_run do
go,gt=cyrcle(go)
...
...
...
...
SetCell(kt_id,x,y,go) -- вывод в ячейку таблицы
--раскраска крутилка
if go=="/" or go=="\\" then
color(x,y,kt_id,"Lemon")
else
color(x,y,kt_id,"Salad")
end
if os.time()-gt>60 then color(x,y,kt_id,"Red") end
...
sleep(50)
end
end
Ваши пожелания зарегистрированы. Мы постараемся рассмотреть их и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожеланий в будущих версиях ПО.
Есть одна тонкая разница между подпиской и открытой таблицей. При подписке тиковые данные начинают тянуть историю после запуска скрипта c подпиской. При открытой таблице в работающем терминале скрипт просто получает сразу готовую тиковую базу. Я держу и открытую таблицу и подписываю скрипт.
Ну сделайте наконец возможность изменения размера окна "Доступные скрипты"! Достало уже забавляться целый день прокруткой после изменения шрифтов. У вас что, все экраны 15 дюймов ?
Заодно поставьте уже кнопку запуска этого окна рядом с веселиньким паровозиком.
Известная фича. Каждый фильтрует по своему. У меня проблема была забыта после того, как поставил условие что каждый trade_num должен быть больше предыдущего.
А с чего вы взяли, что этот параметр обязательный? Ответ на транзакцию вы получаете от сервера брокера. Если он настроил его так, что поле ACCOUNT необходимо для обработки, то оно обязано быть. Точно так же как, допустим, в таблице текущих торгов моего брокера нет поля с датой дивотсечки, а в альфе есть. В этой ситуации смысла наезжать на разработчиков никакого нет. Вот если бы этот параметр требовал ваш терминал перед отправкой на сервер то он был было обязательным. В общем смысла поднимать фоновый шум в данной ситуации нет.
nikolz написал: В квике можно создавать сколько угодно потоков При этом надо использовать общий глобальный стек. В нем решены проблемы синхронизации для main и для любых других. ---------------- я приводил пример с пулом потоков Использовал его для обработки колбеков по 200 инструментов. в итоге максимальное количество потоков которые были открыты пулом составило 12. Никаких проблем с синхронизацией не было.
Спасибо, посмотрю. Однако сейчас уже это не совсем актуально поскольку каждый скрипт и есть отдельный поток, а переменные между скриптами можно передавать через общее пространство переменных. Жаль только что нет возможности запускать дерево скриптов.
Kolossi написал: Как и повода жаловаться на SetUpdateCallback.
Хотите сказать - у Вас описываемого мной косяка разрабов не наблюдается ?
Нет не наблюдается. Просто может быть потому что я сразу подстраховался и забил. Жалко времени на это тратить. Реальная функция из скрипта, была написана на ранних версиях квика и с тех пор не трогалась:
Код
function GetDS(p) -- функция закачки данных
local error_desc=""
if p==1 then -- дневные
...
elseif p==2 then -- тиковые
dsa,error_desc=CreateDataSource(p_classcode, trw.p_seccode, INTERVAL_TICK)
while not dsa or dsa:Size()==0 do
local n=100
while n>0 do
sleep(100)
if dsa and dsa:Size()>0 then break end
n=n-1
end
if not dsa or dsa:Size()==0 then
dsa,error_desc=CreateDataSource(p_classcode, trw.p_seccode, INTERVAL_TICK) -- повтор
end
if error_desc~=nil and error_desc~="" then
message("TICK, "..p_classcode.."/"..trw.p_seccode.."/".."Source2 error==>" .. error_desc)
return 0
end
end
dsa:SetEmptyCallback()
return dsa:Size()
else
return 0
end
end
Полагаю счетчик и повтор решили возможную проблему.
Nikolay написал: Не лучшее решение, оно блокирует исполнение кода. Запросы где время ответа неизвестно, лучше решать через очереди задач ожидания. Потоков в lua нет, но, как минимум, не блокировать весь код. Если, например, скрипт обрабатывает много инструментов и потоков данных, то ждать после каждого заказа - много времени пройдет пока до последнего дойдет. Или надо что-то другое постоянно контролировать, пока по другому инструменту заказ сделали. То что долго идет ответ - это не повод для уже работающих инструментов ждать.
Не от хорошей жизни, данные не всегда успевают. Поскольку, как вы заметили, потоков в луа нет, пришлось на каждый инструмент(тикер) сделать по скрипту. Ну а в отдельном скрипте без базы никаких задач нет. К стати, пока ни при какой нагрузке ожидание начала загрузки больше секунды-двух не встретил, а базы подгружается в основном либо при запуске, либо на открытии сессии. Как и повода жаловаться на SetUpdateCallback. Хотя в основном как колбэк используется OnAllTrade, база больше для расчетов.
Специальной нет. Вообще то реконнект оформляется в меню квика. Но при желании можно оформить скрипт нажимающий кнопки в окне соединения после дисконекта.
Вы серьезно это предлагаете? Вычисления с точностью +/- 20% ? Спасибо, не надо ))
Относительно Вашего утверждения о точности +-20% , оно голословное. --------------------------------- Если нет, то покажите результаты теста и я с Вами соглашусь.
nikolz, если вы возьмете последние пять 1-минутных свечей и будете в них что-нибудь считать, то начале текущей минуты общее расчетное время будет чуть более четырех минут, а в конце чуть менее пяти. Вы не по верите, но это разница в 20% общего расчетного времени. Заметьте, я очень сдержан и терпелив )
Так совершение сделки "по рынку" - это по сути такое же выставление заявки на покупку к примеру, просто сразу совпадающее с предложением. Навряд ли это где то это отдельно фиксируется.
Это фиксируется в ленте сделок. В сделке всегда одна часть по рынку другая лимитная, по другому не получится. И если лимитная стояла на продажу то сделка маркируется как "покупка" и наоборот. На практике, если например стадо трейдеров начинают хватать бумагу как караси перловку, то в ленте резко подскакивает частота сделок "покупка". Т.е. в большей части сделок лимитная часть на продажу, а рыночная на покупку.
Quikos, если я поставлю заявку на покупку и она в итоге сработает, а потом куплю выставленную кем-то на продажу, т.е. совершу две покупки - одну лимитную, одну по рынку, то в ленте сделок эти две сделки будут обозначены одна как "покупка" другая как "продажа". Потому что в любой сделке присутствует и покупка и продажа в равных долях, а в ленте отражается та часть сделки которая "по рынку". Как-то так.
Kolossi написал: Тут не соглашусь. Я практически не пользуюсь индикаторами после десятка лет экспериментов. Не буду сейчас освещать причины. Но использую ряд параметров которые делают расчет "от текущего времени назад" Например "изменение объема за последние пять минут" или "скорость изменения спроса/предложения за последний час. Для этого не подходят пятиминутные или часовые свечи. Повторю свой вопрос: как узнать что тиковая база получила все исторические данные и идет прием текущих. По первому onAllTrade?
Полагаю, что решить Вашу задачу для оценки изменения параметров на интервале в 5 минут вполне хватило бы и 1 минутных свечей.
Вы серьезно это предлагаете? Вычисления с точностью +/- 20% ? Спасибо, не надо )) Но. Если мне еще расскажете как получить значение количества сделок "по рынку" не используя ленту сделок я обещаю подумать.
P.S. Только про начинающих и циклы притормозите, перебор слегка.
nikolz написал: но с тиками проблема в том, что они уж точно придут пакетом сразу куча сделок и все в один текущий момент физически терминал будет перелопачивать "вчерашний день", так как куча сделок уже прошла. Полагаю что тики как правило пытаются использовать начинающие, но реально они имеют ценность лишь в HFT и в дата центре и скорее всего не в терминале КВИК.
Тут не соглашусь. Я не практически не пользуюсь индикаторами после десятка лет экспериментов. Не буду сейчас освещать причины. Но использую ряд параметров которые делают расчет "от текущего времени назад" Например "изменение объема за последние пять минут" или "скорость изменения спроса/предложения за последний час. Для этого не подходят пятиминутные или часовые свечи. Повторю свой вопрос: как узнать что тиковая база получила все исторические данные и идет прием текущих. По первому onAllTrade?
Nikolay написал: Если выведете данные по переменной _G.INTERVAL_M1, то будет видно, что тип число, значение 1. В qlua много таких глобальных переменных ввели.
Можно даже просто вывести все, что есть в _G через pairs. Будут видны даже недокументированные.
Ну если все так просто, то можно было бы ставить 1 в параметр. Но нет.
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
Интересно, если CreateDataSource получает, к примеру, часовую свечу с временем текущего часа равной текущему часу сервера, можно ли считать что загрузка завершена?
Владимир написал: Kolossi, Кому как. Мне, например, для торговли только Lua и нужен. А тема здесь направлена на потенциальное изменение софта Квика. НЕ НАДО ЭТОГО ДЕЛАТЬ!!!
Как обычно на любом форуме есть человек постоянно лезущий в любую тему "со своим единственно правильным мнением" не обращая внимание на то, что оно никого не интересует. Давайте не будем засорять ветку.
Владимир,я имел ввиду закрытие терминала после его зависания и последующий запуск. А с сохранением жизненно важных переменных и таблиц у меня давно все отлажено.
В итоге я считаю, что отсутствие меток на графике при наличии их параметров в системе в подобной ситуации является багом и подлежит рассмотрению и исправлению в ближайших версиях квика. Но похоже так считаю только я (
Nikolay написал: А метки да, исчезают. Как я понимаю из-за ошибки создания дампа состояния при падении. Приходится хранить параметры метки в файле состояния скрипта. Впрочем, я предпочитаю все хранить независимо, чтобы всегда иметь возможность при перезапуске проверить и выявить все различия.
Там есть еще один прикол - после выпада в дамп и последующего запуска GetLabelParams возвращает параметры метки, хотя на графике ее нет. Приходится их по одной удалять их по возвращаемому uid и создавать с новым из сохраненных параметров.
Столкнулся с тем, что после аварийного выхода из терминала при его зависании по сторонней причине, исчезают все метки добавленные при помощи функции AddLabel после последнего запуска скрипта. Очень неприятно и в голову ничего не пришло кроме сохранения параметров меток в файл при их создании с последующим удалением и пересозданием каждой при новом запуске. Наверное можно было бы решить эту проблему имея в lua функцию сохранения параметров терминала в файл info.wnd, но увы. Кто-то нашел решение этой проблемы?
Попутно изучая в доках функцию AddLabel на предмет что курили разработчики когда придумали использовать для параметра "Время в формате «ЧЧММСС»..." тип "NUMBER" наехал вот на такую шутку:
Код
local a="09:15:18"
local b=string.gsub(a,":","")
local c=tonumber(b)
local d=tonumber(string.gsub(a,":",""))
message(tostring(c).." "..tostring(d))
Результат: 91518 nil
Кто коллекционирует, дарю )) v.9.8.0.11, Lua 5.3.5
nikolz написал: и еще.. если торгуете неликвидом, то в качестве признака торговой сессии можно использовать опять же время и наличие заявок. Но я роботов на неликвид не делаю.
Все бы ничего, но я живу в стране где время отличается от московского и переводится на летнее/зимнее. Геморно, со статусом проще.
Владимир, у каждого свои тараканы. У меня робот должен отличать основную сессию от предторговой и постторговой на которых он тоже торгует. Поэтому статус проверяется. Естественно при помощи getparamex2 на левом тикере.
Задача, по которой был задан вопрос была в переборе класса и фильтрации инструментов по средне-дневному объему и уходу прайса от экстремального значения. При минимальных затратах ресурса на минимально требуемом железе. Как я написал, решение ее меня на данный момент устраивает. Спасибо за подробные советы.
Nikolay написал: Если настроено получение потока данных для необходимых инструментов и заданы получаемые параметры, то да. Такая настройка будет не умной, как ее называют в интерфейсе. Тогда можно не открывать ни одной таблица, ни один график. Если параметры не заданы, то можно заказать его через ParamRequest https://luaq.ru/ParamRequest.html
Если я правильно понимаю, то оформление потока это то же создание ds и включение ленты сделок. Мне же нужно после получения листинга по классу получить текущую цену для некоторых тикеров из листа. Настраивать для каждого поток для этого лишний расход ресурса который не бесконечен.
Подскажите, есть ли возможность получения цены последней сделки по инструменту запросом с сервера не занося его в таблицу текущих торгов руками и не создавая всю базу через CreateDataSource ?
Alexey Danin, К стати хотел спросить, а чем "балансовая стоимость" отличается от "цены приобретения" ? Или это одно и тоже просто таблицы делали разные разные люди со своими терминами в голове?