Если содержимое необходимого файла известно скрипту без его открытия (т.е. не требуется распаковывать архив), можно сохранять новое содержимое в файл с нужным именем в любом месте, а потом вызывать консольную команду добавления к архиву ( "7z.exe" или т.п. ).
А если требуется распаковка, то, возможно, это можно так же точечно сделать через консольную команду.
Иван Ру написал: При предложенном Вами исполнении, Павел Bosco, функция InitEveryDay будет вызваться в лучшем случае единожды за все время работы скрипта -- тогда когда будет впервые установлено соединение с сервером. Выше несколько раз было сказано, что необходима ежедневная реинициализация параметров, т.е. многократное обращение к функции InitEveryDay
В Вашем изначальном варианте InitEveryDay точно так же вызывается единожды при старте скрипта.
Если требуется "ежедневная переинициализация" в InitEveryDay ● проверяйте isConnected() ● проверяйте дату торгов getInfoParam ("TRADEDATE ") и если она измененилась по сравнению с предыдущей запомненной делайте, что Вам требуется ● если работаете из одного и того же часового пояса, проверяйте локальное время, почему нет! ● откажитесь от рекурсии, она вводит Вас в заблуждение. Сейчас у Вас в коде рекурсия ради рекурсии, а не достижения цели. Обычный while вполне сгодится.
Иван Ру написал: "Во вторых, как уже было сказано, нежелательно их использовать только в колбеках, а значит..." Насколько я понимаю, функцию InitEveryDay, где имеется рекурсия не относится к коллбэкам.
А вызываете Вы её как раз в коллбэке - в OnInit
Цитата
Иван Ру написал: function OnInit() ... InitEveryDay () -- ежедневная инициализация end
Let_it_go написал: Почему второй принт выводит 2, а не 1? Ведь во второй строчке идёт обнуление переменной i. Она не может сохранить старое значение 1 и превращается в 0. Откуда 2?
Получается, что 1 будут выводить только такие принты, в которых будет создаваться новый экземпляр newCounter вместе с новым нулевым i:
SDL написал: Потому что функция c1, которая создана вызовом newCounter(), - не простая функция, а т.н. "замыкание". Она не просто может сохранить старое значение 1, она это делает, т.к. переменная i является для этой функции внешней, и именно для этого подобные конструкции и предусмотрены. См., например: https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BC%D1%8B%D0%BA%D0%B0%D0%BD%D0%B8%D0 %B5_(%D0%BF%D1%80%D...
Для создание заявок из внешних программ, возможно, стоит взглянуть на Trans2QUIK API Trans2QUIK.dll. или Импорт транзакций (tri/tro-файлы). Описаны в Руководстве пользователя QUIK (info.chm) Раздел 6. Совместная работа с другими приложениями. Примеры там же. Но тогда не доступны все плюшки QLua по получению графиков, инфы о портфеле и инструментах.
Если всё-таки через файл, то придётся придумывать свой протокол.
Алексей Шабашов написал: Доброго всем дня. 1. Я правильно понимаю, что другая программа никак не может взаимодействовать с lua-скриптом в Квике? 2. Что если так: внешняя программа пишет в файл, а скрипт проверяет в цикле содержимое файла - как увидел нужное значение - запустил функцию - отписал в этот файл результат. Как думаете возможно такое? Заранее спасибо.
Добрый день!
1. Что подразумеваете под "взаимодействием"? Обмен информацией, запросы, вызов команд? 2. Да, такое вполне возможно. Аналогично использованию файловой системы можно задействовать базу данных, сокеты, человека, ...
vgi написал: Вот как можно делать с key-value таблицами Lua, когда key - это строка:
Код
local key = "TheKey"
local t = { key = "value" }
print ( t[key] ) -- 1ый вариант, через квадратные скобки, используя имя ключа
print ( t.TheKey ) -- 2ой вариант, через точку, используя сам ключ
Во втрой строке должно быть естественно
Код
local t = { [key] = "value" }
-- или
local t = { TheKey = "value" }
Вот как можно делать с key-value таблицами Lua, когда key - это строка:
Код
local key = "TheKey"
local t = { key = "value" }
print( t[key] ) -- 1ый вариант, через квадратные скобки, используя имя ключа
print( t.TheKey ) -- 2ой вариант, через точку, используя сам ключ
Андрей написал: где можно посмотреть чем отличаются различные модули квика при обновлении, это где то пишется? Я тупо обновляю программу, что приходит, а что там обновилось не имею представления. Может где то можно почитать или это не имеет особого значения при работе программы?
Zoya Skvorcova написала: ... В тоже время возможности сделать "всё и сразу" мы не имеем ...
Наконец-то исчерпывающий ответ на пресловутый вопрос "Почему в QUIKе до сих пор не ... ?". Стоит сохранить ссылку на него, и репостить при очередной необходимости.
Kolossi написал: Добрый день ! Столкнулся с проблемой при использовании данной функции. ... y=getDepoEx ("MC0003300000", "555555", "SU26225RMFS1", "L01-00000F00", 2).currentbal
Добрый день!
Вы любите рисковать)) В lua, как в динамически типизированном языке, стоит всегда добавлять проверки на null, а потом уже доставать из переменной значения, как из таблицы:
Код
local depo = getDepoEx ("MC0003300000", "555555", "SU26225RMFS1", "L01-00000F00", 2)
local currentbal = depo and depo.currentbal
or 0 -- например
Юрий С написал: К сожалению столкнулся сразу же со следующей проблемой : при незначительных изменениях в исходном тексте программы: сделал ошибку, исправил, заново скрипт не запустился, выдал ошибку: Unknown error. Possible unhandled exeption Вернулся к исходному тексту вашей программы. скрипт запускаться так же не желает ошибка та же : Unknown error. Possible unhandled exeption И только после перезагрузки Квика , скрипты запускаться стали. Почему так происходит ?
Понять, почему так получается, не удалось, впрочем, сильно не разбирался. Лечится только перезапуском Квика. Спрашивать у АРКИ об этой проблеме бесполезно, т.к. она возникает из-за сторонней библиотеки. Стоит сделать так: отладить скрипт, максимально исключив возможное появление подобной ошибки. Далее работает вполне стабильно, немного утомляя из-за однопоточности и sleep после iup.LoopStep() .
vgi написал: iup входит в стандартную LuaForWindows 5.1.4.0
Подскажите, плиз, где скачать LuaForWindows 5.1.4.0 и как установить его в квике, насколько я понял луа в квике встроенный , у меня установлен квик версии 7.18.1.20, но он на iup ругается не видит модули ?
Скачиваете, устанавливаете. В скрипте не забудьте добавить путь к LuaForWindows в package.path. Захочется добавить в окошки что-то поинтереснее - документация очень хорошая, исчерпывающая, будет лежать в каталоге установленной LuaForWindows.
Юрий С написал: Т.е. если я правильно понял средствами QLua невозможно вывести окно, как например в Java, в котором будут например две кнопки "Да" и "Нет" и проанализировать какая из них нажата ?
Да можно, конечно. Вот же
Цитата
_sk_ написал: Для реализации диалогов и окон мы пробовали использовать библиотеку iplua. Только интерфейс при этом тормозит из-за особенностей многопоточности в QLua в нашей конкретной реализации.
Только библиотека называется iup.
Код
require("iuplua")
require("iupluacontrols")
local iup = iup
local function initializeDialog()
local btn_addSec = iup.button { title = "Add security" }
function btn_addSec:action()
iup.Message(config.name, self.title..":action()")
end
local vbox = iup.vbox{
iup.button{ rastersize = "700x100", title = "1", },
iup.button{ rastersize = "700x100", title = "1", },
iup.button{ rastersize = "700x100", title = "1", },
iup.button{ rastersize = "700x100", title = "1", },
iup.button{ rastersize = "700x100", title = "1", },
btn_addSec
;margin="5x5", gap="2", scrollbar = "VERTICAL",
}
local dlg = iup.dialog{ vbox; title = config.name,
--size = "HALFxQUARTER",
rastersize = "800x300",
}
function dlg:close_cb()
local a = iup.Alarm( dlg.title, "Завершить работу?", "Да", "Нет" )
if a == 1 then
interrupted = true
return iup.CLOSE
else
return iup.IGNORE
end
end
return dlg
end
function main()
local dlg = initializeDialog()
dlg:show()
while not interrupted do
iup.LoopStep()
sleep(50)
end
dlg:hide()
dlg:destroy()
end
Женя Логинов написал: Через настройки получения данных отключены все рынки кроме ФОРТС, в рынке выбран только один инструмент - фьюч сбера; выбраны параметры лучшие цены спроса и предложения, и размеры спроса и предожения. Обезличенные сделки-отключены все рынки. Таким образом, думаю я исключил получение левых данных. В терминале открыт стакан по выбранному фьючерсу. В коде я задал переменные для класса и кода бумаги. И если удалось подписаться на заданный стакан, то ду вайл...
Это всё равно, что вместо вентиля на смесителе, перекрывать подачу на водоснабжающей станции, чтобы уменьшить напор воды в кране.
Цитата
Женя Логинов написал: То есть даже для 10 бумаг нужно прописать все 10 проверок- выглядит не очень удобно. Или же есть другой способ?Спасибо
Можно создать таблицу с ключами из seccode+classcode и значениями в виде методов, которые выполняют нужные дейтсвия, и вызывать эти методы прямо в onQuote, если не жалко основной поток QUIKа.
новичок написал: почекать пару раз в год такая уж проблема?
Любопытная вообще концепция, 1. Удалить вручную пару файлов. 2. Отключить вручную обновления. 3. Не забыть что уже полгода не чекал (других забот человеку мало))) Возникает на самом деле вопрос о квалификации того кто такой дистр собрал. ИМХО разумеется.
Вы можете обратиться к своему брокеру, чтобы он исключил файл WinRos.exe из списка файлов обновления. Сошлитесь на эту ветку обсуждения, но скорее всего ответ будет отрицательным, потому что "вдруг кто-то ещё использует".
1. Позвонить брокеру, пусть разорвёт ту сессию. 2. Или заранее, если возможно, сделать удаленный доступ из дома к компьютеру на работе. Тогда можно будет подключиться и закрыть Квик самому. 3. Можно наоборот - сделать удаленный доступ с работы на домашний компьютер. Пусть он постоянно работает, а Вы подключайтесь к нему по удаленке и работайте в Квике. 4. Если оставленный на работе Квик - не проблема безопасности [для Вас], брать у брокера 2 Квика, привязанных к одним счетам. Пусть один запущен на работе, другой - дома. Торгуйте и там и там одновременно.
local str = "Here it is not necessary to remove[it should be removed] this is also not necessary [kasjdhkjadhkajsh]to (sdlfjsdlk!@kdlsaj) remove"
print("origin str: ",str)
str = str:gsub("%[[^]]*%]",""):gsub("%([^)]*%)","") -- remove all occurencies of [substr] and (substr)
print("gsubed str: ",str)
out: D:\lua\tmp>lua tmp_20181112.lua origin str: Here it is not necessary to remove[it should be removed] this is also not necessary [kasjdhkjadhkajsh]to (sdlfjsdlk!@kdlsaj) remove gsubed str: Here it is not necessary to remove this is also not necessary to remove
Zoya Skvorcova написала: В настройках терминала Вы можете задавать иные горячие клавиши
Зоя, сожалею, что приходится писать в тему с таким "эмоциональным" названием, но подскажите, как задать сочетание клавиш для вызова окна доступных lua-скриптов? При поиске в редакторе по сочетаниям клавиш и описаниям команд строки "lua" пусто, в то время как Qpile-скрипты оккупируют Ctrl+F11. Но Qpile мертв, в отличие от QLua. Если через Редактор горячи клавиш это сейчас не возможно, то просьба также добавить в пожелания на доработку возможность назначать сочетание и для вызова lua-скриптов, а ранее зарегистрированое пожаление на назначение сочетания именно Ctrl+F12 для вызова Lua-скриптов тогда можно закрыть.
local graphic_id = "RIZ8_PRICE_M1"
function main()
local N=getNumCandles(graphic_id)
local t,n,l=getCandlesByIndex(graphic_id, 0, N-2, 2)
if t[0].low>t[1].low
and (t[1].high-t[1].low)/3>(t[1].high-t[1].close)
then
message("Возможна точка входа на "..graphic_id..", BUY!",2)
end
end
А что у Вас в Options - Open lua.properties в command.go.*.lua ? Опять с путями к lua.exe проблема, судя по всему. Добавьте путь к lua.exe в переменные среды, а в SciTe в lua.properties в command.go.*.lua поставьте lua как тут:
Задавайте идентификатор графика в QUIKе в виде SECCODE_INDICATOR_TIMEFRAME_PARAMS, напр RIZ8_MACD_60_15 или SiH0_PRICE_1D А потом в Lua, перебирая все заданные вами идентификаторы графиков, парсите их, получая, соответственно, инструмент, тип графика(индикатора), таймфрейм и список параметров.
Виктор Столетов написал: можно выделить блок текста и нажать Tab. Но тогда сдвигает блок на целых четыре клетки. Вопрос: можно ли сдвинуть блок текста вправо всего на одну клетку?
Что Вы подразумеваете под "клеткой"? Если это "пробел", то сделайте в "Опции - Настройки... - Синтаксисы - Настройка Табуляции - Размер табул. 1 и √ Заменить пробелом" и табайте блоки на один пробел влево-вправо.
1) c:\dir > lua.exe hello.lua Прямо так и запускали? =) Так разве вообще можно?
2) C:\Program Files\Lua\5.1>lua.exe hello.lua Из той же оперы(про ">"), наверное. У меня на такое пишет: "C:\Program" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.
3) C:\Program Files\Lua\5.1\lua.exe hello.lua Надо было так: "C:\Program Files\Lua\5.1\lua.exe" hello.lua
А вообще лучше C:\Program Files\Lua\5.1\lua.exe добавить в переменные среды, и тогда можно будет запускать скрипты из любого места так: lua script.lua
Enfernuz написал: pcall принимает функцию, значит, нужно передать ему функцию:
Код
pcall ( function () foo("privet) end )
Такое обворачивание нужно только для xpcall, который в Lua 5.1 ещё не умеет принимать аргументы для принимаемой функции (в Lua 5.2 уже умеет).
Для pcall достаточно делать так:
Скрытый текст
Код
local f = function(...)
if #{...} == 0 then
error("no args!")
else
return ...
end
end
print("pcall(f) with args")
local res,return1,return2 = pcall( f, "arg1", "arg2" )
if res then
print(return1,return2)
else
print("ERROR: ",return1)
end
-- pcall(f) with args
-- arg1 arg2
print("pcall(f) with no args. Catch exception")
local res,return1,return2 = pcall( f )
if res then
print(return1,return2)
else
print("ERROR: ",return1)
end
-- pcall(f) with no args. Catch exception
-- ERROR: D:\PATH\TO\source.lua":3: no args!
Проблема, имхо, в том, что в таблице FUTURES_CLIENT_HOLDING присутствуют "технические лимиты" по фьючам, у которых Торговый счет - это строка из цифр, которые не должны отображаться обычным пользователям, и количество которых изменяется после загрузки лимитов по фьючам в Квик.
К примеру, у меня количество FUTURES_CLIENT_HOLDING выросло после старта торгов с 264 до 275, при этом сразу долгое время прыгало с 264 на 265 и обратно.
Скрытый текст
Код
local Misc = require("Misc")
local function writeTtoFile(fn)
local f = io.open(fn,"w+")
for i=0,getNumberOf("FUTURES_CLIENT_HOLDING")-1 do
local t = getItem("FUTURES_CLIENT_HOLDING",i)
f:write(Misc.asString(t),"\n")
end
f:close()
end
local function run()
local _c
local _t = os.time()
local c_err = 0
while true do
local c = getNumberOf("FUTURES_CLIENT_HOLDING")
if _c ~= c then
message("c = "..tostring(c),1)
if _c then c_err = c_err + 1 end
_c = c
--message( "_c ~= c "..tostring(_c).." ~= "..tostring(c), 3 )
local fn = getScriptPath().."\\FUTURES_CLIENT_HOLDING\\FUTURES_CLIENT_HOLDING_"..os.date("%Y%m%d_%H%M%S")..".lua"
writeTtoFile(fn)
end
sleep(10)
local time = os.time()
if time - _t > 10 then
message("Количество неправильных количеств: "..tostring(c_err).." (_c = "..tostring(_c)..")",1)
_t = time
end
end
end
function main()
local ok,res = pcall(run)
if not ok then
message( tostring(res),3 )
message( tostring(debug.traceback()),3 )
end
end