Блог им. kurd

Все ли знают, что в Quik'е у каждого скрипта main() свой отдельный Windows-поток (thread)?

Пишу потому, что к большому моему удивлению открыл, что весьма активные писатели Смарт-лаба этого не знают. В главном потоке программы Quik работают только функции обратного вызова типа OnTransReply, OnTrade и индикаторы. Кстати, OnTrade срабатывает не только по заявкам из скрипта, но и поданным интерактивно.

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

Хотя QLua обладает весьма эффективными средствами взаимодействия с любым приложением Windows, не так просто придумать повод для обращения QLua за посторонней помощью. Например, сохранять на диске текущие данные QLua может массой способов от простейшего io.read/write до SQLite.
Количество библиотек для QLua просто изумляет.

NB. Известная проблема скриптовых языков, что ошибки-описки в именах функций и переменных влекут трудно диагностируемые сбои работы, решается двумя простейшими средствами.
1) Все константы собираются в одном модуле с контролем доступа через мета-функцию __index(). Это даёт диагностику времени выполнения.
2) Для контроля имён при разработке кода следует использовать общедоступную программу lualint. А для блокировки ложных срабатываний по глобальным именам из других модулей, можно написать свой код, фильтрующий эти имена.

Чтобы расширить область контроля lualint, следует больше данных именовать как отдельные переменные. Имена полей в таблицах контролю не доступны. По возможности, их следует представлять константами из упомянутых модулей констант.
Поэтому, там где напрашивается сгруппировать переменные и функции в объект-таблицу, я сдерживаю свои навыки ООП и для группировки использую вульгарные префиксы. Например, pos_EntryPrice, pos_Exit() означают поле и функцию в «виртуальном» объекте типа Position.
  • обсудить на форуме:
  • Quik Lua
★13
26 комментариев
В Qlua всего 2 потока:
1. события
2.main()
Других потоков не существует в природе.
Если вы говорите о нитях lua — это фактически один поток, принудительно переключаемый между задачами.
Вы пишите абсурд. Видимо, от непонимания предмета.
Что там в разных программах в main() разные потоки, это очевидно, и неинтересно.
avatar
3Qu, объявленный факт установлен не умозрительно. но экспериментально. С вызовом из Qlua функции GetCurrentThreadId() из WIN32 API.
avatar
Rostislav Kudryashov, покажите кусок Луа, где вы создаете доп поток. У Луа нет для этого средств.
avatar
3Qu, ты не понял. Запуск  из окна «Доступные скрипты» каждого нового скрипта со своей function main()  создаёт новый Window-поток (thread). Никаких других средств для этого не требуется.
Брось свои рассуждалки. Я тебе указал обще-доступный эксперимент, дающий исчерпывающую информацию.
avatar
Rostislav Kudryashov, это очевидно. Мало того, у каждой такой свой изолированный стек.
И что мы имеем с гуся?
avatar
3Qu, мы имеем гуся-догматика, типа Аристотеля. Который путём рассуждений открыл, что у «женщины зубов меньше, чем у мужчины».
Его безмерная вера в силу рассуждений не позволила ему сосчитать женские зубы экспериментально.
Но тебе, прежде чем приступать к эспериментам с потоками Windows, надо ознакомиться с назначением WIN32 API функции GetCurrentThreadId().
avatar
Rostislav Kudryashov, так, что мы имеем с того, что вы для себя открыли то, что в каждой из программ main() выполняется в своем потоке? Что было и до вас очевидно.
Что это конкретно дает программисту? Какие новые возможности?
avatar
А почему теряется в квике при разрыве Связи id транзакции?
avatar
OnTrade срабатывает не только по заявкам из скрипта, но и поданным интерактивно
По идее он просто по событию срабатывает(пришла новая сделка) неважно откуда, чтобы лишний раз не проверять таблицу сделок как в квипл скрипте
avatar
Иван Иванов, а вот OnTransReply так не делает.
PS Что ещё интереснее, что реакция OnOrder на заявку «по рынку» приходит позже реакции OnTrade на регистрацию совершённой по этой заявке сделке.
avatar
Rostislav Kudryashov, OnTransReply связана с sendTransaction() и мы «ловим» свою заявку по trans_id
avatar
Вы, конечно, молодцы, что так глубоко изучили qlua.



Но это древний отстой!!!

Есть ли нормальная современная ide для qlua?

Есть ли нормальный дебаг?



По сравнению с java в Idea

Где там в луа управление потоками, пулы, таймауты, jdbc, лямбды?



Пишу детские скрипты в notepad++ и думаю, что это никуда не годится
avatar
Дедал, о лямбда-функциях, upvalue и замыканиях в Lua читай Роберту Иерузалимски или «Beginning Lua Programming» Kurt Jung, Aaron Brown.
avatar
Дедал, от Lua это не требуется. Применение не по назначению.
Луа разрабатывался для кофемолок и как язык сценариев и межпрограммного взаимодействия. Этого хватает, чтобы выбраться из него наружу. Больше ничего и не нужно.
avatar
Эффективность и выразительность Lua при всей его лаконичности производит неотразимое впечатление. Несравнимая элегантность.
Только C#, C++15 и Java 7 стали приближаться к этим возможностям, заведя лямбда-функции — весьма коряво.
avatar
Rostislav Kudryashov, 
Только C#6 и C++15 стали приближаться к этим возможностям — весьма коряво.
Вы это серьезно? Ну, ну.
avatar
3Qu, а я согласен.
Как изящно и минимумом средств всё сделано в Lua, и как корямо, монструидозно и трудно читаемо это всё втиснуто в C++.
avatar
Нужно было Python встраивать, а не Lua.
avatar
Когда попробуете запустить одновременно штучек 25 ботов на QLua, вот тогда и поймете сколько потоков создается, и как они НЕ влияют на основной поток квика. А еще веселей станет, когда решите своим ботам визуальный интерфейс прикрутить. Нет, изучить QLua было конечно полезно, но возвращаться с С# обратно на QLua — ни за какие пряники. Мучайтесь сами.
avatar
Написал бота для телеги на с++, ну, чтоб состояние подключения квика к серверу мониторить и т.д. через  телефон. Щас хочу модернизировать, чтоб запускать квик, следить за ним через бота с телеграм.

Внимание, вопрос!

А как это сделать в QLua? :)))))
avatar
Ivan Peroks, гораздо проще и быстрее через почту россии все заявки отправлять
avatar
Иван Иванов, :)))
А что Квик не через почту России отправляет заявки?    
avatar
Ivan Peroks, Quik работает на мобильных устройствах и даже на моём планшете с Андроид 4. А если хочешь робота на мобильном устройстве, заведи планшет с Windows.
avatar
Rostislav Kudryashov, Квик на мобильном устройстве- это же не новость, да? :)))
Непонятно, зачем носиться с планшетом и Квиком, если у вас роботы пашут, я не совсем понимаю.
Пашет робот, пусть будет их — 25. И что мне делать с Квиком? Смотреть как он подключен к сети? Ну, хорошо, пишем на Луа скрипт по отслеживанию работы  Квика, еще чего-нибудь… А что делать если Квик «потухнет» со всеми скриптами Lua? Вот поэтому появляется повод обратиться за посторонней помощью:))) Нам же важно чтоб оно все работало и только — обратная связь так сказать, что там еще смотреть, ждать пока какой-нибудь робот отключится или обрыва соединения?:))))
Ну, если нравится смотреть в Квик на планшете, то смотрите ...
avatar
Ivan Peroks, а кросс-платформенность по отношению к торговым интерфейсам как еще один из поводов обратиться за посторонней помощью не рассматривали?
avatar
Вроде все про отдельный поток знают:
quik2dde.ru/viewtopic.php?id=16

Или новость была именно в том, что отдельный поток main() создаётся для каждого Lua-скрипта?
avatar

теги блога Rostislav Kudryashov

....все тэги



UPDONW
Новый дизайн