Sublime Text 3 при проверке синтаксиса путем тестовой прогонки скрипта (Build) ругается на встроенные функции qlua, например на getWorkingFolder(). Понятно, что встроенный интерпретатор Lua их не знает и считает не объявленными глобальными переменными. Как его заткнуть? Мешает.
Settings= {
Name = "Test",
line =
{
{
Name = "Candle",
Color = RGB(255, 0, 0),
Type = TYPE_CANDLE,
Width = 1
}
}
}
function OnCalculate(i)
local candle={O(i),C(i),H(i),L(i),V(i),T(i)}
return ???
end
function Init()
return 1
end
Восемь лет назад разработчики сказали "никак в текущей версии". Версия тогда была 7-я. Что нибудь изменилось?
Споткнулся тут о проблему: в скрипте индикатора нужно обрабатывать свечи для бумаги прошедшей сплит по правилам, отличным от правил обработки других инструментов. Как в скрипте индикатора можно получить наименование тикера обрабатываемой свечи?
Обнаружилось, что при запуске терминала вместе со скриптом и последующем коннекте функция IsConnected() возвращает значение 1 раньше чем устанавливается фактическая связь с сервером.
в итоге
Код
if isConnected()==1 then
message("IsConnected "..tostring(Isconnected()))
csi,error_desc=CreateDataSource("INDX", "IMOEX", INTERVAL_D1)
...
...
пишет в лог: 10:06:35 isConnected 1 10:06:35 csi Source error==>INDX - unknown class code. 10:06:36 Соединение установлено. Предыдущий вход был 07.03.2024 10:05:04 с адреса 92.62.59.149.
Что за ...? В этой части скрипта я уже лет пять ничего не трогал. Приходится перезапускать скрипт после коннекта.
При возникновении стандартной ситуации смены рабочего тикера для робота довольно просто подписатся/отписатся на/от свечных баз данных. В случае же с обезличенными сделками ситуация выглядит иначе. Я предположил, что подписка на тиковую базу при помощи CreateDataSource решает эту проблему. Тестовый скрипт:
Код
is_run=true
function main()
ds,error_desc=CreateDataSource("TQBR", "GAZP", INTERVAL_TICK)
if error_desc~=nil and error_desc~="" then message(" Source error==>" .. error_desc) end
local nn=0
while ds:Size()<5 and nn<100 do
sleep(100) nn=nn+1
end
message("Data "..tostring(ds:Size()))
ds:SetEmptyCallback()
while is_run do
sleep(100)
end
end
function OnStop(stop_flag)
ds:Close()
is_run=false
end
Запускаю скрипт и , о чудо(!), в фильтре Основные_настройки/Программа/Получение_данных/Обезличенные_сделки появляется Газпром. Т.е. задача подписки на ленту сделок успешно решена и данные заказаны. Но... - ничего не появляется в фильтре таблицы обезличенных сделок - убрать эту подписку можно только вручную после похода в меню настроек.
В связи с вышеописанным имею два вопроса:
1. Достаточно ли такой подписки для корректной работы в скрипте колбэка OnAllTrade и выборки SearchItems("all_trades", .....) не имея этого инструмента в таблице обезличенных сделок? 2. Как отписаться от этого счастья средствами Qlua при следующей смене иструмента?
Подскажите по какой причине может быть расхождение позиции по одному из инструментов (в моем случае MAGN) ? В таблице "Состояние счета" --> "Позиция" --> -240 (T1) - правильное значение В таблице "Позиции по инструментам" --> "Текущий остаток" --> -2400 (Т1) В указаных таблицах еще четыре инструмента, по ним все ровно
Наткнулся на то, что иногда значения param_value совсем не соответствуют значениям param_image Например: -- local aaa=getParamEx(p_classcode,"GMKN","EV_SESS_ALLOWED").param_value local bbb=getParamEx(p_classcode,"LSRG","EV_SESS_ALLOWED").param_value message(aaa.."/"..bbb)
--> 0.0000/0.0000 -- тоже с param_image : -- local aaa=getParamEx(p_classcode,"GMKN","EV_SESS_ALLOWED").param_image local bbb=getParamEx(p_classcode,"LSRG","EV_SESS_ALLOWED").param_image message(aaa.."/"..bbb)
Подскажите возможно ли каким-то образом получение данных для свечи с интервалом от 1 мин или более с разбивкой объема сделок V на "покупка" и "продажа" как это сделано в ленте сделок? Выбирать это из тиковой базы уж очень затратно по ресурсам, особенно если не по одному инструменту.
Я тут пользую визуальный индикатор работы скрипта который показывает его замедление или затык при выполнении. Веселенький такой крутилок в крайней ячейке таблицы. Может кому пригодится. С Новым Годом!
Код
function cyrcle(c) -- крутилок
local t=os.time()
if c=="|" then
return "/", t
elseif c=="/" then
return "--", t
elseif c=="--" then
return "\\", t
elseif c=="\\" then
return "|", t
else
return "" ,t
end
end
-- Пример (цветовые функции здесь не привожу)
go,gt="",0
...
...
function main()
is_run=true
...
while is_run do
go,gt=cyrcle(go)
...
...
...
...
SetCell(kt_id,x,y,go) -- вывод в ячейку таблицы
--раскраска крутилка
if go=="/" or go=="\\" then
color(x,y,kt_id,"Lemon")
else
color(x,y,kt_id,"Salad")
end
if os.time()-gt>60 then color(x,y,kt_id,"Red") end
...
sleep(50)
end
end
Ну сделайте наконец возможность изменения размера окна "Доступные скрипты"! Достало уже забавляться целый день прокруткой после изменения шрифтов. У вас что, все экраны 15 дюймов ?
Заодно поставьте уже кнопку запуска этого окна рядом с веселиньким паровозиком.
Столкнулся с тем, что после аварийного выхода из терминала при его зависании по сторонней причине, исчезают все метки добавленные при помощи функции AddLabel после последнего запуска скрипта. Очень неприятно и в голову ничего не пришло кроме сохранения параметров меток в файл при их создании с последующим удалением и пересозданием каждой при новом запуске. Наверное можно было бы решить эту проблему имея в lua функцию сохранения параметров терминала в файл info.wnd, но увы. Кто-то нашел решение этой проблемы?
Попутно изучая в доках функцию AddLabel на предмет что курили разработчики когда придумали использовать для параметра "Время в формате «ЧЧММСС»..." тип "NUMBER" наехал вот на такую шутку:
Код
local a="09:15:18"
local b=string.gsub(a,":","")
local c=tonumber(b)
local d=tonumber(string.gsub(a,":",""))
message(tostring(c).." "..tostring(d))
Результат: 91518 nil
Кто коллекционирует, дарю )) v.9.8.0.11, Lua 5.3.5
Подскажите, есть ли возможность получения цены последней сделки по инструменту запросом с сервера не занося его в таблицу текущих торгов руками и не создавая всю базу через CreateDataSource ?
Описание проблемы: В случае прикрепления графика якорем к таблице текущих торгов функция AddLabel лепит метку согласно только идентификатору в текущий на графике инструмент. T.е. метка о сделке по любому тикеру выставляется в текущее окно графика. В итоге в одном окне мешанина из меток разнообразных инструментов, а при переключения на нужные они отсутствуют. В настоящее время способов автоматически правильно разносить метки на графики соответствующих тикеров нет. Единственный вариант какой я придумал - вручную открывать нужное окно и запускать скрипт который перебирает список UIDов меток относящихся к этому тикеру, поштучно удаляет ее и выставляет заново с другим uid что бы она появилась на текущем графике. Замечу, что метки покупки/продажи выставляемые самим Квиком попадают в окно нужного инструмента автоматически.
Предложение:
1. Доработать функцию AddLabel возможностью выставлять метку на график в соответствии с параметром "тикер инструмента". При отсутствии параметра пусть лепит в текущее окно.
или
2. Дать возможность позиционировать средствами qlua указатель в таблице текущих торгов на нужный тикер с тем что бы текущий график переключился на нужный инструмент. Тут наверное придется создать еще функцию получения текущей позиции укозателя.
Прошу рассмотреть данные предложения. Обязуюсь честно напоминать о них ежегодно )
При подаче и обработке лимитных заявок давно использую простую последовательность:
sendTransaction(...)( задание TRANS_ID) --> OnTransReply(...)(получение номера заявки order_num )-->OnTrade(...)(обработка исполнения заявки с номером order_num) Функцию OnOrder() тут не использую благо до сих пор не было необходимости.
Попытка сделать подобную схему для стоп-заявки типа тэйк-профит поставила в тупик - полученный от OnTransReply при выставлении стоп-заявки order_num бесполезен т.к. после срабатывания условий тэйка сервером выставляется новая заявка с новым номером order_num который нужно как-то отфильтровать и получить.
Прошу у знатоков совета по оформлению последовательности функций обратного вызова для этого типа заявок.
Почему-то в девятке возвращаемое значение getPortfolioInfoEx(...,2).all_assets абсолютно не соответствует значению соответствующего поля ТекСредства таблицы Клиентский портфель. В восьмерке такого не было (
А можно узнать у уважаемых разработчиков по какой причине в таблице алгоритмических заявок утром до начала торгов по каждой заявке пустое поле "Инструмент сокр."? Какой смысл тогда заполнения остальных полей этой таблицы в это время?
Я чего-то недопонимаю в логике настроек переноса заказа данных в настройки (?). Стоял фильтр заказа котировок. Снимаю галочку "фильтр инструмента" класса в /Программа/Получение данных/Котировки и уверен что все хорошо. Однако при следующем входе галка на месте. Ручное сохранение настроек эффекта не дает. Версия 8.11
Подскажите, есть ли возможность получить с сервера в свою таблицу список ВСЕХ тикеров по конкретному классу? Типа той которая используется в таблицах квика для настройки фильтров и тп.
У меня работает несколько роботов с выводом данных каждый в свою таблицу. Возникла необходимость сделать сводную таблицу для всех. Пока не понимаю как передавать данные из скрипта в скрипт. Вернее одно решение есть - отдавать через сохраняемый и затем читаемый файл, но во первых это криво, во вторых медленно. Буду благодарен за рабочую идею.
Здравствуйте! При изменении шрифтов в настройках Квика естественно приходится корректировать ширину столбцов и размеры таблиц. Особых проблем в большинстве таблиц это не создает. Кроме стакана. Т. к. отсутствует возможность сохранить параметры окна и каждый раз при вызове стакана из таблицы текущих торгов стакан является в корявом виде и размере по умолчанию. Прошу зарегистрировать возможность изменять и сохранять размеры и ширину столбцов по умолчанию.
Кроме того прошу аналогично дать возможность изменять размер окна "Доступные скрипты"
Сегодня обновил квик до версии 8.8.4.3 , перестали скачиваться тиковые данные.
Скрипт -- local ldsa={} local error_desc="" ldsa,error_desc = CreateDataSource(p_classcode, p_seccode, INTERVAL_TICK) while not ldsa or ldsa:Size()==0 do sleep(10000) message("ожидание данных") if error_desc ~= nil and error_desc ~= "" then message(p_classcode.."/"..p_seccode.."/".."Source2 error ==>" .. error_desc) end end message("получено "..tostring(ldsa:Size())) -- висит в "ожидание данных".
Господа разработчики, в связи с появлением на ММВБ вечерней сессии есть пара замечаний и предложений по теме.
Вот протокол изменения статуса сессии в течении дня: -- 09:50:01 Ststus 0==>3 (открытие) 09:59:40 Ststus 3==>0 (закрыта) 10:00:00 Ststus 0==>1 (открыта) 18:39:59 Ststus 1==>0 (закрыта) 18:40:05 Ststus 0==>4 (аукцион) 18:45:20 Ststus 4==>5 (ЦАЗ) 18:50:01 Ststus 5==>0 (закрыта) 19:00:01 Ststus 0==>3 (открытие) 19:04:31 Ststus 3==>0 (закрыта) 19:05:00 Ststus 0==>1 (открыта) 23:50:00 Status 1==>0 (закрыта) -- Предложения: 1. Сделать разными статусы открытия дневной и вечерней сессии с 9-50-00 до 9-59-40 и с 19-00-00 до 19-04-30. Сейчас оба периода имеют одинаковый статус 3.
2. Периоды с 09-59-40 до 10-00-00 и с 19-04-30 до 19-05-00 имеют статус сессии 0 (закрыта). Однако в это время сервером обрабатываются встречные заявки выставленные в период открытия сессии. Логично было бы этим периодам присвоить отдельный статус.
подскажите пожалуйста есть ли возможность что бы CreateDataSource(classcode, seccode, INTERVAL_TICK) тащила с сервера только данные текущей сессии? А то это действо занимает около пяти минут. Заодно как узнать, что данные получены полностью?
Подскажите пожалуйста есть ли какая-либо возможность изменять из скрипта параметры заказа данных? Конкретно интересует возможность изменять фильтр в заказе потока обезличенных сделок.
Подскажите пожалуйста способы обхода бага: 1. Создаю таблицу с идентификатором kt_id и размером окна вмещающем n строк 2 Поштучно добавляю строки при помощи InsertRow(kt_id,k). 3. В итоге добавлено строк больше n и в окне начинает работать прокрутка с установкой бегунка прокрутки вниз так, что видна последняя строка. 4. Выделяю первую строку SetSelectedRow(kt_id,1). Строка выделяется, однако ее не видно тк она остается за пределами окна.
Как мне средствами Lua поднять этот бегунок и увидеть в окне первую строку?
В последних версиях в терминал внесены значительные улучшения. Улучшения пишу честно, без скобок. Например если кликнуть правой клавишей мыши по заголовку пользовательской таблицы, предлагается сортировка столбца. Точно так же сортировка предлагается если таким образом кликнуть и в ячейке с данными. Великолепно! Только теперь при двойном клике по ячейке данных функция MouseClick(...) перестала возвращать QTABLE_LBUTTONDBLCLK. А надо :(. Вполне хватило бы оформить вызов сортировки только кликом на заголовок. Что делать?
Очень бы хотелось иметь возможность привязывать пользовательские таблицы к конкретным вкладкам Квика. Например иметь такую опцию в функции CreateTable() или SetWindowPos(...)
Сейчас для того, что бы открыть таблицу в определенной вкладке, нужно запускать скрипт робота находясь в ней. Если скриптов несколько, то бегать по вкладкам запуская их. Кроме того при закрытии терминала или аварийном перезапуске пользовательские таблицы вновь открываются во вкладке вкладке, которая была открыта на момент выхода из Квика. Робот обижается :)
Получаю ошибку несуществующего аргумента в момент очистки таблиц при первом за текущие сутки коннекте к серверу 9-30. Дальше работает корректно, все данные из таблицы лимитов получаются, при переконнекте скрипт не вылетает.
Попробовал посмотреть что она в этот момент возвращает ... y=type(getDepoEx ("MC0003300000", "555555", "SU26225RMFS1", "L01-00000F00", 2)) ...
получил: bad argument #1 to type (value expected)
Выборки из других таблиц getParamEx, getPortfolioInfoEx работают как и должны круглосуточно.
Возможно это баг разработчиков. Но я не могу придумать как это обойти, кроме как останавливать скрипт на время обновления данных. Подскажите если кого озарит
Подскажите пожалуйста человеку не знакомому достаточно подробно с lua. Как обработать переменную, имя которой представлено в строке? Например :
var1=0 a = "var" b = "1" c =a..b далее мне нужно например в конструкции if проверить значение переменной var1 имея переменную c. В некоторых языках для этого используется оператор $ там это выглядит так: if $c = 0 then ........ end
Как это сделать в lua?
Прошу извинить, что не нашел этого в руководстве :(
Добрый день. Подскажите начинающему как победить проблему. При добавлении индикатора, написаного на lua в появляющемся окне настроек индикатора отсутствует вкладка "Общие". Имеются только вкладки "Дополнительно" и "Уровни". В результате невозможно задать параметры индикатора. Quik версия 7.0.4.10 Спасибо