Блог им. BALEKS

Коннектор QLUA и C#. Передача данных через стек.

Прошу дать ссылку на адекватный форум или другой ресурс по программированию на QLUA.
Интересуют вопросы передачи данных через стек и многопоточность в QLUA.
Как оказалось, есть много подводных камней.
Кто в теме, пожалуйста, укажите на возможные ошибки в коде, а главное — ПОЧЕМУ НЕ РАБОТАЕТ File.WriteAllLines(@«File.txt», array);
Буду очень благодарен.

-------------------------------------------
Скрипт QLUA:
require («InQuikDll»);
-----------------------------------------------------
Код на C#

using System.IO; 

[DllExport(«luaopen_InQuikDll», CallingConvention = CallingConvention.Cdecl)]
public static int InQuikDllStartUp(IntPtr L)
{
Lua.lua_pushinteger(L, 0);
Lua.lua_setfield(L, -10002, "_runServer");

//Вставляет новый экземпляр функции C в стек
Lua.lua_pushcclosure(L, forLua_OnInit, 0);
Lua.lua_setfield(L, -10002, «OnInit»);

Lua.lua_pushcclosure(L, forLua_OnStop, 0);
Lua.lua_setfield(L, -10002, «OnStop»);

Lua.lua_pushcclosure(L, forLua_OnClose, 0);
Lua.lua_setfield(L, -10002, «OnClose»);

Lua.lua_pushcclosure(L, forLua_OnQuote, 0);
Lua.lua_setfield(L, -10002, «OnQuote»);

Lua.lua_pushcclosure(L, forLua_OnConnected, 0);
Lua.lua_setfield(L, -10002, «OnConnected»);

Lua.lua_pushcclosure(L, forLua_Main, 0);
Lua.lua_setfield(L, -10002, «main»);

return 0;

}
//------------------------------------------------------------

static int forLua_Main(IntPtr L)
{
while (true)
{
Lua.lua_getfield(L, -10002, "_runServer");
if ((int)Lua.lua_tonumber(L, -1) == 0)
{
Thread.Sleep(10);
}
else
{
break;
}
Lua.lua_pop(L, 1);
}
return 0;
}
//-------------------------------------------------------

static int forLua_OnQuote(IntPtr L)
{
getQuoteLevel2(L);
return 0;
}
//--------------------------------------------------

public static void getQuoteLevel2(IntPtr luaState)
{
uint ll = 0;

string classOnQuote = Marshal.PtrToStringAnsi(Lua.lua_tolstring(luaState, 1, out ll));
string secOnQuote = Marshal.PtrToStringAnsi(Lua.lua_tolstring(luaState, 2, out ll));
Lua.lua_getfield(luaState, -10002, «getQuoteLevel2»);
Lua.lua_pushvalue(luaState, 1);
Lua.lua_pushvalue(luaState, 2);
string[] array = new string[] { classOnQuote, secOnQuote };
try
{
// File.WriteAllLines(@«File.txt», array); <-- QUIK выдает ошибки, если снять комментарий и откомпилировать библиотеку???? 
}
catch (SystemException ex)
{
throw ex;
}
Lua.lua_pop(luaState, Lua.lua_gettop(luaState));
}
//-------------------------------------------------------------
static int forLua_OnStop(IntPtr L)
{
Lua.lua_pushinteger(L, 1);

Lua.lua_setfield(L, -10002, "_runServer");
return 0;
}

★8
13 комментариев
nfc, спасибо.
Здесь также посмотри: 
bot4sale.ru/blog-menu/qlua/spisok-statej.html

Может что полезного найдёшь…
avatar
Увидеть бы полный текст. А сидеть дописывать обработчики и делегаты что бы проверить скрипт лениво)
Пытаетесь изобрести велосипед? Стоит ли?
github.com/finsight/QuikSharp

avatar
Prophetic, спасибо, дружище. Установил пакет. Буду разбираться с интерфейсом. Не знал про эту библиотеку. Уйму времени мне сэкономил.
о, интересно. 
это попытка запихать весь код из lua в библиотеку?
не знал что так можно, спасибо за пример.
насколько я знаю, в Lua два потока.
основной — в котором исполняется main
и второй, в котором вызываются обработчики.
а может он вообще один, просто переключается — я не заморачивался.

скорее всего проблема в том что ты выбрасываешь исключение из C# в Lua
попробуй его не выбрасывать :)

avatar
Пётр, я ещё спросить тебя хотел. а откуда ты взял эту константу? -10002? вообще чума! реально мапится в корень
и никакой текст в lua не нужен.

UPD: нашел, это LUA_GLOBALSINDEX.

тут был пост, про скорости MQL5 c Lua.
одна и та же рекурсивная процедура исполняется
Lua >30 секунд
MQL5 ~ 0.8 секунд
Java ~ 1.1 секунды
и вот я переделал под Lua + C++
Lua + C++ ~0.5 секунды
я честно говоря не думал что Java так сильно тормозит.
если писать HFT то всё придётся переписывать под С++
а пока свою поделку с Lua pipe перепишу на С++
вряд ли это драматически ускорит работу, учитывая Quik и сетевые задержки. Но программировать на С++ приятнее чем на Lua.
avatar
ПBМ, одна и та же рекурсивная процедура исполняетсяLua >30 секунд
У меня диплом программиста, но так вышло, что по специальности не проработал ни дня, хотя программирование очень люблю. Что касается скорости, не согласен. Мне кажется робот, написанный на ЛУА будет самым быстрым.
Я взял это из примера. http://quikluacsharp.ru/stati-uchastnikov/lua-c-bez-s-dll/ Я так понял -10002  - это название таблицы, в которой хранятся значения глобальных переменных LUA.
-10002["_runServer"] = 1// Флаг завершения работы ф-ии main.
Я работаю через Квик. Скорость конечно важна, но реализовать HFT через кВИК мне кажется нереально, даже на С++. Я планирую автоматизировать работу алгоритма не критичного по времени.

Петр Петров, HFT конечно без мазы. хотя почему бы и не потренироваться на кошечках.
я по диплому тоже системный программист. работаю… близко :)
Lua действительно медленнее всех, потому что это интерпретируемый язык. Для него есть JIT (компилер), но в квике он не используется.

с 10002 я разобрался. можно вместо неё писать lua_setglobal 

или использовать константу LUA_GLOBALSINDEX

спасибо тебе за пример. я думал над таким подключением, но вообще не подозревал что в Lua так легко можно функции подтасовывать.

avatar
Петр Петров я тут мощную штуку нашел: http://stackoverflow.com/questions/7885299/c-call-lua-function-with-variable-parameters
с её помощью пользование функциями lua из С++ у меня теперь выглядит так:
 
std::string getInfoParam(lua_State *L, const std::string& paramName){
        static lua_function lua_getInforParam(L, "getInfoParam");
        return lua_getInforParam(paramName);
}

круто ведь. на C++ теперь вызывать функции Lua так же легко, как на самом Lua.
avatar

теги блога Петр Петров

....все тэги



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