Блог им. Sergey_Gavrilov

Он сказал, 'си', она пискнула, "луа, луа", он прошипел, 'шарп'

Луакнутые и сишарпнутые братья объясните убогому можно ли скрестить бульдога с носорогом при помощи LuaInterface или NLua, чисто теоретически я никаких проблем не вижу, но может уже кто уже наткнутся на «подводные камни»
Нашел тут хороший сайт quikluacsharp.ru/... Там меня напугали с аж с двумя плюсами…
  • Ключевые слова:
  • lua,
  • qlua
★8
36 комментариев
SiLuaNov
avatar
Зачем вам нужен шарп? Какой-то непонятный язык...

QLUA тем и хорош, что позволяет в LUA реализовать интерфейс взаимодействия с биржей (выставление, снятие заявок, получение истории из примерно 3000 свечей, и т.д.), а «движок» стратегии упаковать в C++ и приаттачить dll
Евгений Гуревич, Вы правы, не стоит городить огород. В крайнем случае лучше обойтись C++.
avatar
Scorpio, верно, можно и целиком на LUA, но я суеверно придерживаюсь убеждения, что машинный код работает быстрее, чем транслятор LUA. В домашних условиях это не даёт преимущества, но всё же…
Евгений Гуревич, нашёл автору решение. Но стоит так заморачиваться при условии, что на C#, реально что-то сильное реализовано.
avatar
Scorpio, не надо мне ничего сильного… Нужна тупая «обертка» чуть ли не в ноль повторяющая qlua, но на с#.., обертку сам сделаю, вопрос в технологиях…
Сергей Гаврилов, добрый день и с наступившим годом Крадущегося Лиса помощ в тюнинге ндикатора ДЕЛЬТА В ЛУА, можете как то помочь?
kirilles, там проблема в том, что для собственных индикаторов на Lua нельзя строить свечи… Хотя разработчики вроде обещали добавить такой функционал… У меня дельта строится в стокшарповских чартах…
Сергей Гаврилов, сток шарповский чарт))) звучит классно, гугл ничё не выдает по запросу))
kirilles, вот падла… надо было лучше просить…  
Евгений Гуревич, Евгений все в конце концов будет машинным кодом..., но пока до этого дойдет, срипт сначала будет гусеницей и только потом бабочкой… Так как quik нам поставляет только гусениц, то какая нахер разница…
Scorpio, «В крайнем случае лучше обойтись C++.»

это все равно что сказать, что «бегемот больше гиппопотама.»


Это два практически идентичных по синтаксису языка С++ и С#.


С# в алго применяется чаще, к нему больше библиотек прилагается чем к С++.
Это не в укор LUA. LUA это более высокоуровневый язык, ближе к скриптам…
avatar
dagh, языки синтаксис похож, но как язык c# ближе к vb.net, т.к., что там нет, что здесь нет..., а где же «да»...?
Если я правильно понял, то Вам нужна библиотека на C++, которую вы импортируете из Lua, а потом через именованную память ваша библиотека будет обмениваться данными с C# приложением.
Взял от сюда
quikluacsharp.ru/qlua-c-cpp-csharp/konnektor-dll-quik-qlua-lua-c/
и от сюда
quikluacsharp.ru/qlua-c-cpp-csharp/obmen-dannymi-mezhdu-dll-c-c-i-prilozheniem-c/
avatar
Scorpio, неправильно, я хочу, чтобы опоненты обоснованно  LuaInterface(NLua) с дерьмом смешали…
Сергей Гаврилов, Вы сами сказали у Вас богатый опыт в C#, пользуйтесь им.
avatar
 Автор, на C# что за код у Вас?
avatar
Scorpio, У автора перерыв на reloading
avatar
Scorpio, хороший
Ещё как вариант сразу писать библиотеку на C# с экспортом функции.
jonxxx.me/13-metatrader/15-eksport-funktsij-iz-net-dll-c-dllexport-net-framework-v-metatrader
avatar
Scorpio, этот вариант я знаю… В принципе неплохой… Но, блин, в русскоязычной студии не компилится…
Сергей Гаврилов, Покажите лог.
avatar
Scorpio, чей?

Сергей Гаврилов, Компиляции в русскоязычной студии.
avatar
Scorpio, вот такая ошибка копиляции

Ошибка C:\Users\Sergey\AppData\Local\Temp\tmp9569\Synapse.CSLua.il(66): error: syntax error at token '.method' in: .method public hidebysig specialname rtspecialname Synapse.CSLua

Сергей Гаврилов, Нашёл решение проблемы. Вам нужно изменить язык для приложений которые не поддерживают юникод на английский и перезапустить систему.

oxozle.com/2014/07/02/kak-izmenit-yazyk-dlya-ne-unicode-programm-v-windows-8
avatar
Scorpio, спасибо большое..., все откомпилилось… Только язык я не на Русский, а на Английский поменял... 

//=== Реализация функций, вызываемых из LUA ====================================================================//
static int forLua_TestFunc(lua_State *L)// Возвращает заданный текст
{
lua_pushstring(L, «Привет из C/C++»);
return(1);
}


//=== Регистрация реализованных в dll функций, чтобы они стали «видимы» для Lua ================================//
static struct luaL_reg ls_lib[] = {
{ «TestFunc», forLua_TestFunc }, // из скрипта Lua эту функцию можно будет вызывать так: QluaCSharpConnector.TestFunc(); здесь можно указать любое другое название
{ NULL, NULL }
};

//=== Регистрация названия библиотеки, видимого в скрипте Lua ==================================================//
extern «C» LUALIB_API int luaopen_QluaCSharpConnector(lua_State *L) {
luaL_openlib(L, «QluaCSharpConnector», ls_lib, 0);
return 0;
}


Тут ещё инициализация. Если не разбираться в интерфейсе, то лучше импортировать С++ DLL из примера, далее в этой же DLL импортировать свои функции из C# библиотеки.
avatar
"Он сказал - поехали, он взмахнул рукой,
Словно вдоль по Питерской, Питерской
Пронёсся над Землёй.
Словно вдоль по Питерской, Питерской
Пронёсся над Землёй.

Знаете, каким он парнем был,
Как поля родные он любил.
В той степной дали первый старт с Земли,
Был признаньем ей в любви.

Он сказал - поехали, он взмахнул рукой,
Словно вдоль по Питерской, Питерской
Пронёсся над Землёй.
Словно вдоль по Питерской, Питерской
Пронёсся над Землёй."<br><br>https://www.youtube.com/watch?v=sMeOrfu6f8U
avatar
Мужики, я еще праздную, потому добрый… Профессионально пишу на .net уже много лет. Сравнивать возможности с# c lua просто несерьезно — вещи несравнимые, посему нужна оболочка...
Я не уверен, что прослойка из с++ API лучше, чем LuaInterface(NLua)… Хочу, чтобы мне доказали обратное...  
Сергей Гаврилов, Пожалуйста, делайте, на C++ есть пример.
Большой опыт — существенная причина. Вперёд!
avatar
Кстати, еще один довод в пользу c# в том, что я хотел бы к скриптам прикрутить нормальный UI на wpf, а также альтернативный вариант построения графиков… Например, сейчас в Квике нельзя использовать свечи типа range,  кластерные свечи и т.п.
И я не хочу «коннектор»,  который использует другое приложения. Хочу, чтобы «точкой входа» был скрипт... 
Сергей Гаврилов, думаю, Вам сюда: https://github.com/finsight/QuikSharp

avatar
Сергей Гаврилов, А вы знаете, что скрипт работает в разных потоках и эти потоки не основные. Поэтому прикручивая UI на с# к lua скрипту вы можете получить массу глюков. Форма то будет крутиться не в основном потоке квика.
Так что лучше передавать данные из квика в свое собственное приложение.
Можно писать приложения на с#, для этого есть несколько вариантов:
1. Создать таблицу экспортов в dll на c#. Но есть одно, но — передача параметров в lua api происходит по типу с. Это надо учесть. Утилиту github.com/Jonxxx/ExportDll можно переделать тут.
а так почитать эту тему jonxxx.me/13-metatrader/15-eksport-funktsij-iz-net-dll-c-dllexport-net-framework-v-metatrader
Там есть моя утилита, но она конвертацию параметров делает по умолчанию stdcall (https://yadi.sk/d/E1x2KDeLjniVB)
2. Написать переходник на с++, как собственно делается в разного рода LuaInterface. В этом переходнике создавать классы на с# и вызывать нужные функции.
avatar
Александр, спасибо… Но с wpf в скриптах мне интересно покопаться… Да поможет мне dispatcher…
Сергей Гаврилов, Я бы на вашем месте реализовал бы по другому. Написал бы на си++ передачу данных в приложение с# через файловый меппинг или пайпы. Так сделано quikluacsharp.ru/qlua-c-cpp-csharp/obmen-dannymi-mezhdu-dll-c-c-i-prilozheniem-c/
Это сделать легче всего и меньше будет проблем.
Да поможет мне dispatcher…
Может и не помочь. Тут куча ведь неизвестных. Квик написан на си++ и полностью нативное приложение. GUI вы собираетесь писать на c# и wpf да еще не в контексте основного потока. Lua Api приспособлен больше для нативных языков. Если вы не знакомы с Lua Api, разберитесь как с ним взаимодействовать на си++. А потом на си++ вызывайте классы из си# с вашими формами на wpf напрямую.
avatar

теги блога Сергей Гаврилов

....все тэги



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