Как получить событие - изменение в ТТП?

Страницы: 1
RSS
Как получить событие - изменение в ТТП?
 
Добрый день!
Решил освоить азы qlua.
Не понимаю, какая конструкция должна быть, чтобы запустить свою функцию по событию.

Код
   T = getParamEx("SPBOPT","SR6000BQ5","theorprice")
    message(T.param_value,2)


а событие - изменение этого параметра в ТТП

Пожалуйста, напишите этот скрипт полностью. С обозначением функции, с main, все как полагается. Очень буду признателен, а то собираю куски по частям, ерунда какая то получается..
 
Цитата
Viktor MMM пишет:
getParamEx
Добрый день.

Виктор, вы хотите, чтобы при изменении параметра 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().
 
Цитата
Egor Zaytsev пишет:

Да можно, в функции getParamEx вы и указываете тот параметр на которых хотите подписаться.
Т.е пр вызове функции Onparam вы можете вызваться функцию getParamEx и получить значение необходимого параметра.
Я, Constantin Constantin,теперь тоже так думаю. Но слова Егора Зайцева понял иначе. Что можно вызвать функцию при изменении именно тор цены, а не ТТП в целом, а потом разбираться было ли там изменение нужного мне параметра или нет.
 
Цитата
Viktor MMM пишет:
Цитата
Egor Zaytsev пишет:

Да можно, в функции getParamEx вы и указываете тот параметр на которых хотите подписаться.
Т.е пр вызове функции Onparam вы можете вызваться функцию getParamEx и получить значение необходимого параметра.
Я, Constantin Constantin ,теперь тоже так думаю. Но слова Егора Зайцева понял иначе. Что можно вызвать функцию при изменении именно тор цены, а не ТТП в целом, а потом разбираться было ли там изменение нужного мне параметра или нет.
Добрый день.

Виктор, при каждом изменении того или иного параметра (который укажите в коде) вы будите получать сообщение.
Т.е был параметр = 15, изменился и стал 20, 20 вы и получите в сообщении. Все изменения можете смотреть в таблице сообщений.
 
Цитата
Egor Zaytsev пишет:
Виктор, при каждом изменении того или иного параметра (который укажите в коде) вы будите получать сообщение.
Нет, OnParam будет срабатывать при изменении любого параметра, а не только того, который вам нужен.
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Серж пишет:
Цитата
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++) перейдёт (а точнее, - уже перешёл) на плечи пользователей. Таким образом, почему бы изначально не отслеживать процесс изменения непосредственно в недрах квика, сравнивать все эти старые и новые значения? Ведь это всё у вас и так уже есть - надо просто довести "до ума", а не предлагать пользователям какие-то очередные функции-"заплатки". Ведь видно же, что такой функционал - это явная ваша недоработка. И это никак нельзя назвать каким-то особым или вынужденным программистским трюком. (если Вам мои слова показались излишне резкими - то, это Вам просто показалось...)
 
В качестве ответа на вопрос звучащий в названии темы:

пока, для себя, вижу лишь только одну альтернативу:
  1. создать объект "тикер",
  2. при его создании - получить всю линейку параметров по этому тикеру через getParamEx, сохранить её для последующего сравнения.
  3. добавить в конструктор объекта вызов метода: AddParamListener, задачей, которого зарегистрироваться в таблице подписчиков на обновление данных, получаемых из OnParam и других квиковских коллбеков.
  4. в OnParam - пробегаться по этой таблице подписчиков на обновление данных и вызывть метод ticker.update().
  5. в методе ticker.update() - проверять ранее сохранённый "срез данных" со свежими (повторно вызывать getParamEx). Однако: такой номер - не для всех параметров прокатит - поэтому придётся настраивать под каждый определённое поведение алгоритмов сравнения по косвенным признакам (вот Вам и куча из "case и switch" (говоря в терминологии C++) [спасибо "Арке" за наше счастливое ...]). При этом, это ещё сильно ударит по масштабируемости такого объекта (ticker) - бо как праметров - тьма и все они разные для тех или иных инструмментов, равно как и алгоритмы сравнения (старый-новый параметр).
  6. Если, каким-то чудом, всё же удасться изобрести "гига-велосипед" под названием п.5. то, дальше - дело за малым: можно смело создавать свои события и ботов на них реагирующих, причём в количестве - ограниченном лишь только быстродействием канала с брокером и скоростью работы компа. Если интересует конкретно, реализовать события в объекте ticker - то, - всё также как и с OnParam: пробегаем по таблице подписчиков и вызываем соответствующий коллбек (если он "assigned" так сказать)
 
если у кого есть, что сказать/дополнить - Welcome. :))
 
Цитата
sam063rus пишет:
Цитата
Серж пишет:
Цитата
Viktor MMM пишет:
Подписаться на изменение конкретного параметра не возможно.
Можно, как вам уже указали, используя CreateDataSource и SetUpdateCallback. Но, если необходимо отслеживать много параметров, то неизвестно, как это отразится на производительности
вопрос к client support,
https://forum.quik.ru/messages/forum1/message5415/topic343/#message5415
 
Цитата
Sergey Gorokhov пишет:
https://forum.quik.ru/messages/forum1/message5415/topic343/#message5415
куча топиков, и вроде и с разными темами, а об одном и том но с разных сторон)))
Страницы: 1
Читают тему
Наверх