201

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

kalikazandr спасибо огромное! извините я только учусь LUA и в процессе обучения пытаюсь что-то сотворить. Все работает, так как я и хотел, только один вопрос, а значение спроса только так можно сделать? в окне типа Edit это не получится? может табличное одно окошко типа StringGrid можно делать? хотелось бы визуализацию значения изменить.

202

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

diksan пишет:

kalikazandr спасибо огромное! извините я только учусь LUA и в процессе обучения пытаюсь что-то сотворить. Все работает, так как я и хотел, только один вопрос, а значение спроса только так можно сделать? в окне типа Edit это не получится? может табличное одно окошко типа StringGrid можно делать? хотелось бы визуализацию значения изменить.

Не совсем понятно, что вам надо, там и так в Edit значение спроса меняется или вы первый вариант успели скачать, где в Label идет отображение спроса?. В StringGrid тоже можно, но как-то не пользовался ей.

203

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

ну в том варианте что вы откорректировали нет окошка, там запись просто в строке

204

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

минуту посмотрю второй вариант, там просто раньше другой код был

205 (2015-10-07 17:32:31 отредактировано diksan)

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

да это оно! СПАСИБО! а так надо расписать для каждого нужного параметра? Именно этот блочок -
   if old_biddeptht ~= biddeptht then
      Edit_biddeptht.Text = biddeptht
      old_biddeptht = biddeptht
   end

естественно с изменением biddeptht
да?

206

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

diksan пишет:

минуту посмотрю второй вариант, там просто раньше другой код был

У Label меняется поле caption, у Edit - поле Text

207 (2015-10-07 17:39:37 отредактировано kalikazandr)

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

diksan пишет:

да это оно! СПАСИБО! а так надо расписать для каждого нужного параметра? Именно этот блочок -
   if old_biddeptht ~= biddeptht then
      Edit_biddeptht.Text = biddeptht
      old_biddeptht = biddeptht
   end

естественно с изменением biddeptht
да?

Да, для каждого параметра делать проверку изменения. Правда, если в Edit будет функция Handler, которая реагирует на изменения, не известно как себя поведет mainForm в этом случае, если параметров будет много меняться, думаю, что зависнет, хотя не факт, не проверял.

208

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

Ок все отлично! Большое спасибо!

209

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

diksan пишет:

Ок все отлично! Большое спасибо!

рад был помочь

210 (2015-10-08 02:08:37 отредактировано diksan)

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

kalikazandr еще такой вопрос, а не знаете как Экономический календарь прикрутить к интерфейсу, например такой [url]http://ru.investing.com/economic-calendar/[/url]    Там есть код на календарь, его нельзя всунуть на страницу mainForm? и еще пока с сохранением в файл config.cfg разбираюсь. Файл создается, но значений не прописывается. И выдает ошибку! а в файле вот что:
config =
{
    SEC_CODE=,    ACCOUNT=,    CLASS_CODE=,    CLIENT_CODE=}

Я правильно в Handler прописываю кнопку на сохранение файла?

function Handler(Sender,...)
local SN=Sender.Name
  if SN == "Button_save" then mySave("\\config.cfg")    Log(0,"Значения из таблицы сохранены в файл  ",getScriptPath().."\\config.cfg") end

или просто можно? if SN == "Button_save" then mySave() end
но все равно ошибка вот в этой строке что вы давали:
  os.remove (file_name)  --удаляем файл перед созданием нового

пишет в ошибке: bad argument #1 to 'remove' (string expected, got nil) Cant call the Lua function!

211

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

diksan пишет:

пишет в ошибке: bad argument #1 to 'remove' (string expected, got nil) Cant call the Lua function!

Наверное, потому, что вы в os.remove передаете строку а не путь к файлу, странно, почему в файл вообще запись идет.
В начале скрипта:
local path = getScriptPath().."\\config.cfg"
В Handler:
if SN == "Button_save" then mySave( path )    Log(0, "Значения из таблицы сохранены в файл  ", path ) end
На счет пустой таблицы в файле - на момент сохранения в переменных SEC_CODE и т.д. стоит значение по умолчанию: "".
Надо  в хандлере явно присваивать значения.

По хорошему ваш робот должен при запуске загружать настройки из файла и если таковых нет то принимать значения по умолчанию. И таблица с настройками по идее должна так выглядеть:

config =
{
     --общие настройки:
     CLASS_CODE = "SPBFUT",
     CLIENT_CODE=clientcode,
     --настройки инструментов (только не изменяемые параметры):
     RiZ5 = {STEP = step, SCALE=scale},
     RiU5 = {STEP = step, SCALE=scale}--и т.д.
}

Перед созданием формы, проверять по каким инструментам есть настройки и выводить их в ComboBox-е. Естественно надо mySave делать свою под конкретную задачу.


На счет календаря - да можно конечно, скачивать и парсить HTML страницу и в StringGrid выводить. Только не подскажу как.

212 (2015-10-08 18:16:24 отредактировано diksan)

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

kalikazandr не подскажете, чтобы взять инфо из таблицы quik - "Ограничения по клиентским счетам", надо воспользоваться функцией getPortfolioInfo или getItem? нужно получить Текущие денежные средства, Текущие чистые позиции, Лимит открытых позиций и т.д.

213

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

diksan пишет:

kalikazandr не подскажете, чтобы взять инфо из таблицы quik - "Ограничения по клиентским счетам", надо воспользоваться функцией getPortfolioInfo или getItem? нужно получить Текущие денежные средства, Текущие чистые позиции, Лимит открытых позиций и т.д.

getPortfolioInfo для акций
я такой пользуюсь

function futures_client_limits ()
    repeat item = getItem ("futures_client_limits", 0)
    until item ~= nil
    return item
end

214 (2015-10-09 02:10:31 отредактировано diksan)

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

А как из этой таблицы futures_client_limits параметр вытащить (например cbplused)? так как мы делали с getParamEx. Я хочу его значение также в окошко Edit впихнуть.

215 (2015-10-09 16:18:51 отредактировано diksan)

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

kalikazandr и еще можете сбросить правильный код function Log(), он запрашивается при нажатии кнопки Save для сохранения файла config.cfg?

216

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

diksan пишет:

kalikazandr и еще можете сбросить правильный код function Log(), он запрашивается при нажатии кнопки Save для сохранения файла config.cfg?

У меня нет ни правильного ни не правильного кода Log(), у меня роботы не пользуются cofig-ами, а сразу торгуют по всем доступным инструментам и не выводят никакой отладочной информации, и тем более не используют GUI для отображения каких-то там данных, так как это монстры, которые жрут непомерно полезное время.
И вам не советую заниматься разработкой ерунды, которой вы сейчас занимаетесь.
Для отображения данных достаточно таблиц/графиков терминала, вот там и надо смотреть как торгуют роботы.

local fc_lim = futures_client_limits ()
local cbplused = fc_lim.cbplused

217

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

Подход понятен.

В автомобиле у вас вместо сидения лавка, окна не открываются и музыки нет. Спидометр жрет электричество от аккумулятора, кондиционер - это для бездуховных растленных буржуев. Гидроусилитель руля - это для слабых духом.

Ну что же - тоже позиция.

218 (2015-10-10 03:00:53 отредактировано diksan)

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

kalikazandr  Позиции по клиентским счетам (фьючерсы) сделал, все пошло, спасибо! Все с файлом настроек пока долбаюсь, выдает ошибку и все тут.

219 (2015-10-10 03:12:38 отредактировано diksan)

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

getClassSecurities

Функция предназначена для получения списка кодов бумаг для списка классов, заданного списком кодов. Коды бумаг в списке разделяются запятой «,». В конце полученной строки всегда дописывается символ «,».

getClassSecurities (STRING)

Пример:

sec_list = getClassSecurities("SPBFUT")

В результате выполнения приведенной строки кода, переменная sec_list содержит строку вида:

RSH3,VBZ2,O4Z2,O2Z2,SiM3,SiH3,SiF3,RIH3,RIM3,LKH3,LKZ2,GDZ2,GMZ2,GZH3,GZZ2,EuZ2,EDZ2,SiZ2,RIZ2,

А как сделать, чтобы они в ComboBox в кавычках выходили? и в интерфейсе в окне ComboBox-а их выбрать можно было отдельно?

220 (2015-10-10 23:37:41 отредактировано diksan)

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

kalikazandr пишет:

Перед созданием формы делаете проверку на наличие файла с настройками:

Сохраняем настройки в файл при нажатии кнопки Save (mySave вызывается в Handler-е):

function mySave(table_name, file_name)
  os.remove ( file_name )--удаляем файл перед созданием нового
  local t = {ACCOUNT = ACCOUNT, CLIENT_CODE = CLIENT_CODE, SEC_CODE = SEC_CODE, CLASS_CODE = CLASS_CODE}
  local f, err = io.open (file_name, "w")
  if not f then
     return nil, err
  end
  local res = {}
  f:write ( table_name.." =\n{\n" )
  for k, v in pairs ( t ) do
    res[#res + 1] = "\t"..k.."="..v
  end
  f:write ( table.concat ( res, "," ) )
  f:write ("}"); f:flush (); f:close ()
  return true
end
--и вызов:
mySave ( "config", file_name )

kalikazandr файл сохраняется с данными все ок. А можешь дать код для его загрузки? function myLoad

Вот я "творил" но выдает ошибку

function myLoad((file_name)
   local f,err = io.open(file_name, "r")
   if not f then
      return nil,err
   end
   local table_name = assert(loadstring("return " .. f:read("*a")))
   f:close()
   return table_name()
end

221

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

Вы очень не внимательны, я уже давал вам пример чтения из файла таблицы, которым пользуюсь я. [url]http://quik2dde.ru/viewtopic.php?pid=1642#p1642[/url].
Вот в этой строчке у вас лишняя скобка function myLoad((file_name)
В любом случае для чтения таблицы, записанной именно в таком формате не подойдет эта конструкция - assert(loadstring("return " .. f:read("*a")))
И давайте без панибратства.

222

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

s_mike пишет:

Подход понятен.

В автомобиле у вас вместо сидения лавка, окна не открываются и музыки нет. Спидометр жрет электричество от аккумулятора, кондиционер - это для бездуховных растленных буржуев. Гидроусилитель руля - это для слабых духом.

Ну что же - тоже позиция.

Сарказм принят. Наверное вас удивит мой не обдуманный поступок, но я продал свои машины соседу и нанял его на работу водителем.

223

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

kalikazandr пишет:

Вы очень не внимательны, я уже давал вам пример чтения из файла таблицы, которым пользуюсь я. [url]http://quik2dde.ru/viewtopic.php?pid=1642#p1642[/url].
Вот в этой строчке у вас лишняя скобка function myLoad((file_name)
В любом случае для чтения таблицы, записанной именно в таком формате не подойдет эта конструкция - assert(loadstring("return " .. f:read("*a")))
И давайте без панибратства.

Извините!!! я бы не спрашивал повторно, если бы ваш код по загрузке и выгрузке файла настроек заработал.

224

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

diksan пишет:

Извините!!! я бы не спрашивал повторно, если бы ваш код по загрузке и выгрузке файла настроек заработал.

У меня прекрасно работает и приведенный пример тоже. Ошибку выдает какую ?

225

Re: Визуальный интерфейс QVCLua: обсуждения, замечания, предложения

kalikazandr пишет:
diksan пишет:

Извините!!! я бы не спрашивал повторно, если бы ваш код по загрузке и выгрузке файла настроек заработал.

У меня прекрасно работает и приведенный пример тоже. Ошибку выдает какую ?

Ну вот код программы

local VCL=require "qvcl"

local path = getScriptPath().."\\config.cfg"
local stopped
function OnStop()
    if mainForm then mainForm:Release(); mainForm = nil; VCL = nil end
    message("Робот отключен пользователем")
    stopped = true
end
--================================== Параметры =========================================

ACCOUNT                 = "";          -- Торговый счет
CLIENT_CODE             = "";          -- Код клиента
SEC_CODE                = "";          -- Код бумаги
CLASS_CODE              = "";          -- Код класса


--================================== Функции =================================

function Log (ad,...)
    local str="";
    for i=1,arg.n do
        if arg[i] ~= nil then str=str..tostring(arg[i]) end
    end
end

function Handler(Sender,...)
local SN=Sender.Name  --получает имя поля (EditButton, ComboBox, FloatSpinEdit и т.д)
   if SN == "Button_exit" then OnFormClose() end
   if SN == "Button_save" then SaveToFile("config.cfg")    Log(0,"Значения из таблицы сохранены в файл  ", path) end
   if SN == "Button_load" then LoadFromFile("config.cfg")    Log(0,"Значения загружены в таблицу из файла  ", path) end
   if SN == "EditButton_account" then
      ACCOUNT = EditButton_account.Text
   elseif SN == "EditButton_client_code" then
      CLIENT_CODE = EditButton_client_code.Text
   elseif SN == "EditButton_sec_code" then
      SEC_CODE = EditButton_sec_code.Text
   elseif SN == "ComboBox_class_code" then
      CLASS_CODE = ComboBox_class_code.Text
   end
end

--================================== Интерфейс =================================

mainForm = VCL.Form({Name = "mainForm", Height = 150, Width = 600, Caption = "Робот",
Position = "", OnClose = OnStop})--тут просто вызываем OnStop()

Button_save = VCL.Button(mainForm, {Name = "Button_save",  top=100, left=130, Caption="Сохранить", Width=80, Enabled = true, OnClick = Handler, ShowHint=true, Hint="Запись значений таблицы в файл"})
Button_load = VCL.Button(mainForm, {Name = "Button_load",  top=100, left=350, Caption="Загрузить", Width=80, Enabled = true, OnClick = Handler, ShowHint=true, Hint="Загрузка значений в таблицу из файла"})

Label_account = VCL.Label(mainForm, {Name = "Label_account", top=10, left=10, Caption="Торговый счет", ShowHint=true, Hint=" Элемент Label"})
EditButton_account = VCL.EditButton(mainForm, {Name = "EditButton_account", top=10, left=110, Width=90, ShowHint=true, OnButtonClick = Handler, Hint="Элемент EditButton"})   -- Выбор торгового счета
Label_client_code = VCL.Label(mainForm, {Name = "Label_client_code", top=10, left=240, Caption="Код клиента", ShowHint=true, Hint=" Элемент Label"})
EditButton_client_code = VCL.EditButton(mainForm, {Name = "EditButton_client_code", top=10, left=330, Width=90, ShowHint=true, OnButtonClick = Handler, Hint="Элемент EditButton"})   -- Выбор кода клиента
Label_sec_code = VCL.Label(mainForm, {Name = "Label_sec_code", top=40, left=10, Caption="Код бумаги", ShowHint=true, Hint=" Элемент Label"})
EditButton_sec_code = VCL.EditButton(mainForm, {Name = "EditButton_sec_code", top=40, left=110, Width=90, ShowHint=true, OnButtonClick = Handler, Hint="Элемент EditButton"})   -- Выбор кода бумаги
Label_class_code = VCL.Label(mainForm, {Name = "Label_class_code", top=40, left=240, Caption="Код класса", ShowHint=true, Hint=" Элемент Label"})
ComboBox_class_code = VCL.ComboBox(mainForm, {Name = "ComboBox_class_code", top=40, left=330, Width=110, Text="Выбрать...", OnChange = Handler, ShowHint=true, Hint="Элемент ComboBox"})   -- Выбор кода класса
for _,i in ipairs({"SPBFUT","SPBOPT","TQBR"}) do    ComboBox_class_code.Items:Add(i) end

mainForm:Show()
-- Конец скрипта интерфейса
--=================================== Основной блок скрипта =================================
--
-- Чтение таблицы из файла в массив или таблицу
function LoadFromFile ( directory )
    return os.rename ( directory, directory )  --пробуем переименовать файл, если файла нет, то вернет nil и текст ошибки
end
local st, err = LoadFromFile ( path )
if st then  --нашли файл с настройками
   local func, err = loadfile ( path )
   if func then
      func ()
      ACCOUNT = config.ACCOUNT
      CLIENT_CODE = config.CLIENT_CODE
      SEC_CODE = config.SEC_CODE
      CLASS_CODE = config.CLASS_CODE
   else
      message ( err, 3 )  --если файл config.cfg не содержит в таблице данных
   end
else
   message ( err, 3 )  --нет такого файла (не удалось переименовать)
end

-- Сохранение таблицы или массива в файл
function SaveToFile (table_name, path)
  os.remove ( "config.cfg" )  --удаляем файл перед созданием нового
  local t = {ACCOUNT = ACCOUNT, CLIENT_CODE = CLIENT_CODE, SEC_CODE = SEC_CODE, CLASS_CODE = CLASS_CODE}
  local f, err = io.open ("config.cfg", "w")
  if not f then
     return nil, err
  end
  local res = {}
  f:write ( table_name.." =\n{\n" )
  for k, v in pairs ( t ) do
    res[#res + 1] = "\t"..k.."="..v
  end
  f:write ( table.concat ( res, "," ) )
  f:write ("}"); f:flush (); f:close ()
  return true
end
--и вызов:
SaveToFile ( "config", path )

function main()
    while not stopped do
       sleep (1)
    end
    sleep(300)
end

Файл сохраняет, а при запуске не загружает