Таблица с помощью Qlua

Страницы: 1
RSS
Таблица с помощью Qlua, Таблица с помощью Qlua
 
Здравствуйте,

Сделал табличку оповещения в Quik: что то наподобие:

function CreateTable()

t_id = AllocTable();

AddColumn(t_id, 0, "Код Бумаги", true, QTABLE_INT_TYPE, 15)
AddColumn(t_id, 1, "Условие", true, QTABLE_INT_TYPE, 15)
AddColumn(t_id, 2, "Статус", true, QTABLE_INT_TYPE, 15)
AddColumn(t_id, 3, "Время срабатывания", true, QTABLE_INT_TYPE, 15)

t = CreateWindow(t_id);

SetWindowCaption(t_id, "Таблица оповещения");

for i=0, 10, 1 do
InsertRow(t_id, -1);

end;
end

Таблица создается, тут все нормально. Даже при срабатывании условия, в таблицу записывается мой текст по оповещению... НО!
В таблицу записывается текст после срабатывания условия таким образом, что если произошло совпадения условия на 10 строке, мой текст оповещения появится именно на 10 строке в созданной таблице, а все остальные будут пустые. Это происходит, как я понимаю, потому что в скрипте прописана статическая таблица с уже известным кол-ом строк и соответствия этих строк конкретной бумаге:

SetCell(t_id, 10, 2, "Нет")

Но можно ли ка то сделать, чтобы, при совпадении условий, текст в таблицу добавлялся не фиксировано, а так: сработало условие по газпрому, и хоть он в таблице записан на 10 строке, но так как оповещение сработало первый, то что бы он записался в таблице первой строкой ? Если после газпрома, сработало оповещение на сбере, то записать в созданную таблицу текст оповещения второй строкой и так далее ?
 
Спрошу немного по другому, как в созданную таблицу добавлять сообщения, назову так - "динамически", то есть сделать так, чтобы код Qlua анализировал занятость строк в этой таблице, то есть если первая строка не занята, то добавить сообщение в первую строку, после срабатывания второго условия, Qlua анализирует занятость строк и добавляеть второе сообщение в следующую по свободности строку, сощданой таблицы ?
 
Здравствуйте,
Для получения значения ячейки есть функция GetCell. Если Вам нужно узнать занята строка или нет, используйте ее.
 
Спасибо.

Я нашел более простой способ, как мне показалось, однако почему то не работает, что то не так с хранением значения переменной в памяти, может кто подскажет, вообщем смысле вот так получается:

function main()

N=0

function OnQuote(class_code, sec_code)

   if class_code==tqbr and sec_code==sber


            If Sber=100 then
           
             N=N+1

             SetCell(t_id, N, 2, "текст")     ' то есть 0+1 = 1    и SetCell запишет текст в N=1 строку, все так и происходит

            end if


             If Gazp >50 then
           
             N=N+1

             SetCell(t_id, N, 2, "текст")   '  то есть 1+1 = 2    и SetCell должен запbсать текст в N=2 строку, но этого не происходит

              end if


end
end

Такое ощущение, что первая операция суммирования, которая выполнилась при первом условии для "N" не держится в памяти, и при срабатывании второго условия, опять использует N в значении 0, как и было обозначено в самом начале скрипта.

Кто знает, почему так происходит и как можно все таки записать ее в память, чтобы потом можно было использовать ?
 
Здравствуйте,
Приведенный код, вызывает слишком много вопросов.
Либо он вообще некорректно написан.
Для диагностики, Вы можете добавить вывод информации через message тогда сразу будет понятно почему так происходит.
 
Это я его просто привел в таком уррощенном виде, чтобы не загроиождать тему, смысл вопроса именно в присвоении переменной N. Почему при сробатывании первого условия формула N= N+1 (где N  в начале скрипта обозначено как 0) работает и выдает 1, а при сроботывании второго условия после первого, в формуле N= N+1,  N опять имеет значение 0, а не уже 1, ведь ранее у N была прибвлена 1.

Вот в чем вопрос.
 
Optimus1 Optimus1,

В том то и дело, что на присланном коде, если его привести в рабочее состояние, проблема не воспроизводится.
Нужна полная версия кода.
 
Цитата
Optimus1 Optimus1 написал:
Это я его просто привел в таком уррощенном виде, чтобы не загроиождать тему, смысл вопроса именно в присвоении переменной N. Почему при сробатывании первого условия формула N= N+1 (где N  в начале скрипта обозначено как 0) работает и выдает 1, а при сроботывании второго условия после первого, в формуле N= N+1,  N опять имеет значение 0, а не уже 1, ведь ранее у N была прибвлена 1.

Вот в чем вопрос.
У Вас приведен явно кусок кода. Разберитесь, где у вас стоит инициализация переменной N. Она должна быть глобальной и инициализироваться 1 раз.
trdrobot.ru
 
N присваивается значение 0, в самом начале после function main, но потом мне надо , чтобы к N прибавлялось по 1 каждый раз когда срабатывает условие, и ечтественно нужно, чтобы каждый раз значение N сохраняло свое значение, то есть прибавили 1, N должно стать одному и запомнить это значение, что бы во второй раз , когда сработает условие 1 прибавлялось уже  к запомненому значению N.

Это возможно ?
 
Optimus1 Optimus1,
Еще раз, то что Вам требуется и так вполне понятно и не требует уточнений.
Конечно же Ваша задача элементарно решается.
Но раз Ваш код не работает, значит в нем есть ошибка и чтобы ее найти нужна полная версия кода.
Скорей всего, проблема именно в месте определения переменной N, попробуйте ее вообще вынести за пределы функций.
Но это лишь догадка, для установления точных причин нужен код. Или его альтернатива в более компактном варианте.
 
Здесь OnQuote выполняется только для одного инструмента:
Цитата
Optimus1 Optimus1 написал:
if class_code==tqbr and sec_code==sber
 
Цитата
p_classcode_94="TQBR"
p_seccode_94="SBER"
is_run=true
-----------------------------------------------------------
function main()
n=0
  while is_run do
      sleep(1000)
end
--Функция создания таблицы: Конец
-----------------------------------------------------------
function OnQuote(class_code, sec_code)

if class_code==p_classcode_94 and sec_code==p_seccode_94 then  

SBER_RSI_1day_Script_previouse = t[0].close
SBER_RSI_1day_Script_now = t[1].close

SBER_RSI_1day_Script_condition_499=10


if SBER_RSI_1day_Script_now >= SBER_RSI_1day_Script_condition_499 then
n=n+1
message("равно"..tostring(n),1)

if SBER_RSI_1day_Script_previouse < SBER_RSI_1day_Script_condition_499 then
message("равно"..tostring(n),1)

end
  end

''''''''''''''''''''''''''''
SBER_RSI_1day_Script_previouse = t[0].close
SBER_RSI_1day_Script_now = t[1].close
SBER_RSI_1day_Script_condition_500=90

if SBER_RSI_1day_Script_now <= SBER_RSI_1day_Script_condition_500 then
n=n+1
message("равно"..tostring(n),1)

if SBER_RSI_1day_Script_previouse > SBER_RSI_1day_Script_condition_500 then
message("равно"..tostring(n),1)

end
  end

end
end


Два указанных условия RSI<90,  и RSI >10  срабатывают при каждом изменении сткана по Сбербанку, и каждый раз сообщение выдается с одной и той же цифрой - "3".
 
На форуме есть тэг [CODE], чтобы никто не ломал глаза, читая ваш код.
 
[Code]Скрипт[/Code]
 
[CODE]Скрипт[CODE]
 
Optimus1 Optimus1,

вы опять привели не полную версию кода.
Что такое t?? где задается?
Почему у функции main не хватает end?
Почему Вы не выполнили рекомендации о переносе переменной n за пределы main?
 
Цитата
Optimus1 Optimus1 написал:
[CODE]Скрипт[CODE]

Если в панеле не нажата кнопка BB то тег не вставится, следует нажимать кнопку <...>  или нажать кнопку BB, тогда можно писать тег.
 
Вот полнейший код, только что из блокнота скопировал:

<code>
 --Стартовая ячейка: не удалять
p_seccode_94="SBER"
p_classcode_95="TQBR"

n=0 -!!!!!!!!!!!! ЗА ПРЕДЕЛАМИ Функции main

is_run=true

------------------------------------------------------------

function main()



  while is_run do
      sleep(1000)

end

end
--------------------------------------------------------------------------------------
--Функция создания таблицы: Начало

function CreateTable()



hu_id = AllocTable();

AddColumn(hu_id, 0, "Код Бумаги", true, QTABLE_INT_TYPE, 15)
AddColumn(hu_id, 1, "Условие", true, QTABLE_INT_TYPE, 15)
AddColumn(hu_id, 2, "Статус", true, QTABLE_INT_TYPE, 15)
AddColumn(hu_id, 3, "Время срабатывания", true, QTABLE_INT_TYPE, 15)

t = CreateWindow(hu_id);

SetWindowCaption(hu_id, "Таблица оповещения");

for i=0, 10, 1 do
InsertRow(hu_id, -1);

end;

end
--Функция создания таблицы: Конец
-----------------------------------------------------------------------------------------

function OnQuote(class_code, sec_code)


if class_code==p_classcode_94 and sec_code==p_seccode_94 then      --94)SBER
timeo = getInfoParam("SERVERTIME")




-- Больше или равно
--499)
--Это суб-модуль499 : Обозначения переменных для SBER_RSI_1day_Script

local N499=getNumCandles("SBER_RSI_1day_Script")

t,n,i499=getCandlesByIndex("SBER_RSI_1day_Script", 0, N499-2, 2)

SBER_RSI_1day_Script_previouse = t[0].close

SBER_RSI_1day_Script_now = t[1].close


--499)Условие на больше или меньше

SBER_RSI_1day_Script_condition_text_499=" Больше или равно "
SBER_RSI_1day_Script_condition_499=10
SBER_RSI_1day_Script_name_paper_499="SBER"




--499)Условие на больше или меньше
--499)Условие: SBER_RSI_1day_Script  Больше или равно  10

if SBER_RSI_1day_Script_now >= SBER_RSI_1day_Script_condition_499 then

n=n+1

message("равно"..tostring(n),1)



if SBER_RSI_1day_Script_previouse < SBER_RSI_1day_Script_condition_499 then

message("равно"..tostring(n),1)



end

  end



-- Меньше или равно
--500)
--Это суб-модуль500 : Обозначения переменных для SBER_RSI_1day_Script

local N500=getNumCandles("SBER_RSI_1day_Script")

t,n,i500=getCandlesByIndex("SBER_RSI_1day_Script", 0, N500-2, 2)

SBER_RSI_1day_Script_previouse = t[0].close

SBER_RSI_1day_Script_now = t[1].close


--500)Условие на больше или меньше

SBER_RSI_1day_Script_condition_text_500=" Меньше или равно "
SBER_RSI_1day_Script_condition_500=90
SBER_RSI_1day_Script_name_paper_500="SBER"




--500)Условие на больше или меньше
--500)Условие: SBER_RSI_1day_Script  Меньше или равно  90

if SBER_RSI_1day_Script_now <= SBER_RSI_1day_Script_condition_500 then

n=n+1

message("равно"..tostring(n),1)


if SBER_RSI_1day_Script_previouse > SBER_RSI_1day_Script_condition_500 then

message("равно"..tostring(n),1)


end

  end



end   -- конец Class_code по n-ой бумаге
end   -- Окончательный END по OnQuote



</code>
 
Optimus1 Optimus1,

речь была про кнопку с надписью "<...>"
в аттаче сриншот
 
Цитата
Optimus1 Optimus1 написал:
n=0 -!!!!!!!!!!!! ЗА ПРЕДЕЛАМИ Функции main

и? ситуация изменилась или нет?
 
Причина в том что у Вас n в двух местах.
Код
      
t,n,i499=getCandlesByIndex("SBER_RSI_1day_Script", 0, N499-2, 2)
t,n,i500=getCandlesByIndex("SBER_RSI_1day_Script", 0, N500-2, 2)


согласно описанию функции getCandlesByIndex вторым параметром она возвращает количество свечек в таблице.
т.к Вы всегда заказываете 2 свечки, топри n=n+1 получается всегда 3.
 
Изменил свою "n", которую мне необходимо суммировать на "m".  Теперь выводит постоянно занчение "2".
В Функции getCandlesByIndex - "n" не трогал.
 
Optimus1 Optimus1,
Выложите код еще раз, чтобы посмотреть что исправили.
 
Код
  --Стартовая ячейка: не удалять
p_seccode_94="SBER"
p_classcode_95="TQBR"

M=0 -!!!!!!!!!!!! ЗА ПРЕДЕЛАМИ Функции main, заменил "n" на "M"

is_run=true

------------------------------------------------------------

function main()



   while is_run do
       sleep(1000)

 end

 end
--------------------------------------------------------------------------------------
 --Функция создания таблицы: Начало

function CreateTable()



hu_id = AllocTable();

AddColumn(hu_id, 0, "Код Бумаги", true, QTABLE_INT_TYPE, 15)
AddColumn(hu_id, 1, "Условие", true, QTABLE_INT_TYPE, 15)
AddColumn(hu_id, 2, "Статус", true, QTABLE_INT_TYPE, 15)
AddColumn(hu_id, 3, "Время срабатывания", true, QTABLE_INT_TYPE, 15)

t = CreateWindow(hu_id); 

SetWindowCaption(hu_id, "Таблица оповещения"); 

for i=0, 10, 1 do
InsertRow(hu_id, -1); 

end; 

end
 --Функция создания таблицы: Конец
-----------------------------------------------------------------------------------------

function OnQuote(class_code, sec_code)


if class_code==p_classcode_94 and sec_code==p_seccode_94 then      --94)SBER
timeo = getInfoParam("SERVERTIME")




 -- Больше или равно 
--499)
 --Это суб-модуль499 : Обозначения переменных для SBER_RSI_1day_Script

local N499=getNumCandles("SBER_RSI_1day_Script")

t,n,i499=getCandlesByIndex("SBER_RSI_1day_Script", 0, N499-2, 2)

SBER_RSI_1day_Script_previouse = t[0].close

SBER_RSI_1day_Script_now = t[1].close


--499)Условие на больше или меньше

SBER_RSI_1day_Script_condition_text_499=" Больше или равно "
SBER_RSI_1day_Script_condition_499=10
SBER_RSI_1day_Script_name_paper_499="SBER"




--499)Условие на больше или меньше
--499)Условие: SBER_RSI_1day_Script  Больше или равно  10

if SBER_RSI_1day_Script_now >= SBER_RSI_1day_Script_condition_499 then

M=M+1                                                                          - заменил "n" на "M"

message("равно"..tostring(M),1)                                                - заменил "n" на "M"



if SBER_RSI_1day_Script_previouse < SBER_RSI_1day_Script_condition_499 then

message("равно"..tostring(M),1)



end

   end



 -- Меньше или равно 
--500)
 --Это суб-модуль500 : Обозначения переменных для SBER_RSI_1day_Script

local N500=getNumCandles("SBER_RSI_1day_Script")

t,n,i500=getCandlesByIndex("SBER_RSI_1day_Script", 0, N500-2, 2)

SBER_RSI_1day_Script_previouse = t[0].close

SBER_RSI_1day_Script_now = t[1].close


--500)Условие на больше или меньше

SBER_RSI_1day_Script_condition_text_500=" Меньше или равно "
SBER_RSI_1day_Script_condition_500=90
SBER_RSI_1day_Script_name_paper_500="SBER"




--500)Условие на больше или меньше
--500)Условие: SBER_RSI_1day_Script  Меньше или равно  90

if SBER_RSI_1day_Script_now <= SBER_RSI_1day_Script_condition_500 then

M=M+1                                                                             - заменил "n" на "M"

message("равно"..tostring(M),1)                                                   - заменил "n" на "M"


if SBER_RSI_1day_Script_previouse > SBER_RSI_1day_Script_condition_500 then

message("равно"..tostring(M),1)                                                   - заменил "n" на "M"


end

   end



end   -- конец Class_code по n-ой бумаге
end   -- Окончательный END по OnQuote


 
Sergey Gorokhov,
по-моему товарищ вас тролит, предлагая явно неработающий код (при этом утверждает, что чё-то там выводится) и отвлекая от РАБОТЫ.
У вас ведь есть чем заняться? Ошибок-то в терминале полно! Надо исправлять.


Цитата
Optimus1 Optimus1 написал:
p_seccode_94="SBER"
p_classcode_95="TQBR"
Цитата
Optimus1 Optimus1 написал:
function OnQuote(class_code, sec_code)
if class_code==p_classcode_94 and sec_code==p_seccode_94 then      --94)SBER
Тут не может ничего выводиться по определению. Авто явно ммм... говорит неправду.
 
Цитата
Старатель написал:
Sergey Gorokhov  ,
по-моему товарищ вас тролит, предлагая явно неработающий код (при этом утверждает, что чё-то там выводится) и отвлекая от  РАБОТЫ .
У вас ведь есть чем заняться? Ошибок-то в терминале полно! Надо исправлять.
Цитата
Optimus1 Optimus1   написал:
p_seccode_94="SBER"
p_classcode_95 ="TQBR"
Цитата
Optimus1 Optimus1   написал:
function OnQuote(class_code, sec_code)
if class_code== p_classcode_94  and sec_code==p_seccode_94 then      --94)SBER
Тут не может ничего выводиться по определению. Авто явно ммм... говорит неправду.

1)Стиратель не нужно пожалуйста поспешных выводов, с моей стороны это не более чем ошибка при копировании из блокнота:


p_classcode_94="TQBR"
p_seccode_94="SBER"

p_classcode_95="TQBR"
p_seccode_95="GAZP"

Или я единственный кто не может допустить ошибку ?

"Ошибок то в терминале полно" Надо исправлять" (с)
 
Скрытый текст

Optimus1 Optimus1,
ну так и приводите полный рабочий код того скрипта, на котором у вас возникает проблема, в удобочитаемом виде,
Скрытый текст
а не состряпаную из кусков разных программ портянку, где пустых строк больше, чем полезного кода. Вам самому-то удобно это читать?
Но я думаю, что вы уже поняли, что инкремент работает, как надо.
 
В том то и дело - не работает, как надо. Переменая M не меняется при прибавлении еденицы.  Так и должео быть ?
 
К сожалению, я не знаю как вам помочь.  :?:
Ваш код с исправленным p_classcode_94:
 
Заработало! В своем коде запутался блин. Извините.
 
Добрый день коллеги!

Подскажите pls, как в пользовательской таблице убрать первую колонку с нумерацией и заголовок?
 
Цитата
Kolossi написал:
Добрый день коллеги!

Подскажите pls, как в пользовательской таблице убрать первую колонку с нумерацией и заголовок?
Добрый день.
Такой возможности нет.
 
Почему-то не сомневался :(

Господа разработчики продукта!

Мы понимаем важность и сложность вашего труда и мелочность наших пожеланий.
Однако найдите немного времени, что бы хоть немного облегчить жизнь тем, кто имеет счастье писать скрипты на Qlua.
 Создав убогое подобие интерфейса в виде пользовательских таблиц пожалуйста сделайте шаг в сторону удобства и необходимых доработок:
1. Возможность убирать заголовок.
2. Возможность убирать столбец нумерации
3. Возможность привязывать таблицу к конкретной вкладке Quik.

Последнее особенно актуально ввиду полного бардака с размещением таблиц после перезагрузки.

Все это вам уже излагалось, однако может быть уже пора продвинуться дальше ответа "будет рассмотрено" ?
И может быть однажды мы дождемся чуда, которое позволит вводить данные в переменную непосредственно в ячейке таблицы ...
 
Цитата
Kolossi написал:
Почему-то не сомневался :(

Господа разработчики продукта!

Мы понимаем важность и сложность вашего труда и мелочность наших пожеланий.
Однако найдите немного времени, что бы хоть немного облегчить жизнь тем, кто имеет счастье писать скрипты на Qlua.
 Создав убогое подобие интерфейса в виде пользовательских таблиц пожалуйста сделайте шаг в сторону удобства и необходимых доработок:
1. Возможность убирать заголовок.
2. Возможность убирать столбец нумерации
3. Возможность привязывать таблицу к конкретной вкладке Quik.

Последнее особенно актуально ввиду полного бардака с размещением таблиц после перезагрузки.

Все это вам уже излагалось, однако может быть уже пора продвинуться дальше ответа "будет рассмотрено" ?
И может быть однажды мы дождемся чуда, которое позволит вводить данные в переменную непосредственно в ячейке таблицы ...
Доброе утро.

1. Убрать заголовок таблицы уже сейчас можно. Пункт меню Окна/Убрать заголовок.
2. Ваше пожелание зарегистрировано.  Мы постараемся рассмотреть его и  сообщить Вам результаты анализа. Впоследствии, по результатам анализа,  будет приниматься решение о реализации пожелания в будущих версиях ПО.
3. Ваше пожелание зарегистрировано.  Мы постараемся рассмотреть его и  сообщить Вам результаты анализа. Впоследствии, по результатам анализа,  будет приниматься решение о реализации пожелания в будущих версиях ПО.
 
Спасибо за ответ Егор.

Уже сейчас можно убрать заголовок средствами Qlua или вы рекомендуете мне убирать его вручную каждый раз после запуска скрипта?  
 
Разработчики плохо формулируют.

убрать заголовок средствами qlua нельзя. Можно сделать его пустым.  
 
Цитата
Kolossi написал:
Спасибо за ответ Егор.

Уже сейчас можно убрать заголовок средствами Qlua или вы рекомендуете мне убирать его вручную каждый раз после запуска скрипта?  
Добрый день.
При помощи LUA нельзя.

Зарегистрировали пожелание. Мы постараемся рассмотреть его и  сообщить Вам результаты анализа. Впоследствии, по результатам анализа,  будет приниматься решение о реализации пожелания в будущих версиях ПО.
 
Спасибо Егор.

Вдогонку зарегистрируйте пожалуйста еще необходимость позиционирования координат таблицы
функцией SetWindowPos() не относительно экрана, а относительно текущего окна Quik.
 Думаю всем понятно почему.
 
Цитата
Kolossi написал:
Спасибо Егор.

Вдогонку зарегистрируйте пожалуйста еще необходимость позиционирования координат таблицы
функцией SetWindowPos() не относительно экрана, а относительно текущего окна Quik.
 Думаю всем понятно почему.
Здравствуйте!

Ваше пожелание зарегистрировано.  Мы постараемся рассмотреть его и  сообщить Вам результаты анализа. Впоследствии, по результатам анализа,  будет приниматься решение о реализации пожелания в будущих версиях ПО.
Страницы: 1
Читают тему (гостей: 1)
Наверх