Нет, так сделать нельзя. Можно получить информацию только с того графика, на который этот индикатор выведен. В документации, файл "Интерпретатор языка Lua", раздел "Функции и глобальные переменные скрипта индикатора" описаны все доступные методы в индикаторе и список функций, доступных из контекста индикатора. Можно попробовать добавить метку на график с нужным текстом и считать данные. Но тогда графики должны быть уникальными.
Пользователь
Сообщений: Регистрация: 14.06.2023
05.09.2023 11:56:38
Идентификатор назначен на Price. Тоесть именно на график. Хочу сделать сделку по этому графику. Для отправки ордера на сделку нужен sec_code. Как я могу его получить? Не задавать же его вручную. Знаю что можно из таблицы заявок вытащить local sec_code = last_order.sec_code. Должен же быть способ с графика открытого получить sec_code для заявки.
Пользователь
Сообщений: Регистрация: 27.01.2017
05.09.2023 12:30:09
Цитата
написал: Идентификатор назначен на Price. Тоесть именно на график. Хочу сделать сделку по этому графику. Для отправки ордера на сделку нужен sec_code. Как я могу его получить? Не задавать же его вручную. Знаю что можно из таблицы заявок вытащить local sec_code = last_order.sec_code. Должен же быть способ с графика открытого получить sec_code для заявки.
График предоставляет данные о линиях, выведенных на него. Раз это Price, то и будет выдана информация о барах этой цены. А чья эта цена метод getCandlesByIndex (если используется он) не предоставляет.
Читать данные с графика - это самый неудачный вариант получения данных. Его разумно использовать только если алгоритм вывода линий, на основании которых строится логика, неизвестен. В остальных случая проще и, главное, быстрее, надежней, получить данные через CreateDataSource (если используются дискретные свечи) и рассчитать алгоритмом некие значения. В этом случае вся информация известна изначально.
Пользователь
Сообщений: Регистрация: 14.06.2023
05.09.2023 13:29:51
методы getItem, getParamEx, getSecurityInfo или другие. могут по идентификатору sec_code?
Пользователь
Сообщений: Регистрация: 30.01.2015
05.09.2023 13:57:08
Цитата
написал: Присвоил графику идентификатор WWWbond. Код работает. Выдает число свечек.
x = getNumCandles('WWWbond') message('x= ' ..x) Пытаюсь разными способами получить по этому идентификатору WWWbond sec_code. Никак не получается, такая возможность вообще есть?
Функция предназначена для получения информации об источнике данных для индикатора.
TABLE info getDataSourceInfo()
Функция возвращает таблицу Lua с параметрами:
ВАЖНО! Для корректной работы функции getDataSourceInfo, вызываемой из функции Init, необходимо перезапустить Рабочее место QUIK после добавления индикатора на график.
Параметр
Тип
Описание
interval
NUMBER
Текущий интервал (тайм-фрейм) графика
class_code
STRING
Код класса источника данных
sec_code
STRING
Код инструмента источника данных
param
STRING
Наименование параметра Таблицы текущих торгов, по которому строится график. Если поле пустое, то график строится на основании Таблицы обезличенных сделок
Возможные значения поля interval:
Пользователь
Сообщений: Регистрация: 14.06.2023
05.09.2023 15:23:03
.lua:5: attempt to call a nil value (global 'getDataSourceInfo') ошибку выдает
local ticker_id = "graf3"
local datasource_info = getDataSourceInfo(ticker_id)
local sec_code = datasource_info.sec_code
message("Инструмент: " .. sec_code)
getDataSourceInfo в ванильном LUA для квика есть? что не так?
Пользователь
Сообщений: Регистрация: 27.01.2017
05.09.2023 15:54:24
getDataSourceInfo выдает информацию о графике, в котором он вызывается. Т.е. есть индикатор, нанесенный на график, в нем есть метод getDataSourceInfo. Вот по этому графику и будет информация. В руководстве показана сигнатура вызова:
TABLE info getDataSourceInfo()
Никаких параметров. Т.е. метод не предназначен для получения данных о другом графике по идентификатору. Такой вызов некорректен.
getDataSourceInfo - это метод qlua.
Пользователь
Сообщений: Регистрация: 14.06.2023
05.09.2023 21:52:20
tiker_id = "WWWbond"
local sec_code = getSecurityInfo(tiker_id, "SEC_CODE")
message("Название акции: " ..sec_code)
дает ошибку attempt to concatenate a nil value (local 'sec_code')
пробовал "SHORTNAME" и"SEC_DESCRIPTION" вместо "SEC_CODE" - эта же ошибка.
Ошибка "attempt to concatenate a nil value" возникает, когда пытаемся объединить (сконкатенировать) строку с нулевым значением (`nil`). Это может произойти, если функция `getSecurityInfo()` не возвращает значение для запрошенного параметра. В данном случае, возможно, не удалось получить код инструмента для указанного `tiker_id`.
почему это не работает((( что за проклятье как тяжело получить этот SEC_CODE
Пользователь
Сообщений: Регистрация: 30.01.2015
06.09.2023 07:03:37
написал: tiker_id = "WWWbond"
local sec_code = getSecurityInfo(tiker_id, "SEC_CODE")
message("Название акции: " ..sec_code)
дает ошибку attempt to concatenate a nil value (local 'sec_code')
почему это не работает((( что за проклятье как тяжело получить этот SEC_CODE
============================== Вы не ту функцию взяли. Читайте внимательнее. вам выше специально скопировал из документации ------------------ функция getDataSourceInfo, а у Вас getSecurityInfo ------------------------ getSecurityInfo Функция предназначена для получения информации по инструменту. Формат вызова: TABLE getSecurityInfo (STRING class_code, STRING sec_code) Функция возвращает таблицу Lua с параметрами Таблицы инструментов.
Пользователь
Сообщений: Регистрация: 14.06.2023
06.09.2023 08:30:14
Пробовал разные комбинации с getDataSourceInfo. Идентификатор ставил на Price и на индикатор Move Average.
такой код : local ticker_id = "graf2"
local datasource_info = getDataSourceInfo(ticker_id)
local sec_code = datasource_info.sec_code
message("Инструмент: " ..sec_code)
и такой код : tiker_id = "graf3"
local sec_code = getDataSourceInfo(tiker_id, "SEC_CODE")
message("Название акции: " ..sec_code)
Выдают одну и ту же ошибку.
lua:5: attempt to call a nil value (global 'getDataSourceInfo') Может торги еще не начались и по этому не работает. Вчера вроде getDataSourceInfo по всякому пытался вызвать, но не работало.
Пользователь
Сообщений: Регистрация: 27.01.2017
06.09.2023 11:14:59
Если Вы, действительно, хотите разобраться, то, наверно, все же стоит прочитать сообщения, что были написаны. А еще лучше документацию. В ней указаны все методы и, что важно, - сигнатуры вызова методов. Уже было сказано, что метод getDataSourceInfo вызывается без параметров. Этот метод доступен в контексте индикатора. Метод же getSecurityInfo - получает данные по переданным параметрам класс инструмента, код инструмента. Кои Вы и хотите узнать, а значит и использовать getSecurityInfo не получится.
И еще раз - по идентификатору графика можно узнать значения линий этого графика, а что это за график (и какого инструмента) нет.
Пользователь
Сообщений: Регистрация: 14.06.2023
06.09.2023 11:49:22
А по открытому стакану sec_code есть возможность получить?
Пользователь
Сообщений: Регистрация: 27.01.2017
06.09.2023 11:58:25
Наверно, проще озвучить решаемую проблему. Но прежде надо определится, что и где используется - индикатор, скрипт. Для них используются совершенно разные походы.
Пользователь
Сообщений: Регистрация: 14.06.2023
06.09.2023 12:56:31
Задача такая. Есть график или стакан по одной акции. Нужно запустить скрипт и он должен отправить заявку по этой акции. Для заявки нужен sec_code. sec_code должен браться автоматом от графика или стакана. Графики и стаканы привязаны якорем к таблице с акциями. Тоесть я постоянно выбираю бумагу, она всегда разная. Какую выбрал хочу нажать кнопку скрипта и по этой бумаге пошла заявка. все параметры заявок знаю с этим все ок. А вот sec_code чтоб брался это проблема.
Пользователь
Сообщений: Регистрация: 27.01.2017
06.09.2023 13:08:04
Цитата
написал: Задача такая. Есть график или стакан по одной акции. Нужно запустить скрипт и он должен отправить заявку по этой акции. Для заявки нужен sec_code. sec_code должен браться автоматом от графика или стакана. Графики и стаканы привязаны якорем к таблице с акциями. Тоесть я постоянно выбираю бумагу, она всегда разная. Какую выбрал хочу нажать кнопку скрипта и по этой бумаге пошла заявка. все параметры заявок знаю с этим все ок. А вот sec_code чтоб брался это проблема.
Нет, так не выйдет. Точнее это можно сделать, если дополнительно сделать индикатор на этот график. При смене настроек на графике (изменение инструмента), простой индикатор определить через getDataSourceInfo какой в текущий момент инструмент и запишет эту информацию в какое-то хранилище (не важно какое, например метка на графике). Тогда скрипт прочитает это хранилище и получит информацию. Но надо решать вопрос синхронизации, т.к. смена инструмента не мгновенна.
Пользователь
Сообщений: Регистрация: 14.06.2023
06.09.2023 13:57:18
Какой дикий колхоз приходится городить. Как не продумано. Спасибо Вам за объяснения. Попробую решить другую задачу. Она выглядит проще.
Пользователь
Сообщений: Регистрация: 27.01.2017
06.09.2023 14:00:45
Нет идеальных решений. Я Питон и его колхоз терпеть не могу, но полмира пользуется и довольно.
Пользователь
Сообщений: Регистрация: 30.01.2015
06.09.2023 15:15:40
Цитата
Цитата
написал: Задача такая. Есть график или стакан по одной акции. Нужно запустить скрипт и он должен отправить заявку по этой акции. Для заявки нужен sec_code. sec_code должен браться автоматом от графика или стакана. Графики и стаканы привязаны якорем к таблице с акциями.
функция getDataSourceInfo() работает как и говорилось. Вот пример как ваша хотелка. График подключен якорем к ТТТ щелкаем в ТТТ строку с инструментом. Он появляется на графике, а в окошке выводится код инструмента этой функцией.
Пользователь
Сообщений: Регистрация: 14.06.2023
06.09.2023 17:06:37
Индикатор должен быть обязательно хэндмэйд? А скрипт должен слушать и спать периодами?
Пользователь
Сообщений: Регистрация: 14.06.2023
16.09.2023 21:42:34
какой у Вас скрипт? мой не работает((
function GetDataSourceInfo() local info = getDataSourceInfo() if info ~= nil then -- Выводим информацию о доступных источниках данных for i, source in ipairs(info) do message("Источник данных #" .. i) message("Имя: " .. source.class_code) -- Имя источника данных message("Описание: " .. source.desc) -- Описание источника данных message("Код биржи: " .. source.market) -- Код биржи message("Тип инструмента: " .. source.sec_type) -- Тип инструмента message("------------------------------") end else message("Информация о доступных источниках данных не найдена.") end end
-- Функция, вызываемая при выборе строки в таблице ТТТ function OnSelectTTTRow(t_id, sel_index, sel_mode) if t_id == "TTT" and sel_mode == 1 then -- Получаем информацию о выбранной строке в таблице ТТТ local row_info = getRow(t_id, sel_index) if row_info ~= nil then -- Выводим информацию о выбранной строке в сообщении local message_text = "Выбрана строка в ТТТ:\n" message_text = message_text .. "Инструмент: " .. row_info[1] .. "\n" message_text = message_text .. "Цена: " .. row_info[2] .. "\n" message_text = message_text .. "Объем: " .. row_info[3] message(message_text) end end end
написал: Задача такая. Есть график или стакан по одной акции. Нужно запустить скрипт и он должен отправить заявку по этой акции. Для заявки нужен sec_code. sec_code должен браться автоматом от графика или стакана. Графики и стаканы привязаны якорем к таблице с акциями.
функция getDataSourceInfo() работает как и говорилось. Вот пример как ваша хотелка. График подключен якорем к ТТТ щелкаем в ТТТ строку с инструментом. Он появляется на графике, а в окошке выводится код инструмента этой функцией.
Не понял через какой механизм вы это в итоге реализовали? Метка?
Пользователь
Сообщений: Регистрация: 30.01.2015
13.12.2025 18:49:08
Цитата
AndyWise написал: функция getDataSourceInfo() работает как и говорилось.
функция getDataSourceInfo() работает как и говорилось.
Пользователь
Сообщений: Регистрация: 31.08.2020
13.12.2025 20:21:58
Цитата
nikolz написал: функция getDataSourceInfo() работает как и говорилось.
Про источник я понял, я в контексте, как передать информацию в обычный скрипт с минимальными издержками. Пока варианты это метка, или файл открыть. Есть еще идея считать выделенное в ТТТ через win api, все равно весь трафик гоню в отдельную программу. Но пока не осилил, далеко она запрятана ....
написал: функция getDataSourceInfo() работает как и говорилось.
Про источник я понял, я в контексте, как передать информацию в обычный скрипт с минимальными издержками. Пока варианты это метка, или файл открыть. Есть еще идея считать выделенное в ТТТ через win api, все равно весь трафик гоню в отдельную программу. Но пока не осилил, далеко она запрятана ....
Непонятно, что и куда передать. Напишите пример.
Пользователь
Сообщений: Регистрация: 31.08.2020
14.12.2025 12:07:56
Цитата
nikolz написал: Непонятно, что и куда передать. Напишите пример.
getDataSourceInfo() работает только в потоке индикатора, а его лучше не грузить т.к. перерисовывается на каждом тике. Поэтому у меня просто отдельный скрипт собирает каждые 0,2с : текущее время, статус терминала, позиции, цену, ATR, границы цен и т.д. и гонит их в файл. Вот задумался, а как сделать, чтоб поток этот был в зависимости от выделенного инструмента в ТТТ и заякоренного графика.
написал: Непонятно, что и куда передать. Напишите пример.
getDataSourceInfo() работает только в потоке индикатора, а его лучше не грузить т.к. перерисовывается на каждом тике. Поэтому у меня просто отдельный скрипт собирает каждые 0,2с : текущее время, статус терминала, позиции, цену, ATR, границы цен и т.д. и гонит их в файл. Вот задумался, а как сделать, чтоб поток этот был в зависимости от выделенного инструмента в ТТТ и заякоренного графика.
Все не так уж сумрачно вблизи. ---------------------------- Если происходит изменение инструмента на графике, то перестраиваются все индикаторы. Это означает, что индекс Calculate начинается с 1 . ставим условный оператор if indx==1 then ....getDataSourceInfo().... end В результате эта функция вызываемся всего один раз для нового инструмента или нового тайма.
Пользователь
Сообщений: Регистрация: 30.01.2015
14.12.2025 12:49:27
Чтобы индикатор лишнего не грузился обходите те функции внутри него, которые надо считать лишь на закрытых свечах.
Пользователь
Сообщений: Регистрация: 31.08.2020
14.12.2025 13:42:43
Цитата
nikolz написал: Чтобы индикатор лишнего не грузился обходите те функции внутри него, которые надо считать лишь на закрытых свечах.
А если таймфрейм свечи графика 60мин или дневной, как бы Вы реализовали опрос позиций и статус соединения Квика 1 раз в 2 сек внутри индикатора? Через разницу времени тиков?
написал: Чтобы индикатор лишнего не грузился обходите те функции внутри него, которые надо считать лишь на закрытых свечах.
А если таймфрейм свечи графика 60мин или дневной, как бы Вы реализовали опрос позиций и статус соединения Квика 1 раз в 2 сек внутри индикатора? Через разницу времени тиков?
Дневную свечу строю на интервалах меньшего тайма. ----------------------------- Зачем на индикаторах день или час интервалы в секунды? Какой в этом смысл?
Пользователь
Сообщений: Регистрация: 30.01.2015
14.12.2025 14:37:52
Если надо высокую скорость то это на скрипте не индикаторе. В таком варианте можно получить интервал в 0.001 сек.
Пользователь
Сообщений: Регистрация: 31.08.2020
14.12.2025 14:51:37
Цитата
nikolz написал: Зачем на индикаторах день или час интервалы в секунды? Какой в этом смысл?
Стратегия на графике Дня, Часе/5мин, 2 окна. Нужно секундное обновление данных в привод, для расчетов и контроля ошибок. Но если от тиков обновление брать, то они не постоянны. А если полингом из скрипта, то там не работает getDataSourceInfo. Вот сижу думаю
написал: Зачем на индикаторах день или час интервалы в секунды? Какой в этом смысл?
Стратегия на графике Дня, Часе/5мин, 2 окна. Нужно секундное обновление данных в привод, для расчетов и контроля ошибок. Но если от тиков обновление брать, то они не постоянны. А если полингом из скрипта, то там не работает getDataSourceInfo. Вот сижу думаю
можно поставить таймер. или использовать тики и высокоточный счетчик.
Пользователь
Сообщений: Регистрация: 30.01.2015
14.12.2025 15:40:22
еще можно использовать тики от высоколиквидного инструмента например сбер.
Пользователь
Сообщений: Регистрация: 30.01.2015
14.12.2025 15:46:03
можно сделать очень просто из индикатора сбрасывать в файл, а в скрипте читать из этого файла. Так как это будет лишь при смене графика, то грузить ничего не будет. А запаздывание чтения в скрипте составит не более 0.1 сек
Пользователь
Сообщений: Регистрация: 31.08.2020
14.12.2025 16:57:57
Цитата
nikolz написал: можно поставить таймер. или использовать тики и высокоточный счетчик.
В файл, тики, тики плюс+счетчик - это понятно. А таймер это как? Я так понял, что если инструмент не в торгах и не в сделках, то график статичен и там нет событий вообще.
написал: можно поставить таймер. или использовать тики и высокоточный счетчик.
В файл, тики, тики плюс+счетчик - это понятно. А таймер это как? Я так понял, что если инструмент не в торгах и не в сделках, то график статичен и там нет событий вообще.
Таймер и высокоточный счетчик это API C for Lua. --------------- Один из вариантов решения проблемы с малыми движениями индикатора на инструменте. Торгую вечным фьючерсом сбера. Он изменяется медленно. Открываю лучшее предложение/спрос на графике акции.
Пользователь
Сообщений: Регистрация: 31.08.2020
14.12.2025 19:41:09
Цитата
nikolz написал: Таймер и высокоточный счетчик это API C for Lua.