Добрый день! Решил освоить азы qlua. Не понимаю, какая конструкция должна быть, чтобы запустить свою функцию по событию.
Код
T = getParamEx("SPBOPT","SR6000BQ5","theorprice")
message(T.param_value,2)
а событие - изменение этого параметра в ТТП
Пожалуйста, напишите этот скрипт полностью. С обозначением функции, с main, все как полагается. Очень буду признателен, а то собираю куски по частям, ерунда какая то получается..
Виктор, вы хотите, чтобы при изменении параметра theorprice, было оповещение? Тогда Вам понадобиться функция OnParam. Функция будет вызываться терминалом при каждом изменении текущих параметров.
Код
function OnParam( class, sec )if class =="SPBFUT" and sec ==
"RIZ2" then tbid = getParamEx(class, sec, "bid") if
tbid.param_value > =130000 then''end
Здравствуйте, Егор! Спасибо, что откликнулись. Я хотел увидеть скрипт полностью. С синтаксисом. Чтобы была обозначена функция, например просто сообщение выдавала по изменению цены. Чтобы main был прописан с обработкой этой функции (именно Function, обращение к ней, а не в теле main). В итоге я хотел на этом примере разобраться, как правильно писать скрипты на qlua. Я только начинаю осваивать этот язык, и хочу понять конструкцию. Понимаю, что задача простая, но требует время. Если будет возможность, был бы признателен за помощь. На примере я бы быстрее разобрался. как в свое время с купайлом. Нужен старт. Еще раз спасибо за отклик. Если у Вас руки так и не дойдут, понимаю.
Viktor MMM пишет: Здравствуйте, Егор! Спасибо, что откликнулись. Я хотел увидеть скрипт полностью. С синтаксисом. Чтобы была обозначена функция, например просто сообщение выдавала по изменению цены. Чтобы main был прописан с обработкой этой функции (именно Function, обращение к ней, а не в теле main). В итоге я хотел на этом примере разобраться, как правильно писать скрипты на qlua. Я только начинаю осваивать этот язык, и хочу понять конструкцию. Понимаю, что задача простая, но требует время. Если будет возможность, был бы признателен за помощь. На примере я бы быстрее разобрался. как в свое время с купайлом. Нужен старт. Еще раз спасибо за отклик. Если у Вас руки так и не дойдут, понимаю.
Виктор, к сожалению, мы скрипты не пишем. Готовы лишь помочь, если возникают сложности. Краткий пример выше привели.
Егор, еще вопрос. А в qlua в принципе можно получить реакцию при изменении конкретного параметра, как у меня? Судя по документации OnParam вызовется при любом изменении текущих параметров, а потом уже я разбираю какое значение принял интересующий меня параметр.
Viktor MMM пишет: Егор, еще вопрос. А в qlua в принципе можно получить реакцию при изменении конкретного параметра, как у меня? Судя по документации OnParam вызовется при любом изменении текущих параметров, а потом уже я разбираю какое значение принял интересующий меня параметр.
Да можно, в функции getParamEx вы и указываете тот параметр на которых хотите подписаться. Т.е пр вызове функции Onparam вы можете вызваться функцию getParamEx и получить значение необходимого параметра.
is_run=true
function main( ... )
while is_run do
sleep(2000)
end
end
function OnParam(class,sec)
if class == "SPBOPT" and sec == "SR006500BR5" then tp = getParamEx(class,sec,"theorprice") end
message(tp,2)
end
function OnStop(stop_flag)
is_run=false
end
Хочу, чтобы при изменении теор цены выскочило сообщение. Понимаю, что ошибка в пока что не понимании принципов построения. Можете ответить, что не так?
не могу удалить прошлое свое сообщение, удалите, пожалуйста. Вот рабочий скрипт
Код
is_run=true
function main( ... )
while is_run do
sleep(2000)
end
end
function OnParam(class,sec)
if class == "SPBOPT" and sec == "SR6500BR5" then
tp1 = getParamEx(class,sec,"theorprice")
message(class.." "..sec.." "..tp1.param_value,2)
end
end
function OnStop(stop_flag)
is_run=false
end
но логику в нем я вижу следующую: произошло изменение (не важно чего) в ТТП по опционам. Вызывается функция моя и в ней я анализирую, что пришло. Это не есть подписка именно на событие изм. теор. цены. Я что-то не так сделал или это и есть максимум в решении задачи?
Как я понимаю, в качестве подписки должна выступать открытая ТТП в Квике. И желательно, чтобы соответствующее поле выводилось в таблицу. Если что-то меняется в ТТП, то вызывется OnParam. Там уже надо анализировать что изменилось при помощи getParamEx().
Да можно, в функции getParamEx вы и указываете тот параметр на которых хотите подписаться. Т.е пр вызове функции Onparam вы можете вызваться функцию getParamEx и получить значение необходимого параметра.
Я, Constantin Constantin,теперь тоже так думаю. Но слова Егора Зайцева понял иначе. Что можно вызвать функцию при изменении именно тор цены, а не ТТП в целом, а потом разбираться было ли там изменение нужного мне параметра или нет.
Да можно, в функции getParamEx вы и указываете тот параметр на которых хотите подписаться. Т.е пр вызове функции Onparam вы можете вызваться функцию getParamEx и получить значение необходимого параметра.
Я, Constantin Constantin ,теперь тоже так думаю. Но слова Егора Зайцева понял иначе. Что можно вызвать функцию при изменении именно тор цены, а не ТТП в целом, а потом разбираться было ли там изменение нужного мне параметра или нет.
Добрый день.
Виктор, при каждом изменении того или иного параметра (который укажите в коде) вы будите получать сообщение. Т.е был параметр = 15, изменился и стал 20, 20 вы и получите в сообщении. Все изменения можете смотреть в таблице сообщений.
Egor Zaytsev пишет: Виктор, при каждом изменении того или иного параметра (который укажите в коде) вы будите получать сообщение.
Нет, OnParam будет срабатывать при изменении любого параметра, а не только того, который вам нужен.
Добрый день.
Имел ввиду, что если настроить фильтр, то можно увидеть изменение по конкретному параметру. Так да, изменения будут по любому параметру, но получать сообщение только по конкретному. Например так:
Код
function OnParam(class,sec)
if class == "SPBFUT" and sec == "BRJ5" then
tp1 = getParamEx(class,sec,"qty")
message(class.." "..sec.." "..tp1.param_value,2)
end
В противном случае можно использовать функцию CreateDataSource
Egor Zaytsev пишет: Имел ввиду, что если настроить фильтр, то можно увидеть изменение по конкретному параметру. Так да, изменения будут по любому параметру, но получать сообщение только по конкретному. Например так:
Код
function OnParam(class,sec)
if class == "SPBFUT" and sec == "BRJ5" then
tp1 = getParamEx(class,sec,"qty")
message(class.." "..sec.." "..tp1.param_value,2)
end
Да нет же. Так вы будете получать сообщение при изменении любого параметра по данной бумаге. Максимум, что можно сделать, это проверять, была ли вызвана функция OnParam изменением интересующего параметра или какого-то другого:
Код
local tp_prev
function OnParam(class,sec)
if class == "SPBFUT" and sec == "BRJ5" then
tp1 = getParamEx(class,sec,"qty").param_value
if tp1 ~= tp_prev then
message(class.." "..sec.." "..tp1,2)
tp_prev = tp1
end
end
end
Надо делать так, как надо. А как не надо - делать не надо.
Серж, да, спасибо.. Я уже понял. Событие - ЛЮБОЕ изменение. Его обрабатываем и выясняем. Только надо запоминать предыдущее значение. Подписаться на изменение конкретного параметра не возможно.
Viktor MMM пишет: Подписаться на изменение конкретного параметра не возможно.
Можно, как вам уже указали, используя CreateDataSource и SetUpdateCallback. Но, если необходимо отслеживать много параметров, то неизвестно, как это отразится на производительности.
Надо делать так, как надо. А как не надо - делать не надо.
Viktor MMM пишет: Подписаться на изменение конкретного параметра не возможно.
Можно, как вам уже указали, используя CreateDataSource и SetUpdateCallback. Но, если необходимо отслеживать много параметров, то неизвестно, как это отразится на производительности
вопрос к client support,
задача - сделать полноценный торговый движок на QLUA, с событиями и пр. Чтобы её значительно упростить - хотелось бы (как это не раз уже предлагалось на старом и новом форумах) иметь в OnParam ещё одно поле - параметр, который непосредственно изменился. Глядишь и надобность в "куче CreateDataSource", как выше упомянуто - отпадёт. Если этого не сделать - то весь огород из "case и switch" (говоря в терминологии C++) перейдёт (а точнее, - уже перешёл) на плечи пользователей. Таким образом, почему бы изначально не отслеживать процесс изменения непосредственно в недрах квика, сравнивать все эти старые и новые значения? Ведь это всё у вас и так уже есть - надо просто довести "до ума", а не предлагать пользователям какие-то очередные функции-"заплатки". Ведь видно же, что такой функционал - это явная ваша недоработка. И это никак нельзя назвать каким-то особым или вынужденным программистским трюком. (если Вам мои слова показались излишне резкими - то, это Вам просто показалось...)
В качестве ответа на вопрос звучащий в названии темы:
пока, для себя, вижу лишь только одну альтернативу:
создать объект "тикер",
при его создании - получить всю линейку параметров по этому тикеру через getParamEx, сохранить её для последующего сравнения.
добавить в конструктор объекта вызов метода: AddParamListener, задачей, которого зарегистрироваться в таблице подписчиков на обновление данных, получаемых из OnParam и других квиковских коллбеков.
в OnParam - пробегаться по этой таблице подписчиков на обновление данных и вызывть метод ticker.update().
в методе ticker.update() - проверять ранее сохранённый "срез данных" со свежими (повторно вызывать getParamEx). Однако: такой номер - не для всех параметров прокатит - поэтому придётся настраивать под каждый определённое поведение алгоритмов сравнения по косвенным признакам (вот Вам и куча из "case и switch" (говоря в терминологии C++) [спасибо "Арке" за наше счастливое ...]). При этом, это ещё сильно ударит по масштабируемости такого объекта (ticker) - бо как праметров - тьма и все они разные для тех или иных инструмментов, равно как и алгоритмы сравнения (старый-новый параметр).
Если, каким-то чудом, всё же удасться изобрести "гига-велосипед" под названием п.5. то, дальше - дело за малым: можно смело создавать свои события и ботов на них реагирующих, причём в количестве - ограниченном лишь только быстродействием канала с брокером и скоростью работы компа. Если интересует конкретно, реализовать события в объекте ticker - то, - всё также как и с OnParam: пробегаем по таблице подписчиков и вызываем соответствующий коллбек (если он "assigned" так сказать)
Viktor MMM пишет: Подписаться на изменение конкретного параметра не возможно.
Можно, как вам уже указали, используя CreateDataSource и SetUpdateCallback. Но, если необходимо отслеживать много параметров, то неизвестно, как это отразится на производительности