Интерактивная работа с QLua

Страницы: 1
RSS
Интерактивная работа с QLua
 
Написал себе скрипт для интерактивной работы с QLua, возможно пригодится кому-то еще (иногда бывает нужно что-то быстро попробовать не строча полноценный скрипт).  Код лежит на GitHub (хотел разместить прямо здесь, но (по крайней мене при нажатии кнопки "Просмотр") в случайных местах кода появлялись символы пробела - не понял, почему).

Для использования запускаем Quik из командной строки.  То есть открываем окошко для ввода команд, пишем:
Код
C:\Windows\system32> chdir \Path\to\Quik\dir
C:\Path\to\Quik\dir> info.exe
Далее из Quik запускаем qlua-console.lua, в терминале появляется приглашение для ввода.  Можно исполнять любой код Lua, вызывать функции QLua и определять callbacks.  Дополнительно доступна функция qluaDump(...) - возвращает строковое представление переданных аргументов.  Например:
Код
qlua> 2 + 3
5
qlua> getClassesList()
'CROSSRATE,EQOB,RPMA,RPMO,EQDB,SMAL,EQQI,OQQI,INDX,TQBR,TQOB,TQQI,TQDE,SPBFUT,SPBOPT,RTSIDX,CETS,INSTR,EQRP_INFO,TQIF,TQTF,INSTRCETS,'
qlua> getSecurityInfo("TQBR", "GAZP")
{ sec_code='GAZP', face_unit='SUR', class_code='TQBR', code='GAZP', scale=2, face_value=5, short_name='ГАЗПРОМ ао', lot_size=10, name='"Газпром" (ПАО) ао', min_price_step=0.01, isin_code='RU0007661625', class_name='МБ ФР: Т+ Акции и ДР', mat_date=20171220 }
qlua> function OnParam(c, s) 
   2> print(qluaDump(c, s, getParamEx2(c, s, "LAST")))
   3> end
qlua> 
и в терминал посыплются строки вида
Код
'TQBR', 'TRNFP', { param_type='1', param_value='178600.000000', result='1', param_image='178 600' }
'TQBR', 'VTBR', { param_type='1', param_value='0.046810', result='1', param_image='0,04681' }
'TQOB', 'SU24019RMFS0', { param_type='1', param_value='102.537000', result='1', param_image='102,5370' }
'CETS', 'EURUSD000TOM', { param_type='1', param_value='1.193400', result='1', param_image='1,193400' }
'TQOB', 'SU26219RMFS4', { param_type='1', param_value='102.300000', result='1', param_image='102,3000' }
'TQBR', 'SBER', { param_type='1', param_value='223.330000', result='1', param_image='223,33' }
'TQBR', 'SNGSP', { param_type='1', param_value='28.005000', result='1', param_image='28,005' }
'TQBR', 'RSTI', { param_type='1', param_value='0.820100', result='1', param_image='0,8201' }
'CETS', 'EURUSD000TOM', { param_type='1', param_value='1.193400', result='1', param_image='1,193400' }
'TQBR', 'AFLT', { param_type='1', param_value='138.950000', result='1', param_image='138,95' }
'TQBR', 'GAZP', { param_type='1', param_value='130.300000', result='1', param_image='130,30' }
'TQBR', 'HYDR', { param_type='1', param_value='0.727000', result='1', param_image='0,7270' }

Для остановки callback присваиваем ему nil (бесстрашно вводим код пока в терминале продолжается выхлоп от OnParam - в реале, конечно, нужно в файл выводить):
Код
qlua> OnPa ram = nil
qlua>
(выхлоп прекращается).  Ну и т.д.

Для завершения работы набираем "quit":
Код
qlua> quit
qlua terminated
Если вдруг по привычке нажмете кнопку "Остановить", то нужно будет в терминале нажать <Enter>, чтобы main() вышла из io.stdin:read() (не нашел изящного способа это побороть, не прибегая к внешним библиотекам).

Следует заметить, что локальные переменные видны только до следующего qlua> (они локальны внутри chunk), поэтому
Код
qlua> local v = 5
qlua> print(v)
nil
qlua>
Но:
Код
qlua> local v = 5; print(v)
5
qlua> do
   2> local v = 5
   3> print(v)
   4> end
5
qlua>
Все как и в обычном интерпретаторе Lua, запущеном в интерактивном режиме.
 
Цитата
kroki написал:
Код
qlua> OnPa ram = nil
Ага, вот такие вот пробелы и появляются - почему?! :(
 
Код
qlua> OnPa ram = nil
qlua>
 
kroki,
Действительно появляется пробел.
Спасибо за обращение
Будем разбираться.
 
Спасибо, ценный скрипт.
 
Не запускался в старой версии, обновился до 7.19.0.51, все равно не запускается. Нажимаю на Запустить и остается остановленным, в логе  пусто.
Проверил кодировку, запустил консоль от админа.
Что то доставить надо?

PS и эту тему если вариант рабочий возможно стоит прикрепить вверху, как важную. Также неплохо бы разработчикам сделать консоль штатно - это сэкономит время не только пользователям, но и техподдержке.
 
Цитата
qt написал:
Не запускался в старой версии, обновился до 7.19.0.51, все равно не запускается. Нажимаю на Запустить и остается остановленным, в логе  пусто.
Проверил кодировку, запустил консоль от админа.
Что то доставить надо?
Доставлять ничего не нужно.  У меня Quik 7.16.3.14, скрипт работает.  Сам Quik нужно запускать из командной строки, если вы так и сделали, то в чем может быть проблема я не знаю...
 
QUIK 7.23.1.4
Скрипт-то запускается, но сразу же останавливается.
cwrite ничего не кажет.
Выходит по условию
Код
if stop or c == nil or string_match(c, "^%s*quit%s*$") then
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:
QUIK 7.23.1.4
Скрипт-то запускается, но сразу же останавливается.
cwrite  ничего не кажет.
Выходит по условию
Код
   if  stop  or  c  =  =   nil   or  string_match(c,  "^%s*quit%s*$" )  then   

Да, вы правы.  Под Wine под Linux все работает (пробовал 7.14, 7.16, 7.23), но сейчас попробовал под настоящей виндой в VirtualBox - под Windows в QLua не работает даже такой простой скрипт:
Код
assert(io.write("io.write()\n"))
local r = io.read()
error("io.read() returned "..tostring(r))
io.write() ничего не выводит (хотя и не выдает ошибку), io.read() ничего не читает и возвращает nil (пробовал и под cmd, и под command).  Ну, как тут помочь я не знаю...
 
В догонку: я так понимаю, Quik не закрывает консольные потоки ввода/вывода (иначе и под Linux/Wine бы не работало без их переоткрытия).  Возможно проблема в cmd/command, и быть может поможет установка под Windows нормальной оболочки типа Bash.  А может и нет...
Страницы: 1
Читают тему
Наверх