1 (2013-02-11 22:37:38 отредактировано ubase)

Тема: Взаимодействие с LUA из внешнего ПО.

С Lua разработчики Квик явно перемудрили. Нет чтобы просто раскрыть API Quik, и пиши на том языке или той среде которая нравится. Хоть на Java or VBScript, да хоть на том-же Lua. Да и вряд-ли на Lua возможно сложную МТС написать. Ну, по крайней мере это оч сложно.
Я, в общем, Lua не знаю, и не горю желанием ее узнать, но взаимодействовать с ней придется. sad
Итак имеем МТС написанную на С#под терминал с полноценным API. Жизнь заставляет постепенно переходить на использование Квик.
Здесь и Lua подоспел.
Вначале возникла мысль написать интерфейсную DLL, и вроде все проблемы решены.
В том числе здесь -  [url=https://quik2dde.ru/viewtopic.php?id=18]Вызов DLL на C++ из LUA[/url] хорошо описано взаимодействие Lua c dll. Но, к сожалению, только в одну сторону - вызов функций dll из Lua. А это решает только одну задачу - экспорт событий терминала через DLL в нашу программу.
Кстати решает тоже не оч просто, т.к.   на событие Lua уже наша программа должна генерировать свое событие, и только теперь мы можем получить данные.
Ну, допустим, мы этот вопрос как-то решили. Но программа должна и самостоятельно запрашивать какие-то данные из терминала, ну, например, заявку посмотреть - как она там. И как?
Оптимальным решением было бы Lua скрипт включить в свою программу на C#, и  из программы запустить, и все Lua-фунуции и переменные нам доступны без ограничений. Да и DLL тогда вообще не нужна. lua_open()... и вперед.
В стандартной среде это проходит на раз. Но QLUA, это не совсем LUA. И как Это запустить в Квик?

2

Re: Взаимодействие с LUA из внешнего ПО.

Я думаю, вам стоит попробовать изменить взгляд на мир.
Сейчас у вас есть готовая МТС, при помощи которой вы хотите управлять торговым терминалом, используя его, по сути, лишь как транспорт для получения данных и отправки транзакций на биржу.

Lua в QUIK предоставляет мощную событийную модель, в которой сам терминал (а вернее - происходящие явления на бирже) являются управляющими сигналами для МТС. Вам, например, вовсе не надо проверять "что там с заявкой". Достаточно написать обработчик OnOrder, и он будет вызван во время постановки, во время исполнения или снятия заявки. Т.е. вам не надо проверять состояние заявки, достаточно обработать сигнал об изменении состояния этой заявки, вот и все.

Я понимаю, что это требует усилий на переработку имеющихся МТС, кроме того, часто требует изменение собственного взгляда на архитектуру построения системы. Но я все же убежден, что такая событийная модель открывает существенно больше возможностей и дает больше гибкости. Просто попробуйте поставить "во главу угла" не вашу МТС, работающую по определенному жестко детерминрованному алгоритму, а QUIK, который генерирует для вас разнообразные сигналы, которые в свою очередь вы уже обрабатываете внутри МТС на любом языке (и Lua здесь очень неплох), принимая решения и выполняя какие-либо действия: выставляя новые заявки, снимая имеющие активные заявки, или просто дожидаюсь следующих сигналов.

Связку Lua и C# вполне можно организовать.

В том числе здесь -  Вызов DLL на C++ из LUA хорошо описано взаимодействие Lua c dll. Но, к сожалению, только в одну сторону - вызов функций dll из Lua. А это решает только одну задачу - экспорт событий терминала через DLL в нашу программу.

Вы намекаете, что неплохо бы добавить описание вызова функций Lua из внешней dll? Отличная идея, спасибо. Непременно дополню. Хотя материалов в сети много, в общем-то сыскать сие не сложно.

3

Re: Взаимодействие с LUA из внешнего ПО.

admin пишет:

Я думаю, вам стоит попробовать изменить взгляд на мир.
Сейчас у вас есть готовая МТС, при помощи которой вы хотите управлять торговым терминалом, используя его, по сути, лишь как транспорт для получения данных и отправки транзакций на биржу.

admin пишет:

Я понимаю, что это требует усилий на переработку имеющихся МТС, кроме того, часто требует изменение собственного взгляда на архитектуру построения системы. Но я все же убежден, что такая событийная модель открывает существенно больше возможностей и дает больше гибкости. Просто попробуйте поставить "во главу угла" не вашу МТС, работающую по определенному жестко детерминированному алгоритму, а QUIK, который генерирует для вас разнообразные сигналы, которые в свою очередь вы уже обрабатываете внутри МТС на любом языке (и Lua здесь очень неплох), принимая решения и выполняя какие-либо действия: выставляя новые заявки, снимая имеющие активные заявки, или просто дожидаюсь следующих сигналов.

Я совсем не против Lua. Но зачем же менять развитые объектно-ориентированный язык и среду разработки (будь это С++, С# или VB.NET) на нечто Си-образное. Вы предлагаете все это без ООП? В общем случае это невозможно.
Lua хороший скриптовый язык, занимает свою нишу, но зачем-же на нем сложные прграммы писать.

admin пишет:

Lua в QUIK предоставляет мощную событийную модель, в которой сам терминал (а вернее - происходящие явления на бирже) являются управляющими сигналами для МТС. Вам, например, вовсе не надо проверять "что там с заявкой". Достаточно написать обработчик OnOrder, и он будет вызван во время постановки, во время исполнения или снятия заявки. Т.е. вам не надо проверять состояние заявки, достаточно обработать сигнал об изменении состояния этой заявки, вот и все.

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

admin пишет:

Связку Lua и C# вполне можно организовать.

Да, библиотеки в Инет есть. Пока все понятно. Стандартный Lua вполне из C# выполняется. Этот бы скрипт в Квик запустить как включение в С-код из C#. Main выполнилась, данные взяли и более он не нужен. Собственно Lua не в последнюю очередь для этого и предназначен, а не для автономной работы. Вопрос как скрипт Квик-машине подсунуть и запустить извне.

В том числе здесь -  Вызов DLL на C++ из LUA хорошо описано взаимодействие Lua c dll. Но, к сожалению, только в одну сторону - вызов функций dll из Lua. А это решает только одну задачу - экспорт событий терминала через DLL в нашу программу.

admin пишет:

Вы намекаете, что неплохо бы добавить описание вызова функций Lua из внешней dll? Отличная идея, спасибо. Непременно дополню. Хотя материалов в сети много, в общем-то сыскать сие не сложно.

Спасибо, было бы оч здорово. Материалов в Инете действительно много, но мне попадались только вызовы из включаемого кода через С API Это из документации -

В этой главе рассматривается C API языка Lua. С помощью этого набора C-функций хост-программа может осуществлять доступ к среде и функциональности Lua. Все функции API и соответствующие типы и константы описаны в заголовочном файле lua.h. [url]http://www.lua.ru/doc/3.html[/url]

Если бы это удалось реализовать в Квик - цены бы не было. Опять таки, нужно умудриться запустить скрипт извне на машине Квик.

4

Re: Взаимодействие с LUA из внешнего ПО.

Если бы это удалось реализовать в Квик - цены бы не было. Опять таки, нужно умудриться запустить скрипт извне на машине Квик.

Это врятли получится, на сколько я всю эту кухню понимаю.

Проше (реализуемее) тогда уж вариант такой, раз уж вы не хотите переносить "главенствующий механизм" на сторону QUIK: из Lua скрипта подключить вашу dll и запустить в ней вашу "головную функцию". Из нее уже дергать нужные интерфейсы через Lua-прослойки.
Правда чем это лучше DDE-сервера плюс trans2quik - не очень понятно, хотя по удобству конфигурирования и стабильности будет, думаю, намного лучше.

5 (2013-02-12 01:26:51 отредактировано ubase)

Re: Взаимодействие с LUA из внешнего ПО.

Может и получиться. Если интересует содержание qlua.dll могу выслать тхт файл. Все не проверял, но многие необходимые функции есть. Виртуалка наверняка в qlua.dll встроена.
Да и отладчик ведь как то работает - [url=https://quik2dde.ru/viewtopic.php?id=32]Отладка Lua-скриптов в QUIK: Decoda[/url]
Хотя, если скрипт уже в Квик встраивается в С-код, тогда ой.

из Lua скрипта подключить вашу dll и запустить в ней вашу "головную функцию". Из нее уже дергать нужные интерфейсы через Lua-прослойки.

Это-то я и не знаю как сделать. sad В смысле, как дергать из Lua.

6

Re: Взаимодействие с LUA из внешнего ПО.

Давайте уточним - вы хотите дергать функции загруженного в квик скрипта из третьей программы и получать данные?

7 (2013-02-12 18:40:59 отредактировано ubase)

Re: Взаимодействие с LUA из внешнего ПО.

mbul пишет:

Давайте уточним - вы хотите дергать функции загруженного в квик скрипта из третьей программы и получать данные?

Да, именно это. Вызывать функции, читать и писать переменные. Не вижу как это делать не запуская Луа-скрипты непосредственно из приложения.
Еще лучше запускать и останавливать скрипты. В общем хотелось бы, по возможности разумеется, обеспечить полную функциональность Луа.
Есть др. варианты, но они все какие-то кривые, как левой ногой за правым ухом. Типа опроса из Луа флагов в DLL, например.
ЗЫ На предмет попробовать самому, руки пока не дошли.

8

Re: Взаимодействие с LUA из внешнего ПО.

а смысл в чем?

9

Re: Взаимодействие с LUA из внешнего ПО.

sam пишет:

а смысл в чем?

Как Вам объяснить. Любое взаимодействие возможно только при двухсторонней связи. Сейчас мы имеем только в одну сторону.

10

Re: Взаимодействие с LUA из внешнего ПО.

я не вижу смысла связки квик-луа-чтото еще
зачем делать такие извращения, когда есть dde\pipe и trans2quik.dll?

11 (2013-02-12 20:09:27 отредактировано admin)

Re: Взаимодействие с LUA из внешнего ПО.

ubase пишет:

из Lua скрипта подключить вашу dll и запустить в ней вашу "головную функцию". Из нее уже дергать нужные интерфейсы через Lua-прослойки.

Это-то я и не знаю как сделать. sad В смысле, как дергать из Lua.

В любом случае "главенствующим" в любой подобной схеме (т.е. с использованием Lua) будет терминал QUIK, хотите вы этого или нет.
Вы, конечно, можете проинициализироваь Lua из qlua.dll, интерфейсы торчат (включая lua_open), только толку с этого будет ровно ноль: QUIK про эти ваши манипуляции ничго не узнает и взаимодействовать с ним таким образом не получится.

Так что вариант видится только один: запуск скрипта Lua в QUIK, скрипт подключает и запускает вашу dll, а уже из dll можете делать что угодно: получать данные откуда угодно, включая QUIK, анализировать, отправлять в QUIK транзакции, слать письма, СМС'ки и т.д.

Пример непременно сделаю, руки пока не доходят.

PS
Было бы здорово, конечно, получить внешнее (через какое-то API) управление терминалом QUIK, но разработчики упираются всеми ногами с какими-то странноватыми  отмазками. Приходится местами искать окольные пути (речь в основном про начальную инициализацию терминала).

12

Re: Взаимодействие с LUA из внешнего ПО.

sam пишет:

я не вижу смысла связки квик-луа-чтото еще
зачем делать такие извращения, когда есть dde\pipe и trans2quik.dll?

Вот ДДЕ - это как раз извращение. smile
trans2quik.dll - если не ошибаюсь, это только подача заявок. Насколько помню из документации.
Про pipe не скажу, просто не в курсе технологии. И его возможностей в Квик тоже. ссылку, если можно на это.

13

Re: Взаимодействие с LUA из внешнего ПО.

Есть замечательная ссылочка рядом про [url=https://quik2dde.ru/viewtopic.php?id=19]вывод данных через pipe из QUIK[/url].

14 (2013-02-12 20:23:04 отредактировано ubase)

Re: Взаимодействие с LUA из внешнего ПО.

admin пишет:

Есть замечательная ссылочка рядом про [url=https://quik2dde.ru/viewtopic.php?id=19]вывод данных через pipe из QUIK[/url].

Да, я видел. А кроме этого еще что нибудь pipe может (в Квик). И вообще, в чем суть технологиии?
Просто не в курсах. Будет время, поищу.

15 (2013-02-12 20:33:10 отредактировано sam)

Re: Взаимодействие с LUA из внешнего ПО.

ubase пишет:
sam пишет:

я не вижу смысла связки квик-луа-чтото еще
зачем делать такие извращения, когда есть dde\pipe и trans2quik.dll?

Вот ДДЕ - это как раз извращение. smile
trans2quik.dll - если не ошибаюсь, это только подача заявок. Насколько помню из документации.

1. извращение - это как раз то что вы хотите сделать, дде - отличная вещь

2. а что вам еще надо посылать ИЗ своей программы В квик, кроме вещей, связанных с заявками?
учитывая ссылку выше, делать вообще ничего не надо, потому что все уже давно написано

может вам надо было сначала эту тему изучить, а потом задавать вопросы и придумывать странные схемы?
[url]http://quik.ru/user/links/[/url] хотя бы по ссылкам на этой странице пройдитесь, там уже очень много полезного

16

Re: Взаимодействие с LUA из внешнего ПО.

sam пишет:

может вам надо было сначала эту тему изучить, а потом задавать вопросы и придумывать странные схемы?
[url]http://quik.ru/user/links/[/url] хотя бы по ссылкам на этой странице пройдитесь, там уже очень много полезного

Если у вас нет этих проблем, видимо вы реальными МТС никогда не занимались. Отсюда ваше непонимание, зачем это нужно.
Давайте не будем грузить тему. smile

17

Re: Взаимодействие с LUA из внешнего ПО.

ubase пишет:
sam пишет:

может вам надо было сначала эту тему изучить, а потом задавать вопросы и придумывать странные схемы?
[url]http://quik.ru/user/links/[/url] хотя бы по ссылкам на этой странице пройдитесь, там уже очень много полезного

Если у вас нет этих проблем, видимо вы реальными МТС никогда не занимались. Отсюда ваше непонимание, зачем это нужно.
Давайте не будем грузить тему. smile

просто я не создаю себе проблемы там, где их нет и быть не должно

18

Re: Взаимодействие с LUA из внешнего ПО.

admin пишет:

Так что вариант видится только один: запуск скрипта Lua в QUIK, скрипт подключает и запускает вашу dll, а уже из dll можете делать что угодно: получать данные откуда угодно, включая QUIK, анализировать, отправлять в QUIK транзакции, слать письма, СМС'ки и т.д.

М.б. и так. Правда реализация такого подхода мне не очевидна. Если возможно, простенький кусок кода чтения и вызова  Lua из DLL, ну на том же С++, например. Без реализации.


admin пишет:

PS
Было бы здорово, конечно, получить внешнее (через какое-то API) управление терминалом QUIK, но разработчики упираются всеми ногами с какими-то странноватыми  отмазками. Приходится местами искать окольные пути (речь в основном про начальную инициализацию терминала).

Я на форуме  quik.ru задавал аналогичный вопрос. Получил примерно аналогичный ответ. smile
В принципе, функциональности Квик-функций в Луа вполне для всего хватает. Только бы наружу вывести.

Срисовал простенький экзэмпл запуска Луа из С++ (типа hello). Запускается с lua51.dll. Как перенаправить на qlua.dll? Ищу поиском по проекту - даже упоминаний нет. Где она прописывается?

19

Re: Взаимодействие с LUA из внешнего ПО.

ubase пишет:

Срисовал простенький экзэмпл запуска Луа из С++ (типа hello). Запускается с lua51.dll. Как перенаправить на qlua.dll? Ищу поиском по проекту - даже упоминаний нет. Где она прописывается?

Видите к проекту подлинковывается lib-файл в свойствах проекта? это вот оно. Для qlua.dll надо либо библиотеку такую же сделать, либо динамически подключать из нее экспортируемые функции.

Впрочем, делайте все через lua51.dll, это ж тоже самое практически, т.к. указатель на стек Lua передается во все функции в явном виде, поэтому все это прекрасно сосуществует параллельно.

20 (2013-02-13 01:44:01 отредактировано ubase)

Re: Взаимодействие с LUA из внешнего ПО.

admin я хочу скрипт именно на квиковской виртуалке запустить из программы. Луа дебаггер ведь видит данные из Квика. Посмотрим. Не догоним, так согреемся. smile
Где линкуется уже нашел. Ну все забыл. smile

21

Re: Взаимодействие с LUA из внешнего ПО.

Наткнулся на Луа под VB.NET. Работает под LuaInterface.
[url=http://timbermar.wikidot.com/vb:lua-basics] Lua Basics [/url]

22 (2013-02-13 19:14:03 отредактировано ubase)

Re: Взаимодействие с LUA из внешнего ПО.

Lib-файл для линковки qlua.dll к С++ программе для запуска LUA скриптов на виртуальной машине QUIK.
Делается все абсолютно также, так что не описываю. Проверено, Луа работает. QLUA функционал пока не пробовал.

[url=https://quik2dde.ru/static-img/38/qlua.lib.zip]файл qlua.lib[/url]

23

Re: Взаимодействие с LUA из внешнего ПО.

1. сама идея порочная.  Вам надо решить проблему межпроцессного взаимодействия двух софтин, при этом не играет роли что там - Lua, питон или еще чего
2. API Lua (lua_open и т.д) торчит наружу из qlua исключительно для отладки декодой. Его можно безболезненно спрятать и все будет работать как и раньше.
3. вызвать функцию из скрипта загруженного в квик - это фактически написать свой аналог декоды. Внедриться в процесс, найти там виртуальную машину lua, запустить функцию и еще многое другое.
в общем мое резюме такое: то что Вы придумали не стоит свеч

24

Re: Взаимодействие с LUA из внешнего ПО.

ubase пишет:

Lib-файл для линковки qlua.dll к С++ программе для запуска LUA скриптов на виртуальной машине QUIK.

За библиотеку спасибо. Если вы не против - переложил ее на этот сайт.

Вот только фраза "для запуска LUA скриптов на виртуальной машине QUIK" - она неправильная в общем случае. Да, вы подлинковываете к себе qlua.dll, что законно, и вызываете из нее функции. Но Lua машину создает либо ваше хост-приложение, либо QUIK. Все, другого можно сказать не дано.

Подключиться к уже созданной в QUIK Lua машине можно только, например, методом, каким поступает Decoda: инжектом dll в процесс QUIK'а (там прямо имя dll-ки такое есть). Зачем ва этот геморой - совершенно не понять. Ну и крайняя нестабильность Decoda (вернее жуткая падучесть QUIK'а при ее подключении) как бы намекают... Но, еще раз: это будет подключение к созанной квиком машине Lua, но не запуск собственной с "интеграцией" ее в квик. При этом, замечу, ровно такое же подключение происходит при выполнении директовы require в Lua-скрипте. Так зачем тогда этот извращенный путь - понять мне сложно...

25 (2013-02-14 00:03:16 отредактировано ubase)

Re: Взаимодействие с LUA из внешнего ПО.

admin, я просто так и не понял как цеплять сюда файлы. smile

Да, про Квик-машину не совсем корректно, но ее создает qlua.dll.

При этом, замечу, ровно такое же подключение происходит при выполнении директовы require в Lua-скрипте. Так зачем тогда этот извращенный путь - понять мне сложно...

Ну, я все таки проверю свои гипотезы. smile Осталось немного.