Петр Петров
Петр Петров личный блог
31 мая 2016, 22:03

Коннектор 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;
}

13 Комментариев
  • bestt
    31 мая 2016, 22:22
    Здесь также посмотри: 
    bot4sale.ru/blog-menu/qlua/spisok-statej.html

    Может что полезного найдёшь…
  • Павел Валин
    01 июня 2016, 09:43
    Увидеть бы полный текст. А сидеть дописывать обработчики и делегаты что бы проверить скрипт лениво)
  • Prophetic
    02 июня 2016, 16:57
    Пытаетесь изобрести велосипед? Стоит ли?
    github.com/finsight/QuikSharp

  • П М
    02 июня 2016, 18:52
    о, интересно. 
    это попытка запихать весь код из lua в библиотеку?
    не знал что так можно, спасибо за пример.
    насколько я знаю, в Lua два потока.
    основной — в котором исполняется main
    и второй, в котором вызываются обработчики.
    а может он вообще один, просто переключается — я не заморачивался.

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

  • П М
    03 июня 2016, 00:04
    Пётр, я ещё спросить тебя хотел. а откуда ты взял эту константу? -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.
    • П М
      03 июня 2016, 17:41

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

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

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

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

  • П М
    04 июня 2016, 17:41
    Петр Петров я тут мощную штуку нашел: 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.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн