Блог им. BALEKS
Прошу дать ссылку на адекватный форум или другой ресурс по программированию на 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;
}
bot4sale.ru/blog-menu/qlua/spisok-statej.html
Может что полезного найдёшь…
github.com/finsight/QuikSharp
это попытка запихать весь код из lua в библиотеку?
не знал что так можно, спасибо за пример.
насколько я знаю, в Lua два потока.
основной — в котором исполняется main
и второй, в котором вызываются обработчики.
а может он вообще один, просто переключается — я не заморачивался.
скорее всего проблема в том что ты выбрасываешь исключение из C# в Lua
попробуй его не выбрасывать :)
и никакой текст в 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.
-10002["_runServer"] = 1// Флаг завершения работы ф-ии main.
Я работаю через Квик. Скорость конечно важна, но реализовать HFT через кВИК мне кажется нереально, даже на С++. Я планирую автоматизировать работу алгоритма не критичного по времени.
Петр Петров, HFT конечно без мазы. хотя почему бы и не потренироваться на кошечках.
я по диплому тоже системный программист. работаю… близко :)
Lua действительно медленнее всех, потому что это интерпретируемый язык. Для него есть JIT (компилер), но в квике он не используется.
с 10002 я разобрался. можно вместо неё писать lua_setglobal
или использовать константу LUA_GLOBALSINDEX
спасибо тебе за пример. я думал над таким подключением, но вообще не подозревал что в Lua так легко можно функции подтасовывать.
с её помощью пользование функциями lua из С++ у меня теперь выглядит так:
круто ведь. на C++ теперь вызывать функции Lua так же легко, как на самом Lua.