1 (2022-12-19 22:20:50 отредактировано Serge1234)

Тема: Простой вопрос по сделке через QLua скрипт

Я начал знакомство с QLua и пытался сделать пример покупки/продажи акции через скрипт. Нашёл какой-то пример робота, по нему сделал свой пример покупки/продажи по шелчку мыши. Попробовал купить что-то подешевле, чтобы проверить работу скрипта. Фонд Ликвидность (LQDT) ETF от ВТБ купить не удалось, акцию ГИТ (GRNT) тоже, а акцию Мечела (MTLR) купил и продал.

У меня CLASSCODE = 'TQBR', а SECCODE, как написано в скобках. Подскажите, какие должны были быть эти параметры, в сообщениях было "не найден инструмент GRNT" и т.п. Почему GRNT не найден, а MTLR найден? Также интересуют эти параметры для покупки/продажи металлов и валюты. Где их вообще можно найти, я через поисковики на нашёл?..

После отправки транзакции через sendTransaction, этот найденный мной старючий скрипт ждёт, пока не получит статус текущей транзакции:

 while is_run and trans_Status == nil do sleep(1) end

[...]

function OnTransReply(trans_reply)
  -- Если поступила информация по текущей транзакции
  if trans_reply.trans_id == trans_id then
     -- Передает статус в глобальную переменную
     trans_Status = trans_reply.status;
     -- Передает сообщение в глобальную переменную
     trans_result_msg  = trans_reply.result_msg;
  end

Через несколько секунд после сделки этот скрипт завешивает терминал, похоже, что не может выйти из бесконечного цикла выше. Видимо, в колбэке почему-то не сравнивается trans_reply.trans_id == trans_id. trans_id передаётся через sendTransaction:

 local Transaction =
  { ['TRANS_ID']   = tostring(trans_id), ...

 local res = sendTransaction(Transaction)

Почему так происходит, и как надо делать правильно? Дайте самый простой пример совершения сделок со всеми проверками на ошибки, чтобы самому не городить огород, спасибо за внимание.

2

Re: Простой вопрос по сделке через QLua скрипт

Похоже, сам нашёл ответ...

3

Re: Простой вопрос по сделке через QLua скрипт

Поделитесь с нами вашим ответом wink

4 (2022-12-21 12:10:48 отредактировано Serge1234)

Re: Простой вопрос по сделке через QLua скрипт

В Quik Создать окно/Текущие торги, там можно выбрать и посмотреть эти параметры.

Но у меня возник другой вопрос по тому же скрипту: при совершении сделки после sendTransaction не вызывается OnTransReply, Quik как бы перехватывает это дело и выводит сообщение, что транзакция удовлетворена. А в начале эксперимента, помнится, OnTransReply вызывалась и я после этого ничего такого криминального с ней не делал. Подскажите, в чём м.б. причина?

5

Re: Простой вопрос по сделке через QLua скрипт

Тоже разобрался: если отмотать сообщение Quik на шаг назад, видна ошибка выполнения в скрипте в OnTransReply... Какой полезный оказался форум! :-)

6

Re: Простой вопрос по сделке через QLua скрипт

Serge1234, заходите почаще wink

7

Re: Простой вопрос по сделке через QLua скрипт

Ещё вопрос возник: почему getParamEx иногда, как я только запустил скрипт, возвращает ноль? Например, по нажатию клавиши вывожу значение из параметра "QTY" для сберика, выдаются нули, пока не запрошу что-то типа "BID". После этого эта функция с параметром "QTY" начинает выводить похожее на правду число.

8

Re: Простой вопрос по сделке через QLua скрипт

А как BID запрашиваете? из скрипта или ТТТ открываете?
В общем надо подписываться на параметры, чтобы точно было.

См. getParamEx2 и комментарий к ней в справке:

Функция предназначена для получения значений всех параметров биржевой информации из Таблицы текущих торгов с возможностью в дальнейшем отказаться от получения определенных параметров, заказанных с помощью функции ParamRequest. Для отказа от получения какого-либо параметра воспользуйтесь функцией CancelParamRequest.

9 (2022-12-23 12:44:18 отредактировано Serge1234)

Re: Простой вопрос по сделке через QLua скрипт

ТТТ не открывал, просто захотел проверить, что будет выдавать getParamEx по нажатию на клавиши. Некоторые параметры он сразу выдавал, вместо некоторых сначала выдавал нули, а потом выдавал правильно. Т.е. надо просто из скрипта подписаться на нужные параметры?

Поясните, время последней сделки "TIME" - как понимать это число?

И насколько быстро скрипт получает информацию с сервера, сколько раз в секунду это делается Quik? Я заметил в программке Руссиновича dbgview при выводе PrintDbgStr, что после sendTransaction до получения OnTransReply проходит почти 2 сек.... Мне такая скорость что-то не нравится...

Если скрипт подпишется на получение семи параметров типа "BID", "OFFER" и т.п. по 20 акциям, это не сильно будет грузить сервер брокера?

И подскажите, как поймать начало торгов, чтобы сразу выставить заявку по актуальной информации в стакане, а то до начала торгов в стакане сидят левые цены, цена на покупку превышает цену продажи. Неужели в этом случае можно по ошибке выставить неправильную заявку?

Я на графиках наблюдаю, что в 9:59 появляется красная свечка из одной горизонтальной линии (напр., гэп вверх, при этом в свечке есть объём сделки), эта картинка висит минуту, а потом уже начинается динамика. Как это можно понять?

10

Re: Простой вопрос по сделке через QLua скрипт

Привет. Если можно, поделитесь исходным кодом или ссылкой на прототип. Хочу начать осваивать LUA, не хватает примеров. Первые так сказать шаги )

11

Re: Простой вопрос по сделке через QLua скрипт

Bob, посмотрите вот здесь ссылки
[url]https://qlua.ru/help/[/url]
Есть официальная документация от ARQA, можете начать с неё, там есть примеры.

12

Re: Простой вопрос по сделке через QLua скрипт

Спасибо, изучу. С Наступающим, всем здоровья, мира!

13 (2022-12-25 22:32:12 отредактировано Serge1234)

Re: Простой вопрос по сделке через QLua скрипт

Наберите в поиске
qlua пример простого торгового робота
Т.к. не все ссылки ведут на этот сайт, то могут подумать, что я кого-то рекламирую...

К примеру, чтобы подписаться на получение лучшей цены покупателя и продавца (из стакана котировок Магнита), нужно вызвать
ParamRequest('TQBR', 'MGNT', 'BID')
ParamRequest('TQBR', 'MGNT', 'OFFER')

Чтобы посмотреть в окне сообщений отладчика (утилитой dbgview64.exe Руссиновича) эти значения, надо вызвать
PrintDbgStr(tostring(getParamEx2('TQBR', 'MGNT', 'BID').param_value))
PrintDbgStr(tostring(getParamEx2('TQBR', 'MGNT', 'OFFER').param_value))

Для получения индекса Мосбиржи вызываем
getParamEx2("INDX", "IMOEX", "CURRENTVALUE")

Чтобы создать окно с таблицей, см. примеры с функциями
AllocTable
AddColumn
CreateWindow
SetWindowPos
SetWindowCaption
InsertRow
SetCell

В обработчике OnTableEvent ловите события от мыши и клавиатуры.

14

Re: Простой вопрос по сделке через QLua скрипт

Почему-то значения BID и OFFER в моей программке не соответствуют положению дел в стакане котировок, который я смотрю в Quik и в приложении для Андроида. Такое впечатление, что в скрипт сначала передаются старючие значения и только через несколько минут эти значения совпадают с тем, что показывает терминал и приложение. Программка такая:

PrintDbgStr(tostring(ParamRequest('TQTF', 'OBLG', 'BID'))..' '..tostring(ParamRequest('TQTF', 'OBLG', 'OFFER')))
PrintDbgStr(getParamEx2('TQTF', 'OBLG', 'BID').param_value..' '..getParamEx2('TQTF', 'OBLG', 'OFFER').param_value)

Почему так происходит, и как это исправить, ведь так работать невозможно...

15

Re: Простой вопрос по сделке через QLua скрипт

А в терминале с чем сравниваете? стакан или Таблица текущих торгов?
Вообще-то крайне странно. Не должно такого быть.

16 (2022-12-27 23:55:26 отредактировано Serge1234)

Re: Простой вопрос по сделке через QLua скрипт

В терминале и в стакане смотрю и текущую цену на графике цены и объёма (OFFER), в приложении для Андроида в стакане тоже совпадает с тем, что в терминале, а в этой программке значения BIF и OFFER начинают совпадать со стаканом в терминале только через несколько минут после первого запуска этой программки...

17 (2022-12-28 11:52:30 отредактировано Serge1234)

Re: Простой вопрос по сделке через QLua скрипт

Кстати, сейчас запустил эту программку, она показывает true true и нули! По Магниту проверил - то же самое! Как хочешь, так и работай в квике на клуа! Можно выставить заявку по отрицательной цене, и брокер её принимает!

Накануне обновил квик на версию 10.0.1.18...

Люди, как вы пишете торговые программки в этой системе??

По Магниту поставил неверный класс бумаги, и всё равно выдаёт true! Похоже, ParamRequest вообще не работает и всегда выдаёт true! getParamEx getParamEx2 тоже не работает, также и по другим параметрам (LAST, QTY)...

18 (2022-12-28 12:10:46 отредактировано Serge1234)

Re: Простой вопрос по сделке через QLua скрипт

Опа, а сейчас запускаю эту программку, по Магниту она выдаёт нормальные значения, а по облигациям нули!

Кстати, окно с графиком Магнита у меня открыто в квике, а окно по облигациям нет. По Ликвидности окно тоже не открыто и тоже выдаёт нули, а по фонду ВТБ Золото окно с графиком в квике открыто, и эта программка по Золоту показывает верные значения. Получается, что несмотря на подписку программка показывает только параметры тех бумаг, окна с графиками по которым открыты в квике! Так что, если я хочу получать параметры по 100 бумагам, мне надо открыть в квике 100 окон с этими бумагами??

На этих форумах по клуа похоже, бесполезно что-то спрашивать, получается глас вопиющего в пустыне...

19 (2022-12-28 12:15:09 отредактировано Serge1234)

Re: Простой вопрос по сделке через QLua скрипт

Опа, а через несколько минут программка уже начала показывать верные значения по фондам Рос. облигации и Ликвидность, хоть я эти графики в терминале не открывал. Получается, что квик подписывается на получение заказанных параметров где-то через минут 20, а до этого получаем нули при отсутствии ошибки...

20

Re: Простой вопрос по сделке через QLua скрипт

Serge1234 пишет:

Кстати, окно с графиком Магнита у меня открыто в квике, а окно по облигациям нет. По Ликвидности окно тоже не открыто и тоже выдаёт нули, а по фонду ВТБ Золото окно с графиком в квике открыто, и эта программка по Золоту показывает верные значения.

Открытые окна с параметрами многое объясняют.
Подписка - не означает, что параметры тут же можно и получать. Подписка сработала - хорошо. Терминал передал на сервер информацию "хочу получать данные такие-то". Постепенно сервер терминалу их пришлет и тогда вы эти данные увидите.
Просто последовательность команд "подписаться - получить параметры" ничего не решает. Надо подписаться - и постепенно параметры начнут приезжать. Только в этот момент точно не надо стоять в callback-функции, например. Т.е. занимать основной поток терминала, т.к. пока это поток не отпустить для работы самого терминала - ничего не приедет.

"Несколько минут" - это довольно странное время, конечно. Но тут скорее надо смотреть на скрипт целиком как он устроен. Ну либо речь про самое начало торгов когда поток данных огромный и если в это момент только-только подписаться на получение - может что-то такое и будет. Хотя все равно многовато.

Проведите простой эксперимент: откройте заранее таблицу торгов по нужным инструментам с нужными параметрами. Как быстро в ней появятся значения? а уж потом запускайте скрипт (в этом же терминале!) - в нем значения будут сразу.

21 (2022-12-28 22:59:03 отредактировано Serge1234)

Re: Простой вопрос по сделке через QLua скрипт

Нет! Я сейчас в терминале смотрю BID и OFFER этого фонда ВТБ Росс. облигации, в стакане, соответственно, 133.36 и 133.40 р. Приложение для Андроида показывает то же. А этот скрипт упорно показывает 133.40 и 133.44 р. Откуда он это получает?

И второе: если я на что-то подписАлся, то я в скрипте как-то должен же узнать, начали эти данные соответствовать действительности, или они левые, как те, что вижу сейчас?

В этой моей программке, что я приводил выше, нет коллбэк функций, она не занимает время.

... Прошло 15 минут с тех пор, как я начал запускать эту программку, что привёл выше, а она выдаёт всё те же левые значения 133.40 и 133.4...

Вот здесь нашёл вроде бы решение проблемы:
[url]https://forum.quik.ru/messages/forum10/message46822/topic5631/#message46822[/url]

Получается, что getParamEx2, грубо говоря, фуфло, и непонятно, для чего нужна... А я думал: буду быстро опрашивать в цикле эти значения без коллбэков и вызова "тяжёлых" функций... Вот тебе, бабушка, и Юрьев день...

Обратил внимание на квалификацию саппорта квика в этой ветке их форума:
Alexander Kopyatkevich QUIK clients support:
===
09.07.2020 17:54:34
Именно для этого и нужно предварительно выполнить подписку на получение определенного параметра через ParamRequest.
После выполнения подписки с сервера QUIK отправятся последние данные, которые и будут являться актуальными.
===

Кстати, сейчас после 19:00 несколько минут опять наблюдал маразм в некоторых стаканах квика (в GOLD ETF): зелёненькие строчки с ценами и количеством для покупок наползали на красные строчки, некоторые зелёные строчки были высоко в красных. Лучшая цена на покупку была выше, чем лучшая цена на продажу. Получается, что мало получить стакан, надо делать защиту от дурака: перебирать все цены снизу вверх и проверять, что они строго возрастают. Только после этого можно что-то пытаться делать, а то можно навыставлять скриптом такие заявки, что пойдешь по миру...

И для бумаг, с которыми работаешь в скрипте, надо задать скрипту диапазон цен, чтобы как-то определять, что полученная из функции цена похожа на реальную... Кто мешает брокеру подшутить и передать, скажем, значение BID для акции сберика в размере 1000 р.?

Кстати, эта моя программка, что выше, по-прежнему показывает значения для облигаций в 133.40 и 133.44 р. И это после того, как квик 2341234123 раз получал эти параметры с сервера... Это разработчики квика такие молодцы?

Да, ещё остаётся проблема: если в стакане долго ничего не меняется, но скрипт не хочет ждать, тогда, похоже, в цикле надо запускать getQuoteLevel2, пока она не выдаст скрипту всё, что ему надо для начала работы?

22

Re: Простой вопрос по сделке через QLua скрипт

Интересно, можно успеть поймать скриптом падение цены во время крупной продажи и на кратковременной просадке купить бумаг? Такое впечатление, что с момента отправки транзакции и до приёма заявки сервером биржи пройдёт не менее секунды, как правило, ловить уже будет нечего...

23

Re: Простой вопрос по сделке через QLua скрипт

Serge1234 пишет:

... Прошло 15 минут с тех пор, как я начал запускать эту программку

В том виде как вы привели эту программку - она не может 15 минут выполняться.
Это просто 2 строчки. Если буквально такой скрипт сделать - то он запустится и тут же остановится.
Т.е. на самом деле у вас скрипт совсем другой, а в этом деле как раз все нюансы и важны. но вы их не показываете.

Serge1234 пишет:

А я думал: буду быстро опрашивать в цикле эти значения без коллбэков

Так колбеки - это ж и есть кайф! не надо крутить никакие циклы, не надо подбирать sleep.
Как только терминал получил событие - тут же колбек и вызвался, мы тут же на него и отреагировали.

Serge1234 пишет:

Кстати, сейчас после 19:00 несколько минут опять наблюдал маразм в некоторых стаканах квика (в GOLD ETF): зелёненькие строчки с ценами и количеством для покупок наползали на красные строчки, некоторые зелёные строчки были высоко в красных.

Там в 19-00 наверное торговая сессия заканчивается? тогда после торг. сессии биржа может транслировать всё что угодно (надо не забывать, что квик лишь ретранслирует данные с биржи!). Возможно там какой-то специальный послеторговый аукцион идет, где заявки сразу не удовлетворяются и просто собираются какое-то время, потому и чехарда в стакане.

Serge1234 пишет:

И для бумаг, с которыми работаешь в скрипте, надо задать скрипту диапазон цен, чтобы как-то определять, что полученная из функции цена похожа на реальную... Кто мешает брокеру подшутить и передать, скажем, значение BID для акции сберика в размере 1000 р.?

Вообще говоря любые ограничения в скриптах - очень полезны. По времени, по скачкам цен, по прочим разным параметрам. Реальные скрипты всегда постепенно обрастают такого рода защитами, т.к. вполне может проскочить какая-то одна сделка по "нереальной" цене (ну т.е. сделка-то такая на самом деле пройдёт, но такой цена будет ну оочень кратковременно), а скрипт с дуру среагирует и начнет скупать, хотя цена уже отскочила.
И чем "скоростнее" стратегия - тем больше таких защит надо предусматривать в скрипте. Обязательно!

Вообще сколь-нибудь скоростные стратегии реализовывать и пытаться вскочить в большие гэпы - очень скользкое занятие в рамках клиентского терминала. Клиентские терминалы в этой цепочке - совершенно точно самые крайние звенья в  этой цепи.
А любой гэп - это точно всегда большая волотильность на рынке, а значит забитые интернет-каналы, пиковые нагрузки на сервера брокера по рассылке данных и т.д. Где в этом месте окажется ваш конечный терминал - очень большой вопрос. И насколько доезжающая в него информация будет актуальной - тоже вопрос. И вы никак не можете ни проверить это, но влиять.

Serge1234 пишет:

Да, ещё остаётся проблема: если в стакане долго ничего не меняется, но скрипт не хочет ждать, тогда, похоже, в цикле надо запускать getQuoteLevel2, пока она не выдаст скрипту всё, что ему надо для начала работы?

Это не понятно. getQuoteLevel2 выдает текущее состояние стакана, полученное терминалом. Зачем много раз опрашивать?

24 (2022-12-29 22:49:36 отредактировано Serge1234)

Re: Простой вопрос по сделке через QLua скрипт

Serge1234 пишет:

... Прошло 15 минут с тех пор, как я начал запускать эту программку

swerg пишет:

В том виде как вы привели эту программку - она не может 15 минут выполняться.
Это просто 2 строчки. Если буквально такой скрипт сделать - то он запустится и тут же остановится.
Т.е. на самом деле у вас скрипт совсем другой, а в этом деле как раз все нюансы и важны. но вы их не показываете.

Вы шутите? Я имел в виду, что я эту программку запускал много раз в течение 15-ти минут, и ничего не менялось... И данные не менялись ЧАСАМИ, хотя, за день до этого актуальные данные поступали уже через неск. минут.

Serge1234 пишет:

Кстати, сейчас после 19:00 несколько минут опять наблюдал маразм в некоторых стаканах квика (в GOLD ETF): зелёненькие строчки с ценами и количеством для покупок наползали на красные строчки, некоторые зелёные строчки были высоко в красных.

swerg пишет:

Там в 19-00 наверное торговая сессия заканчивается? тогда после торг. сессии биржа может транслировать всё что угодно (надо не забывать, что квик лишь ретранслирует данные с биржи!). Возможно там какой-то специальный послеторговый аукцион идет, где заявки сразу не удовлетворяются и просто собираются какое-то время, потому и чехарда в стакане.

Сессия на мосбирже оканчивается вроде бы в 18:45, а в 19:00 она возобновляется, поэтому 19:02 рабочее время...

Serge1234 пишет:

Да, ещё остаётся проблема: если в стакане долго ничего не меняется, но скрипт не хочет ждать, тогда, похоже, в цикле надо запускать getQuoteLevel2, пока она не выдаст скрипту всё, что ему надо для начала работы?

swerg пишет:

Это не понятно. getQuoteLevel2 выдает текущее состояние стакана, полученное терминалом. Зачем много раз опрашивать?

Да, с этим я разобрался. После переделки скрипта в соответствии с примером Старателя, он, похоже, стал работать корректно. Остаётся непонятным, как, напр., получить актуальную цену последней сделки (LAST), если getParamEx2 доверять нельзя, а в стакане плохо видно эти сделки...

На этом форуме как-то непонятно работает цитирование, мне в этом ответе пришлось расставлять теги цитирования вручную...

25 (2022-12-29 23:26:05 отредактировано Serge1234)

Re: Простой вопрос по сделке через QLua скрипт

Сейчас смортю минутные свечи в окне OBLG ETF График цены и объёма, навожу курсор последовательно слева направо на свечи и в хинте под курсором смотрю время: 21:53, 22:00, 22:03, 22:05, 22:06, 22:09, 22:13. В соседнем окне GOLD ETF время в соседних свечах, как и положено, возрастает на 1 минуту. Как это чудо можно понять??

Посмотрел это на Андроиде, и там та же картина. Такое впечатление, что пропускаюся свечи, у которых цена не изменилась и объём равен нулю. Я о такой фиче не знал...