Получить sec_code из метки индикатора

Страницы: 1
RSS
Получить sec_code из метки индикатора, Получить sec_code из метки индикатора
 
Есть индикатор  

Settings = {
   Name = "goodmode1"
}

function Init()
   return 1
end

function OnCalculate(Index)
   if Index == 1 then
       local info = getDataSourceInfo()
       --message(info.sec_code)
       
       -- Создаем метку с информацией sec_code
       local labelSize = 100 -- размер метки
       local labelX = 10 -- координата X метки (посередине графика)
       local labelY = 10 -- координата Y метки (посередине графика)
       local secCodeLabel = tostring(info.sec_code)
       AddLabel(labelX, labelY, secCodeLabel, RGB(255, 255, 0), labelSize)
       
       -- Выводим значение метки в сообщении
       message("Значение метки: " .. secCodeLabel)
   end
   
   return 0
end


График заякорен к ТТТ и при выборе инструмента в ТТТ выдает его название, вроде это название так же записывается в метку на графике ( метку кстати ни разу не получилось увидеть, надеюсь она есть)

Делаю скрипт что-бы при запуске скрипта, значение метки выводилось сообщением.

function OnInit()
   local labelValue = GetLabelParams("goodmode1", "Метка")
   message("Значение метки: " .. tostring(labelValue))
end

Такой скрипт отображает nill.  Код вроде правильный, что не так?  Как проверить есть ли метка?  
 
Alexey89,  добрый день.

Вы некорректно выполняете вызов функции AddLabel.

Формат вызова функции:

NUMBER AddLabel(STRING chart_tag, TABLE label_params)

Здесь chart_tag – тег графика, к которому привязывается метка;
label_params – таблица с параметрами метки.
 
Settings = {
   Name = "goodmode1"
}

function Init()
   return 1
end

function OnCalculate(Index)
   if Index == 1 then
       local info = getDataSourceInfo()
       --message(info.sec_code)
       
       -- Создаем метку с информацией sec_code

local chart_tag = "ww5"
   
label_params = {

       local labelSize = 300 -- размер метки
       local labelX = 50 -- координата X метки (посередине графика)
       local labelY = 50 -- координата Y метки (посередине графика)
       local secCodeLabel = tostring(info.sec_code)

        }

 AddLabel(chart_tag, label_params)  

       -- Выводим значение метки в сообщении
       message("Значение метки: " .. secCodeLabel)
   end
   
   return 0
end


Так корректно? Метки по прежнему нет.

Скрипт

function OnInit()
  local labelValue = GetLabelParams("goodmode1", "Метка")
  message("Значение метки: " .. tostring(labelValue))
end

По прежнему отображает nill.  
 
Может Вы все прочитаете документацию по синтаксису языка, по методам qlua.
Код
label_params = {
      
        local labelSize = 300 -- размер метки
        local labelX = 50 -- координата X метки (посередине графика)
        local labelY = 50 -- координата Y метки (посередине графика)
        local secCodeLabel = tostring(info.sec_code)
      
         }

Зачем при объявлении переменных в таблице label_params используете ключевое слово local?

Далее, вызов NUMBER AddLabel(STRING chart_tag, TABLE label_params)

Как видно из сигнатуры, метод возвращает число - это идентификатор добавленной метки на графике. Если вернулось nil, то метка не добавилась. Вот Вам пример https://luaq.ru/AddLabel.html

Далее, GetLabelParams("goodmode1", "Метка")
Читаем документацию: TABLE GetLabelParams(STRING chart_tag, NUMBER label_id)                        

Т.е. метод возвращает параметры метки - таблица, а принимает идентификатор графика - строка, идентификатор метки (тот, что вернул метод AddLabel) - число.

Можно, конечно, и так пробовать, но потратить 10 минут на чтение - быстрее.
 
 Код индикатора теперь.

local Settings = {
   Name = "goodmode1"
}

local secCodeLabel

function Init()
   return 1
end

function OnCalculate(Index)
   if Index == 1 then
       local info = getDataSourceInfo()
       
       local chart_tag = "ww5"
   
label_params = {
           labelSize = 300,
           labelX = 50,
           labelY = 50,
           secCodeLabel =  (info.sec_code)
       }

local label_id = AddLabel(chart_tag, label_params)

       secCodeLabel = GetLabelParams(chart_tag, label_id).secCodeLabel
       
       message("Значение метки: " .. secCodeLabel)
   end
   
   return 0
end


Код скрипта теперь


local chart_tag = "ww5" -- идентификатор графика
local label_id = 1 -- идентификатор метки

function OnInit()
   local label_params = GetLabelParams(chart_tag, label_id)
   if label_params then
       local secCodeLabel = label_params.secCodeLabel
       message("Значение метки: " .. secCodeLabel)
   else
       message("Метка не найдена")
   end
end

function OnStop()
end


Пишет "Метка не найдена".  Надо тип данных где-то задать? Как получить этот secCodeLabel  скриптом?  
 
Пытаюсь найти label_id перебором.


local chart_tag = "ww5" -- идентификатор графика

function OnInit()
   local label_id = 1 -- начальное значение идентификатора метки
   local label_params = GetLabelParams(chart_tag, label_id)
   while label_params do
       local secCodeLabel = label_params.secCodeLabel
       message("Значение метки с идентификатором " .. label_id .. ": " .. secCodeLabel)
       label_id = label_id + 1 -- увеличиваем идентификатор метки
       label_params = GetLabelParams(chart_tag, label_id) -- получаем параметры новой метки
   end
end

function OnStop()
end



Я на верном пути?  
 
Вы упорно, по какой-то причине не хотите читать документацию, даже пример, что был приведен выше.

В методе AddLabel передается таблица параметров метка в определенном формате. И там нет такого параметра как secCodeLabel.
 
Я читаю документацию. Понять ее не в состоянии. Стиль изложения вида вода мокрая, а в году 12 месяцев мне не дает ничего. Мне нужны следствия и выводы. Нет в документации списка что можно сделать и что сделать нельзя. Нет списка функции которые друг с другом работают или не работают. Нужно как-то вычислять что работает, а что нет.

Какими способами можно  взять sec_code из индикатора и использовать его в скрипте запускаемом вручную?  Из сообщения можно взять? Попробовал, похоже невозможно.

AddLabel или GetLabelParams (внутренние их параметры) могут принимать значения sec_code что бы  взять sec_code из индикатора и использовать его в скрипте запускаемом вручную?  

Другие способы может есть ?  
 
Я Вам уже в прошлый раз написал, что прямого способа нет. И это отбрасывая вопрос зачем это вообще надо делать. В метку Вы можете сохранить text (текст), hint( подсказку) - это строки, цену, дату-время. Т.е. метка может дать информацию о том где она находится на графике и какой текст в ней сохранен. Что потом можно и прочитать, ЗНАЯ ЧИСЛОВОЙ ИДЕНТИФИКАТОР ЭТОЙ МЕТКИ, который, к слову, может произвольно изменится.
Что касается документации, то она может не идеальна, но как минимум дает представление о том какой формат вызова у метода, какой тип данных метод возвращает. Прочитав это, отпадут вопросы о том почему не работает передача в параметре метода, например, строки вместо числа.
 
Так понятнее, спасибо. А такой вариант. Создается табличка и туда пишутся значения мэсседжей или меток. И из этой таблички скрипт берет самую последнюю информацию. Такое в теории возможно?  
 
Цитата
Alexey89 написал:
Так понятнее, спасибо. А такой вариант. Создается табличка и туда пишутся значения мэсседжей или меток. И из этой таблички скрипт берет самую последнюю информацию. Такое в теории возможно?  
И такое возможно. Также можно просто писать в файл. Просто нужен любой прокси.
 
Какая функция создания таблицы подойдет лучше всех?  
 
Цитата
Alexey89 написал:
Так понятнее, спасибо. А такой вариант. Создается табличка и туда пишутся значения мэсседжей или меток. И из этой таблички скрипт берет самую последнюю информацию. Такое в теории возможно?  
Перечитал сообщение - нет. Если таблица создается на одной стороне, то другая сторона он ней не узнает ничего. Поэтому необходимо то, что можно найти по какому-то признаку. Текст метки, имя файла и т.д.
 
А скрипт который собирает мэседжи в табличку. А другой скрипт который  при запуске берет из таблички последний сек код и отправляет по нему заявку. Такое будет работать?  
 
Alexey89,
Можно сделать все, что придумаете.
Проблема лишь в уровне Ваших знаний и умений.
Если хотите сделать что-то сами, то начните с изучения языка на котором будете писать ( например Луа ) и подробного изучения документации на библиотеку QLua и терминал QUIK.
Страницы: 1
Читают тему
Наверх