Добрый день. Подскажите как настроить DebugView ,перепробовал варианты в Опция-Фильтр в окне Incluide писал следующее : QLua, qlua, info.exe, info, брал это в "" ни чего не помогает. Работает только при значке * но тогда нет фильтрации выводиться вся инфа по действиям компа- не удобно получается. Как отсечь не нужное?
Добрый день! У вас много интересной информации на сайте, но я не нашел статьи на тему потоков в Lua и Квик. А интересует меня тема как правильно или скажем грамотно организуется получение данных или параметров от функций обратного вызова, а точнее получение данных из функции OnAllTreid и передача в функцию main. Насколько я понял это два разных потока, но как обращаться из одного в другой при этом не мешая и не теряя информацию потока ??? . Напишите статью с примером и пояснениями, пожалуйста. Мне кажется что это будет интересно не только мне.
С уважением Андрей А.
--передача событий из основного потока в main--с использованием межпоточных функций sinsert, sremove--для получения событий OnAllTrade должна быть открыта таблица обезличенных сделокlocal exitflag =true--флаг остановки скриптаlocal last_tradenum =0--№ последней обезличенной сделки--смешанная таблица "cb" для обработки очереди событий--нужный message раскомментироватьlocal cb ={}function cb.SPBFUT_atr(t)local sec_code = t.sec_code
local price = t.price
if sec_code =="RIU0"then--уникальная обработка события по инструментуend--после сообщения скрипт остановится
message("SPBFUT_atr "..sec_code.."\nprice= "..tostring(price),2); exitflag =trueendfunction cb.SPBFUT_ql2(t)local sec_code = t.sec_code
local offer_count =tonumber(t.offer_count)if offer_count ==0thenreturnendlocal coll_offer = t.offer
local offer = coll_offer[offer_count]if sec_code =="RIU0"thenend--после сообщения скрипт остановится-- message("SPBFUT_ql2 "..sec_code.."\noffer= "..tostring(offer.price), 2); exitflag = trueendfunction cb.TQBR_atr(t)local sec_code = t.sec_code
local price = t.price
if sec_code =="SBER"thenend--после сообщения скрипт остановится-- message("TQBR_atr "..sec_code.."\nprice= "..tostring(price), 2); exitflag = trueendfunction cb.TQBR_ql2(t)local sec_code = t.sec_code
local offer_count =tonumber(t.offer_count)if offer_count ==0thenreturnendlocal coll_offer = t.offer
local offer = coll_offer[offer_count]if sec_code =="SBER"thenend--после сообщения скрипт остановится-- message("TQBR_ql2 "..sec_code.."\noffer= "..tostring(offer.price), 2); exitflag = trueendfunction main()--по этим инструментам будем получать событияlocal sec ={
SPBFUT ={"RIU0","SiU0"},
TQBR ={"GAZP","LKOH","SBER"}}for class_code, list inpairs(sec)dofor i=1,#list dolocal sec_code = list[i]
cb[class_code..sec_code]=true--cb["TQBRSBER"] = true--заодно подписываемся на получение событий OnQuoteifnot IsSubscribed_Level_II_Quotes(class_code, sec_code)then
Subscribe_Level_II_Quotes(class_code, sec_code)endendend
last_tradenum = getItem("all_trades", getNumberOf("all_trades")-1).trade_num
--message(tostring(last_tradenum))
exitflag =nil--начинаем получать событияwhilenot exitflag dolocal c =0while#cb >0dolocal t =table.sremove(cb,1)--удаляем первый элемент массива
cb[t.name](t)--и отправляем на обработку--если событий много...
c = c +1if c ==50then--подобрать значение, что бы расчет не грузил проц
c =0
sleep(1)--перекурendend
sleep(1)endendfunction OnStop()
exitflag =truereturn500endfunction OnAllTrade(alltrade)--фильтр: скрипт остановлен или получает заново события после дисконектаif exitflag or alltrade.trade_num < last_tradenum thenreturnend
last_tradenum = alltrade.trade_num
local class_code = alltrade.class_code
ifnot cb[class_code..alltrade.sec_code]thenreturnend--это наш инструмент
alltrade.name = class_code.."_atr"--имя функции для обработки событияtable.sinsert(cb, alltrade)endfunction OnQuote(class_code, sec_code)--фильтр: скрипт остановлен или не "наш" инструментif exitflag ornot cb[class_code..sec_code]thenreturnend--это наш инструментlocal ql2 = getQuoteLevel2(class_code, sec_code)
ql2.name = class_code.."_ql2"--имя функции для обработки события
ql2.class_code = class_code
ql2.sec_code = sec_code
--теперь в main нам известен класс и код инструмента этого снепшота стаканаtable.sinsert(cb, ql2)end
Добрый день!
Перешел на Квик 8.5.2.11, версия Луа 5.3. (Раньше был Квик 8.2 х64 с Луа 5.1). В итоге все ДЛЛ рухнули. Библиотеки не грузятся.
Код с вариантами:
extern "C" LUALIB_API int luaopen_cCalSpred(lua_State *L)
{
//luaL_openlib(L, "cCalSpred", ls_lib, 0);
//luaL_setfuncs(L, ls_lib, 0);
luaL_newlib(L, ls_lib);
return 0;
}
Варианты не работают.
Что там нужно сделать? Возможно уже с этим сталкивались?
//хидеры и либу брать с https://sourceforge.net/projects/luabinaries/files/5.3.5/Windows%20Libraries/Static/
//и не забыть поставить в свойствах проекта платформу x64
// !!!! ### для VS2017(на ней проверял) : lua - 5.3.5_Win64_vc14_lib.zip
//Для сборки ddl под quik 8.5 и lua 5.3 нужно полностью заменить последний блок кода
//(регистрация названия библиотеки), например на :
extern"C"LUALIB_APIint luaopen_QluaMultithreaded(lua_State*L){
lua_newtable(L);
luaL_setfuncs(L, ls_lib, 0);
lua_pushvalue(L, -1);
lua_setglobal(L, "QluaMultithreaded");return0;}
Спасибо.
DLL сконнектилась. Все работает без ошибок. С самого начала использовал - lua-5.3.5_Win64_dll16_lib. Это переделывать на lua - 5.3.5_Win64_vc14_lib.zip не стал, с ней тоже работает.
Начались какие-то проблемы с данными. Часть данных из Квик идет нормально, а часть не приходит, чего раньше не было. В общем, какие-то чудеса творятся.) Пока непонятно. Ну, с этим пока сам разбираться буду.
Еще раз спасибо за помощь.
Добрый вечер! Не подскажите как сделать так что бы задержка в основном цикле и сообщении была разная.А то у меня и сообщение и цикл зависает на столько сколько я прописываю для сообщения!
function main()
while IsRun do
local TRADEDATE = getInfoParam("TRADEDATE")
local SERVERTIME = getInfoParam("SERVERTIME")
local SecCode = "USD000UTSTOM"
local Class = "ММВБ Валюта: ЕТС"
local LastPrice = getParamEx (Class, SecCode, "LAST").param_value
local BIDDEPTHT = getParamEx (Class, SecCode, "BIDDEPTHT").param_value
local VALUE = getParamEx (Class, SecCode, "VALUE").param_value
local LASTCHANGE = getParamEx (Class, SecCode, "LASTCHANGE").param_value
SetCell(TableRTS,1,1,tostring(TRADEDATE))
SetCell(TableRTS,1,2,tostring(SERVERTIME))
SetCell(TableRTS,1,3,tostring(SecCode))
SetCell(TableRTS,1,4,tostring(LastPrice))
SetCell(TableRTS,1,5,tostring(BIDDEPTHT))
SetCell(TableRTS,1,6,tostring(VALUE))
SetCell(TableRTS,1,7,tostring(LASTCHANGE))
if LASTCHANGE > "0.20" then
message("БОЛЬШЕ",1)
sleep(100000)
elseif LASTCHANGE < "0.17" then
message("МЕНЬШЕ",2)
sleep(100000)
end
sleep(1000)
end
end
function OnStop()
IsRun = false
DestroyTable(TableRTS)
Добрый день, такой вопрос: сколько скриптов возможно одновременно запустить в Quik? Это для тестирования, сделки не производиться, но каждый скрипт выводит инфу в Excel. Или может быть есть ограничения по выводу через DDE?
Добрый вечер. Прошу, помогите разобраться с SetUpdateCallback и SetEmptyCallback
Какую строку кода (используя SetUpdateCallback или SetEmptyCallback) надо добавить в нижеуказанный код, чтобы при появлении новой свечи вывести сообщение "Появилась новая свеча"?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
IsRun =true;function OnStop()
IsRun =false;end;function main()while IsRun do
ds,Error= CreateDataSource("SPBFUT","SiM0", INTERVAL_M1);--получаем свечки в набор данныхwhile(Error==""orError==nil)and ds:Size()==0do sleep(1)endifError~=""andError~=nilthen message("Ошибка подключения к графику: "..Error)endendend
Смотрите документацию по QLua (в интернете много информации)
Нужно использовать SetUpdateCallback
Формат вызова:
BOOLEAN res SetUpdateCallback (FUNCTION callback_function)
В качестве параметра принимает функцию обратного вызова.
Формат функции обратного вызова:
function call_back(NUMBER index)
Параметры:
• index – номер изменившейся свечки. Индексы свечек начинаются с 1.
Функция возвращает «true» в случае успешного завершения, иначе – «false».
Код:
while (Error == "" or Error == nil) and ds:Size() == 0 do sleep(1) end
так нельзя делать вообще
1. данных может не быть, тупо не было сделок никогда (лпционы, например);
2, после дисконекта данные могут появится часов через 5
цикл будет крутить "вечно", а ошибки не будет.
вот так можно сделать обезличенный калбэк:
а, забыл,
в калбэке первой строкой стоит сделать проверку
if exitflag then return end
иначе может быть ошибка при выключении скрипта, но тут это не критично
Здравствуйте!
печально, что толку от "правильности" в рамках квика - нет, чего не коснись - работает криво.
это касается и других подобных ПО, которые пишут люди, никак не связанные с торговлей.
и пишут, и поправляют без конца, потому-что не понимают, что пишут и как это должно работать.
Здравствуйте. Подскажите как работать с метками.
Добавил я на график несколько меток.
С помощью: AddLevel()
А как изменить местоположение определенной метки?
Я понимаю сначала DelLabel(), а потом снова добавить AddLevel()
Или через SetLabelParams()
Но не пойму где взять: label_id–идентификатор метки
для начала добавляете тестовую метку, пофик на какой бар, получаете ее id и сразу удаляете.
test_id = AddLebel(tag, param)
теперь вам известно примерное кол-во меток на графике:
for chart_id =1, test_id do
local param = GetLabelParams(tag, chart_id)
if type(param) == "table" then
--это метка, ее id = chart_id
end
end
Добрый день. Подскажите как настроить DebugView ,перепробовал варианты в Опция-Фильтр в окне Incluide писал следующее : QLua, qlua, info.exe, info, брал это в "" ни чего не помогает. Работает только при значке * но тогда нет фильтрации выводиться вся инфа по действиям компа- не удобно получается. Как отсечь не нужное?
Добрый вечер. Позыркайте тут https://quik2dde.ru/viewtopic.php?id=108
Отвечать не надо- разобрался.
Добрый день! У вас много интересной информации на сайте, но я не нашел статьи на тему потоков в Lua и Квик. А интересует меня тема как правильно или скажем грамотно организуется получение данных или параметров от функций обратного вызова, а точнее получение данных из функции OnAllTreid и передача в функцию main. Насколько я понял это два разных потока, но как обращаться из одного в другой при этом не мешая и не теряя информацию потока ??? . Напишите статью с примером и пояснениями, пожалуйста. Мне кажется что это будет интересно не только мне.
С уважением Андрей А.
Добрый вечер, особо расписывать нечего, средствами qlua, примерно так
Добрый день!
Перешел на Квик 8.5.2.11, версия Луа 5.3. (Раньше был Квик 8.2 х64 с Луа 5.1). В итоге все ДЛЛ рухнули. Библиотеки не грузятся.
Код с вариантами:
extern "C" LUALIB_API int luaopen_cCalSpred(lua_State *L)
{
//luaL_openlib(L, "cCalSpred", ls_lib, 0);
//luaL_setfuncs(L, ls_lib, 0);
luaL_newlib(L, ls_lib);
return 0;
}
Варианты не работают.
Что там нужно сделать? Возможно уже с этим сталкивались?
Ответ Дмитрия:
Спасибо.
DLL сконнектилась. Все работает без ошибок. С самого начала использовал - lua-5.3.5_Win64_dll16_lib. Это переделывать на lua - 5.3.5_Win64_vc14_lib.zip не стал, с ней тоже работает.
Начались какие-то проблемы с данными. Часть данных из Квик идет нормально, а часть не приходит, чего раньше не было. В общем, какие-то чудеса творятся.) Пока непонятно. Ну, с этим пока сам разбираться буду.
Еще раз спасибо за помощь.
Привет! Попробуйте так.
Добрый вечер! Не подскажите как сделать так что бы задержка в основном цикле и сообщении была разная.А то у меня и сообщение и цикл зависает на столько сколько я прописываю для сообщения!
IsRun = true
function OnInit()
TableRTS = AllocTable()
AddColumn(TableRTS, 1,"Дата", true, QTABLE_DATE_TYPE, 13)
AddColumn(TableRTS, 2,"Время", true, QTABLE_TIME_TYPE, 10)
AddColumn(TableRTS, 3,"Код", true, QTABLE_STRING_TYPE, 10)
AddColumn(TableRTS, 4,"Цена", true, QTABLE_INT_TYPE, 10)
AddColumn(TableRTS, 5,"ГО", true, QTABLE_DOUBLE_TYPE, 10)
AddColumn(TableRTS, 6,"Лимит, руб.", true, QTABLE_DOUBLE_TYPE, 13)
AddColumn(TableRTS, 7,"Контракты", true, QTABLE_INT_TYPE, 13)
AddColumn(TableRTS, 8,"Позиция", true, QTABLE_INT_TYPE, 10)
CreateWindow(TableRTS)
Clear(TableRTS)
SetWindowCaption(TableRTS, "Таблица параметров RIZ7")
SetWindowPos(TableRTS, 0, 10, 600, 70)
InsertRow(TableRTS, -1)
end
function main()
while IsRun do
local TRADEDATE = getInfoParam("TRADEDATE")
local SERVERTIME = getInfoParam("SERVERTIME")
local SecCode = "USD000UTSTOM"
local Class = "ММВБ Валюта: ЕТС"
local LastPrice = getParamEx (Class, SecCode, "LAST").param_value
local BIDDEPTHT = getParamEx (Class, SecCode, "BIDDEPTHT").param_value
local VALUE = getParamEx (Class, SecCode, "VALUE").param_value
local LASTCHANGE = getParamEx (Class, SecCode, "LASTCHANGE").param_value
SetCell(TableRTS,1,1,tostring(TRADEDATE))
SetCell(TableRTS,1,2,tostring(SERVERTIME))
SetCell(TableRTS,1,3,tostring(SecCode))
SetCell(TableRTS,1,4,tostring(LastPrice))
SetCell(TableRTS,1,5,tostring(BIDDEPTHT))
SetCell(TableRTS,1,6,tostring(VALUE))
SetCell(TableRTS,1,7,tostring(LASTCHANGE))
if LASTCHANGE > "0.20" then
message("БОЛЬШЕ",1)
sleep(100000)
elseif LASTCHANGE < "0.17" then
message("МЕНЬШЕ",2)
sleep(100000)
end
sleep(1000)
end
end
function OnStop()
IsRun = false
DestroyTable(TableRTS)
end
Добрый день, такой вопрос: сколько скриптов возможно одновременно запустить в Quik? Это для тестирования, сделки не производиться, но каждый скрипт выводит инфу в Excel. Или может быть есть ограничения по выводу через DDE?
Name = scriptname:match(".+\\(.+)\.lua") -- Прочитал свое название
А на версии 8.5 - ругается, что делать?
Name = scriptname:match(".+\\(.+).lua") -- Прочитал свое название
А вот так работает
Добрый вечер. Прошу, помогите разобраться с SetUpdateCallback и SetEmptyCallback
Какую строку кода (используя SetUpdateCallback или SetEmptyCallback) надо добавить в нижеуказанный код, чтобы при появлении новой свечи вывести сообщение "Появилась новая свеча"?
Смотрите документацию по QLua (в интернете много информации)
Нужно использовать SetUpdateCallback
Формат вызова:
BOOLEAN res SetUpdateCallback (FUNCTION callback_function)
В качестве параметра принимает функцию обратного вызова.
Формат функции обратного вызова:
function call_back(NUMBER index)
Параметры:
• index – номер изменившейся свечки. Индексы свечек начинаются с 1.
Функция возвращает «true» в случае успешного завершения, иначе – «false».
Код:
В строке 14 я ошибся. Должно быть:
if not ds:SetUpdateCallback (call_back) then
while (Error == "" or Error == nil) and ds:Size() == 0 do sleep(1) end
так нельзя делать вообще
1. данных может не быть, тупо не было сделок никогда (лпционы, например);
2, после дисконекта данные могут появится часов через 5
цикл будет крутить "вечно", а ошибки не будет.
вот так можно сделать обезличенный калбэк:
а, забыл,
в калбэке первой строкой стоит сделать проверку
if exitflag then return end
иначе может быть ошибка при выключении скрипта, но тут это не критично
Здравствуйте kalikazandr!
Ваши замечания правильные. Я ответил "Good_man" формально, исходя из того, что , похоже, он только начал заниматься программированием на QLua.
Здравствуйте!
печально, что толку от "правильности" в рамках квика - нет, чего не коснись - работает криво.
это касается и других подобных ПО, которые пишут люди, никак не связанные с торговлей.
и пишут, и поправляют без конца, потому-что не понимают, что пишут и как это должно работать.
Здравствуйте. Подскажите как работать с метками.
Добавил я на график несколько меток.
С помощью: AddLevel()
А как изменить местоположение определенной метки?
Я понимаю сначала DelLabel(), а потом снова добавить AddLevel()
Или через SetLabelParams()
Но не пойму где взять: label_id–идентификатор метки
для начала добавляете тестовую метку, пофик на какой бар, получаете ее id и сразу удаляете.
test_id = AddLebel(tag, param)
теперь вам известно примерное кол-во меток на графике:
for chart_id =1, test_id do
local param = GetLabelParams(tag, chart_id)
if type(param) == "table" then
--это метка, ее id = chart_id
end
end