День добрый. Такая ситуация возможна, если Квик начинает показывать неправильную позицию в портфеле. Робот пытается ее закрыть. Это случай крайне редкий. Бывает такое. Девятого вообще брокер лежал с неправильными позами в течении дня
Подскажите как удалить транзакцию без ID. При создании пользователем заявок руками они приходят без ID. Вопрос как их удалить? Если при попытке выставь ноль и пустоту выводит: Error del.Trans: Неправильно указан идентификатор транзакции: "0" или Error del.Trans: Не указан идентификатор транзакции
код
Код
local trans_params = {
CLIENT_CODE = Account,
CLASSCODE = Class_Code,
SECCODE = Sec_Code,
ACCOUNT = Account,
TRANS_ID = "" , -- что сюда подпихнуть
ORDER_KEY=tostring(ord_num),
ACTION = "KILL_ORDER"
}
Виталий пишет: Я не знаю ни языка qpile, ни lua, но мне надо сделать программу, воспроизводящую звуковой файл при пересечении двух АМА с разными периодами. Какой из этих языков лучше изучить для реализации данной программы?
:)))) Мне нужно поменять резину на колесах. Какое монтажное оборудование посоветуете? А если серьезно, то пару тыров заплатить программеру и забыть.
Alexey K пишет: Хочу чтобы скрипт отслеживал определенное нажатие клавиши. Можете подсказать где и что почитать, чтобы сделать это без лишних заморочек?
Если нужно отследить с вашей таблицы, то поможет то, что предлагает Николай Камынин , а если нужно круче , то придется писать приложение или подключать стороннюю библиотеку.
Николай Камынин пишет: все же попробуйте, чудеса бывают и в квике.
Написал в Арку. Сказали, параметры можно получить через экспорт по DDE. Получил. Интересующий меня параметр сменил название с "CLOSING_AUCTION_PRICE " на "auctprice". Всем большое спасибо. Вопрос закрыт.
1) Lua 2) частник кормит себя, а фирма оплачивает: директора, бухгалтера и понты :) 3) да. Управление параметрами робота и т.д. все на хорошем уровнена. Тут все просто, чем дубовей и проще тем дешевле, чем сложней тем дороже. Хотя , что-то дубовое очень сложно представить. Sib-algo.ru пишут по приемлемым ценам.
Николай Камынин пишет: А вы этот параметр в какое время читаете?
с 18:40, но это не суть так как цифра есть в ТТП Квика. А по запросу выводит nil. .PARAM_VALUE результат не изменит. Нет большой разницы как вывести данные в виде числа или строки. В текущей ситуации лучше строка так .PARAM_VALUE вместо пустоты вернет ноль.
нужно полный список параметров: LCLOSEPRICE, LAST, OPENPERIODPRICE и т.д. не могу получить CLOSING_AUCTION_PRICE getParamEx(Class_Code, Sec_Code, "CLOSING_AUCTION_PRICE").param_image возвращает пустое значение
День добрый. Подскажите какая сейчас актуальная и без багов библиотека для реализации графического интерфейса(формы) для ввода данных пользователем в рамках Quik Lua? Так же интересует библиотека для считывания кодов нажатых клавиш.
поставил в 32 строке local param=tostring(Settings.line[1].Name) все равно возвращает ошибку: ...\LuaIndicators\file03.lua:32: attempt to index field 'line' (a nil value)
Settings=
{
Name = "AAAA",
Smooth=10,
line =
{
{
Name = "Hi",
Color = RGB(255, 0, 0),
Type = TYPE_LINE,
Width = 2
}
}
}
function Init()
return 1
end
function write_name(p)
file=io.output("d:\\name1.ini") -- getScriptPath()..
d=file:write(p)
file:close()
end
function OnCalculate(index)
local ur=0
local param=tostring(Settings.line.Name)
if tonumber(T(index).day)==15 then
write_name(param)
end
return ur
end
не могу получить имя линии. получение имени индикатора Settings.Name вернет "AAAA" по идеии Settings это массив и должно быть Settings["line"][1]["Name"] но это не работает возвращает nil Господа, подскажите как получить название линии?
У меня возникает проблема по утрам. При запущенном скрипте. Если скрипт запустить потом или перезапустить скрипт, устроить дисконект, выключить Квик никаких проблем нет. Только утро и все! Функция create(time_can) выполняется для всех свечей графика, а должна выполняться только для новой свечи.
Код
is_run = true
Class_Code = "SPBFUT"
Sec_Code="RIM5"
TF=INTERVAL_M30
old_can=20150422100 -- время последней обработанной свечи
function main()
read_param_file() -- считываем время свечи из файла
ds = CreateDataSource(Class_Code, Sec_Code, TF)
sleep(200)
while is_run do
sleep(1000)
if isConnected()==1 and getInfoParam("SERVERTIME")~=nil then
sleep(1000)
local n_last_candle=ds:Size()
local t_last_candle=tonumber(ds:T(n_last_candle).year..Chisla(ds:T(n_last_candle).month)..Chisla(ds:T(n_last_candle).day)..Chisla(ds:T(n_last_candle).hour)..Chisla(ds:T(n_last_candle).min))
if tonumber(t_last_candle)~=tonumber(old_can) then
local p_new_candles=new_candle(n_last_candle) -- получение новых свечей
for i=n_last_candle-p_new_candles, n_last_candle do
time_can=tostring(ds:T(i).year)..Chisla(ds:T(i).month)..Chisla(ds:T(i).day)..Chisla(ds:T(i).hour)..Chisla(ds:T(i).min)
create(time_can) -- действия над свечами
end
old_can=t_last_candle
save_time(old_can) --сохранение в файл времени последней свечи
end
end
end
ds:Close()
end
-- функция возвращает кол-во новых свечей от текущей
function new_candle(n_last_candle)
local p_new_candles=0
for i=0,n_last_candle-1 do
if tonumber(old_can)<tonumber(tostring(ds:T(n_last_candle-i).year)..Chisla(ds:T(n_last_candle-i).month)..Chisla(ds:T(n_last_candle-i).day)..Chisla(ds:T(n_last_candle-i).hour)..Chisla(ds:T(n_last_candle-i).min)) then
p_new_candles=i
else
break
end
end
return p_new_candles
end
function OnStop(stop_flag)
is_run=false
stop_flag=1
end
если не было сделок в текущем дне, то вернет 0. Квик не помнит вчерашних сделок. Если по инструменту на момент проверки могут не быть сделки ввиду малой ликвидности инструмента пользуйтесь CreateDataSource и запрашивайте цену из последней свечи.
Сергей Радченко пишет: просьба добавить возможности: 1 менять цвет у линии в индикаторе 2 Также добавьте отображение индикатора в виде баров, свечей, гистограммы. 3 Будет супер если появится возможность рисовать индикаторы, графики без привязки ко времени.
1. Менять цвет уже сейчас можно. или имеется в виду динамическое изменение цвета? 2. мы уже работаем над этим 3. в этом пункте не совсем понятно. уточните пожалуйста на примере.
суть задачи состоит в том ,что нужно во множестве инструментов взять свечку(данные) из прошлого и обработать в цикле все инструменты беря по одной свече. И так нужно прошерстить всю историю. Сейчас реализовано это так:
function main() while is_run do sleep(10000) -- по сути это блок проверки на получение новых свечек через каждые 10сек for i=1, кол-во новых свечек (глубина просмотра инструментов) do for j=1, #mas do -- mas массив инстркментов f(класс, инст.mas[j] , время итой свечи, INTERVAL_H1) end end end end
function f(class, sec_code, time_b, INTERVAL_H1) local close_b,oi=0,0 local ds_price=CreateDataSource(class, sec_code, INTERVAL_H1) --ds_opt_price:SetEmptyCallback() sleep(100) local ds_oi=CreateDataSource(class, sec_code, INTERVAL_H1, "NUMCONTRACTS") -- ds_oi:SetEmptyCallback() sleep(100)
local time_candle=tostring(ds_price:T(1).year)..Chisla(ds_price:T(1).month)..Chisla(ds_price:T(1).day)..Chisla(ds_price:T(1).hour)..Chisla(ds_price:T(1).min).."00"
if tonumber(time_candle)>tonumber(time_b) then -- свечей нет
else for i=1 , tonumber(ds_price:Size()) do time_candle=tostring(ds_price:T(i).year)..Chisla(ds_price:T(i).month)..Chisla(ds_price:T(i).day)..Chisla(ds_price:T(i).hour)..Chisla(ds_price:T(i).min).."00" if tonumber(time_b)>=tonumber(time_candle) then close_b=ds_price:C(i) else break end end
for i=1 , ds_oi:Size() do time_candle=tostring(ds_oi:T(i).year)..Chisla(ds_oi:T(i).month)..Chisla(ds_oi:T(i).day)..Chisla(ds_oi:T(i).hour)..Chisla(ds_oi:T(i).min).."00" if tonumber(time_b)>=tonumber(time_candle) then oi=ds_oi:C(i) else break end end end ds_opt_price:Close() ds_opt_oi:Close()
return close_b,oi end
В массиве mas около 200 интсрументов и проходит около 10 свечек по всем инст. и через какое-то время Quik перестает обновлять котировки, стакан. Возникает ощущение ,что он в дисконнекте , но пишет ,что коннект есть. Вопрос как получить предыдущие данные по большому кол-ву инст. и не положить Quik?
Сергей Радченко пишет: лучше сделать так как правильно и надежно. Мой пример показал, что данные могут не поступать и лучше перестраховываться
А может мой способ и является правильным? Если мне нужны только данные, накопленные до момента вызова CreateDataSource, без последующих обновлений. А использование коллбэков сильно тормозит работу, если речь идет о получении данных по большому числу инструментов. В Вашем же случае проблема была в том, что вы пытались обращаться к данным еще до того, как терминал успел загрузить их с сервера, а использование коллбэков отнюдь не ускорит этот процесс.
благодоря использованию колбека можно не только обновить данные, но для меня самое важное проверить их. У меня массив инструментов в цикле и время тоже важно ,но еще важнее получить данные. А вдруг задержки в 100 будет мало. Мне тоже не приятно использовать слип и обновлять данные без необходимости. Это все только для того ,чтоб получить правильные и полные данные. В моем случае с точки зрения логики CreateDataSource должен был получить массив свечей и только после этого перейти дальше по коду. А он это не сделал и побежал дальше. Я это увидел при тесте не поверив частично нулевым данным. Колбек это способ увидеть нули и проверить данные еще раз. Да плата за это время. У меня наверно теперь час будет индюк рассчитываться :)
Sergey Gorokhov пишет: Если в течении сессии график вообще не открывался, то CreateDataSource вообще не сработает в этом случае нужно заказать данные. Это можно сделать либо открыв окно с графиком, либо вызвав функцию ds:SetEmptyCallbac() один раз.
А я успешно получаю данные с использованием только CreateDataSource, без вызова SetEmptyCallback или SetUpdateCallback. Причем без них работает все гораздо быстрей. И при этом графики в терминале не открыты. Это "ошибка" в реализации QLua? Или все же так и должно быть?
Правда я проверяю эти данные только 1 раз. Вполне возможно, что после загрузки в терминал текущего состояния графика со всей историей, дальше без использования одной из последних двух функций новые свечки уже не будут поступать.
да, работать будет и без открытия графика, но лучше сделать так как правильно и надежно. Мой пример показал, что данные могут не поступать и лучше перестраховываться. Одну строчку прописать легко. Спасибо, команде поддержки Квика.
SetUpdateCallback позволяет генерить событие если свечка изменилась, а если не изменилась , то ничего не делать. Да это здорово для обработки текущей свечи. Но я больше склоняюсь к получению данных из таблиц данных через getParamExкак пример getParamEx ("SPBOPT", mas_opt_par["code"], "NUMCONTRACTS").param_value
Если Вы используете getParamEx зачем Вам CreateDataSource? Да еще и с интервалом 15. Если для того чтобы заказать данные то нужно использовать тиковый интервал и подписаться через SetEmptyCallback()
getParamEx позволяет получить только текущие(последние) данные , а CreateDataSource я использую для получения прошлых данных. Правильно ли я понял, что нужно написать так: ds=CreateDataSource(Class_Code, Sec_Code, INTERVAL_M15) while ds:SetEmptyCallbac()==false do ds=CreateDataSource(Class_Code, Sec_Code, INTERVAL_M15) end
это позволит убедиться ,что данные были отправлены, а если нет, то ds:SetEmptyCallbac() вернет false и попытка создать таблицу будет повторена
не работает пишет: attempt to call method 'SetEmptyCallbac' (a nil value)
SetUpdateCallback позволяет генерить событие если свечка изменилась, а если не изменилась , то ничего не делать. Да это здорово для обработки текущей свечи. Но я больше склоняюсь к получению данных из таблиц данных через getParamExкак пример getParamEx ("SPBOPT", mas_opt_par["code"], "NUMCONTRACTS").param_value
Если Вы используете getParamEx зачем Вам CreateDataSource? Да еще и с интервалом 15. Если для того чтобы заказать данные то нужно использовать тиковый интервал и подписаться через SetEmptyCallback()
getParamEx позволяет получить только текущие(последние) данные , а CreateDataSource я использую для получения прошлых данных. Правильно ли я понял, что нужно написать так: ds=CreateDataSource(Class_Code, Sec_Code, INTERVAL_M15) while ds:SetEmptyCallbac()==false do ds=CreateDataSource(Class_Code, Sec_Code, INTERVAL_M15) end
это позволит убедиться ,что данные были отправлены, а если нет, то ds:SetEmptyCallbac() вернет false и попытка создать таблицу будет повторена
Сергей Радченко пишет: если воткнуть sleep(100) в самом начале то выведет
Да на закачку данных требуется время, так и должно быть.
Цитата
Сергей Радченко пишет: Как лучше получать данные если иструментов для работы в цикле много, и обращения частые? У меня задача тащить по одной свечке из множества инст. и хотелось бы получать правильные данные.
Лучше, ловить данные в колбеке SetUpdateCallback
Как определить оптимальное время на закачку? Просто если поменять инст. на RIM5 проблем нет. Куда втыкать sleep до CreateDataSource или после и сколько ставить единиц? Как определить полноту передачи массива свечей?
SetUpdateCallback позволяет генерить событие если свечка изменилась, а если не изменилась , то ничего не делать. Да это здорово для обработки текущей свечи. Но я больше склоняюсь к получению данных из таблиц данных через getParamEx как пример getParamEx ("SPBOPT", mas_opt_par["code"], "NUMCONTRACTS").param_value
не грузятся данные при формировании таблицы свечей через CreateDataSource.
function main() -- если сюда воткнуть sleep(100) то выведет Class_Code = "SPBOPT" Sec_Code="RI75000BP5" ds=CreateDataSource(Class_Code, Sec_Code, INTERVAL_M15) t=getParamEx(Class_Code, Sec_Code, "LONGNAME").param_image local s=0 s=ds:Size() message("ds:Size()="..s.." name "..t,1)
ds:Close()
while is_run do sleep(1000)
end end
ответом будет ds:Size()=0 name RTS-6.15M150415PA 75000
если воткнуть sleep(100) в самом начале то выведет ds:Size()=949 name RTS-6.15M150415PA 75000
Вопрос. Как лучше получать данные если иструментов для работы в цикле много, и обращения частые? У меня задача тащить по одной свечке из множества инст. и хотелось бы получать правильные данные. Может какую проверку написать для проверки правильности загруженных данных?
просьба добавить возможности: 1 менять цвет у линии в индикаторе 2 Также добавьте отображение индикатора в виде баров, свечей, гистограммы. 3 Будет супер если появится возможность рисовать индикаторы, графики без привязки ко времени.
где правильно подписываться на источник данных при использовании одного инструмента и одного ТФ? Делать это в каждой функции и закрывать в конце или разместить подписку в function OnConnected() ds = CreateDataSource(Class_Code, Sec_Code, INTERVAL_M1) а закрыть подписку function OnStop(stop_flag) ds:Close()