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, К стати хотел спросить, а чем "балансовая стоимость" отличается от "цены приобретения" ? Или это одно и тоже просто таблицы делали разные разные люди со своими терминами в голове?
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 указатель в таблице текущих торгов на нужный тикер с тем что бы текущий график переключился на нужный инструмент. Тут наверное придется создать еще функцию получения текущей позиции укозателя.
Прошу рассмотреть данные предложения. Обязуюсь честно напоминать о них ежегодно )
А что, пожелания теперь не рассматриваются и не регистрируются?