LUA C++

Страницы: 1 2 След.
RSS
LUA C++
 
Привод QScalp как то получает все таблицы, а почему у вас нету такой библиотеки С++?  Раз такое возможно?
 
Не совсем понятно  какая библиотека вам нужна.
Есть возможность подключать свои С++ библиотеки в Lua.
Это ведь то, что вас интересует?
 
QScalp работает с квиком через QscalpAgent.dll, которая грузится в QscalpAgent.lua. Обмен через SharedMemory. Пробуйте, если есть скил в программировании.
 
Дело в другом для DDE есть либа, а вот LUA нету С++, почему не сделаете? Типа такой QscalpAgent.dll?

int __cdecl luaopen_QScalpAgent(int a1)
{
   lua_pushcclosure(a1, sub_10008220, 0);
   lua_setfield(a1, -10002, "OnAllTrade");
   lua_pushcclosure(a1, sub_10008280, 0);
   lua_setfield(a1, -10002, "OnQuote");
   lua_pushcclosure(a1, sub_10008310, 0);
   lua_setfield(a1, -10002, "OnParam");
   lua_pushcclosure(a1, sub_10008410, 0);
   lua_setfield(a1, -10002, "OnTransReply");
   lua_pushcclosure(a1, sub_10008470, 0);
   lua_setfield(a1, -10002, "OnOrder");
   lua_pushcclosure(a1, sub_100084D0, 0);
   lua_setfield(a1, -10002, "OnTrade");
   lua_pushcclosure(a1, sub_10008530, 0);
   lua_setfield(a1, -10002, "OnStopOrder");
   lua_pushcclosure(a1, sub_10008200, 0);
   lua_setfield(a1, -10002, "OnStop");
   lua_pushcclosure(a1, sub_100081E0, 0);
   lua_setfield(a1, -10002, "OnClose");
   lua_pushcclosure(a1, sub_10007F90, 0);
   lua_setfield(a1, -10002, "main");
   return result;
}


int __usercall sub_10002490@<eax>(int a1@<esi>)
{
 int v1; // edi@1

 lua_getfield(a1, -10002, "Subscribe_Level_II_Quotes");
 lua_pushstring();
 lua_pushstring();
 lua_call(a1, 2, 1);
 v1 = lua_toboolean(a1, -1);
 lua_settop(a1, -2);
 return v1;
}
 
попробую объяснить
dll -это библиотека и не важно на чем она написана.
Lua позволяет подключать dll.
Поэтому подключайте и работайте.
 
Для начала - да. Добавьте к этому работу с разделяемой памятью, ну и с заявками.  
 
Цитата
seltor написал:
Для начала - да. Добавьте к этому работу с разделяемой памятью, ну и с заявками.
Я все это пользую в  луа.
 
Николай, пайпы юзаете или только шмем ?
 
Пользуюсь всеми механизмами совместного использования памяти
 
 
Для желающих писать плагин целиком на C++ библиотека доступа к QLUA API:  https://github.com/elelel/qluacpp
Реализовано не все, но при необходимости не сложно дописать доступ к нужным функциям.
 
Цитата
El El написал:
Для желающих писать плагин целиком на C++ библиотека доступа к QLUA API:   https://github.com/elelel/qluacpp
Реализовано не все, но при необходимости не сложно дописать доступ к нужным функциям.
было бы неплохо, если б там ещё и GUI было "прикручено", а так... желающие писать на С++ - по определению уже знают, как использовать LUA C API.
 
но..
в любом случае, очень рад появлению новых С++ биндов.
 
Цитата
тот самый написал:
Цитата
El El   написал:
Для желающих писать плагин целиком на C++ библиотека доступа к QLUA API:    https://github.com/elelel/qluacpp  
Реализовано не все, но при необходимости не сложно дописать доступ к нужным функциям.
было бы неплохо, если б там ещё и GUI было "прикручено", а так... желающие писать на С++ - по определению уже знают, как использовать LUA C API.
GUI - вы имеете в виду API для работы с графиками и т.п.? Они не написаны, т.к. не использовались в моих проектах. Можно написать обертку и для них. Отличие от обычного использования LUA C - отсутствие необходимости знать про Lua. То есть, не надо думать как помещать параметры на стек, как обращаться к VM Lua, как читать данные. Единственное, что надо знать о Lua - уметь подклинковать библиотеку C Lua API и написать пару строк в заголовке основого cpp файла.
 
насчёт GUI - это всё мои мечты. т.к. законными средствами - нельзя создать библиотеку визуальных контролов для QLUA и QUIK-а.
в плане самой Вашей библиотеки - думаю, многим она будет интересна в плане применения STL + LUA.
 
Цитата
El El написал:
Для желающих писать плагин целиком на C++ библиотека доступа к QLUA API:   https://github.com/elelel/qluacpp
Реализовано не все, но при необходимости не сложно дописать доступ к нужным функциям.

Вот что надо, только лучше чтобы команда Quik это написала! Почему это не написано?
 
Цитата
El El написал:
Для желающих писать плагин целиком на C++ библиотека доступа к QLUA API:   https://github.com/elelel/qluacpp
Реализовано не все, но при необходимости не сложно дописать доступ к нужным функциям.
Никак не хочет компилировать в Visual Studio, может есть (.sln) проект?
 
Цитата
mmonk1980 написал:
Никак не хочет компилировать в Visual Studio, может есть (.sln) проект?

С какими именно симптомами? .sln нет, но cmake должен успешно его генерировать (опция -G), т.к. для nmake все генерируется хорошо
 
Не могу скомпилировать DLL. Не находит LUA. Может сделаете все-таки .sln?
 
Например как тут http://smart-lab.ru/blog/387954.php есть .sln и dll компилируется!
 
https://github.com/elelel/qluacpp-tutorial
Пример плагина и пошаговая инструкция к нему, включая генерацию проекта под студию.
 
Ну хотя бы example и чтобы dll делал? У меня на VS 2015 проект и знаю как это либу прикрутить (это не помогло: пример плагина и пошаговая инструкция к нему, включая генерацию проекта под студию). Нужен .sln  и ваш example dll компилируется.
 
Цитата
mmonk1980 написал:
Ну хотя бы example и чтобы dll делал? У меня на VS 2015 проект и знаю как это либу прикрутить (это не помогло: пример плагина и пошаговая инструкция к нему, включая генерацию проекта под студию). Нужен .sln  и ваш example dll компилируется.
Пунк 6.2.1.
https://github.com/elelel/qluacpp-tutorial/blob/master/doc/ru/6_Building.md
 
Возможно, я не понял,что вы имели в виду в предыдущем сообщении, особенно под "Нужен .sln  и ваш example dll компилируется." Sln не генерируется cmake-ом? Или нужен только .sln от самой библиотеки qluacpp? Для этого нужно просто запустить
cmake -G "Версия студии" -Dпараметры_с_путями_к_Lua c:\path\directory\to\qluacpp
 
Есть проект Visual Studio 2015, как нему подключить либу?  
 
Например просто скомпилировать dll и один .h файл и все. Как обычно  либы делаются.  
 
Вы пишете как нуля это либу подключить, а надо в текущий проект Visual Studio 2015.
 
Библиотека компилируется как обычная статическая библиотека для Visual Studio. Если нужна компиляция в динамическую, то скорей всего достаточно вставить в CMakeLists.txt от qluacpp в директиве add_library: "SHARED", не проверял. Если хотите создать библиотеку так, как было задумано, просто генерируете солюшн от qluacpp как сказано выше, потом добавляете этот проект с библиотекой в свой проект примерно как описано в обучалке от Microsoft как пользоваться Студией (последний раздел): https://msdn.microsoft.com/en-us/library/ms235627.aspxТеоретически если желание все делать от руки, должно работать именно так.
 
Не понятно. Может сделаете "example" где есть .sln и  dll компилируется?
 
Я не могу на вашем компьютере набрать команду "cmake ... путь_где_создать_солюшн путь_куда_скачали_библиотеку". Создать проект под MSVS 2015 тоже не могу: у меня нет MSVS2015, да и я просто не помню как их создают там вручную. Не создавал их мышкой в Студии почти лет десять. Прислать сгенерированный тоже не могу: он генерируется с учетом путей на системе, на которой вызывается CMake, работать у вас не будет. Создавать от руки проект под каждую версию студии, плюс не под MS компиляторы, и распространять библиотеку так, я считаю шагом назад и уводить с современных средств генерации проектов тоже не хочу.
 
У вас example в файле README.md, выложить dll и проект .sln к нему...
 
Цитата
mmonk1980 написал:
У вас example в файле README.md, выложить dll и проект .sln к нему...
Этот example был почищен и переведен в репозитарий qluacpp-tutorial, в который добавлен и проект CMake, генерирующий .sln ко всем Студиям. Одновременно он был убран из файла README.md, чтобы не путать пользователей. В этом же README.md указаны требования: CMake, Lua 5.1, C++11 компилятор. Эти требования означают, что данный софт надо иметь на своем компьютере и уметь им пользоваться. В том числе, невозможно пользоваться библиотекой, если не уметь генерировать CMake проект под выбранную среду по вкусу (например, .sln под Студию 2015) и невозможно пользоваться библиотекой, если не уметь подключать библиотеки в выбранной среде. Как сгенерировать .sln, указано выше. Как подключить библиотеки в Студию, тоже указано по ссылке на MSDN. В скомпилированной форме библиотека не распространяется: не хочу, чтоб ходили бинарники, которые потом перестают работать или чем-нибудь заражены. Кроме того, смысла в этом нет, если делаешь продукт сугубо для программистов. Файл .sln от библиотеки прикладывать невозможно по указанным выше причинам (не портабелен между компьютерами). Файл .sln от примера будет ссылаться на непортабельный .sln библиотеки, его надо от руки переделывать под каждую новую Студию и т.п.
 
Программисты разные бывают я например не cmake не пользуюсь и сразу ступор встаю как это делать. Обычно .sln идет c либой и example можно сразу проверить.
 
"Файл .sln от примера будет ссылаться на непортабельный .sln библиотеки"

zip либа она там .sln файл, так тут не факт!
 
Цитата
mmonk1980 написал:
Программисты разные бывают я например не cmake не пользуюсь и сразу ступор встаю как это делать. Обычно .sln идет c либой и example можно сразу проверить.
Я тут к сожалению не смогу помочь, последние лет 10 я Студией пользуюсь только через CMake, причем как правило только тулзами командоной строки от нее, в основном для проверки собираемости проектов на разных компиляторах. Я вставю в ступор от кликанья по десяткам уровней вложенности окошек конфигурации Студии :) Раньше под Windows действительно любили распространять готовые sln проекты примеров, но теперь и версий Студий слишком много, и монополию на компиляцию под Win они потеряли. В случае же с этим примером и с этой библиотекой CMake глубоко изучать не нужно, все уже создано за пользователя. В примере пользователю нужно только запустить CMake из директории, куда генерировать проект и указать директорию, куда скачены файлы примера. Если нужно, как вы писали выше, подключить библиотеку уже к существующему не-CMake проекту в студии, нужно сделать то же самое, но скачав только qluacpp, и указав дополнительно всего-лишь две опции: путь к .h файлу от lua и путь к .lib файлу от lua.
 
Цитата
El El написал:
Если нужно, как вы писали выше, подключить библиотеку уже к существующему не-CMake проекту в студии, нужно сделать то же самое, но скачав только qluacpp, и указав дополнительно всего-лишь две опции: путь к .h файлу от lua и путь к .lib файлу от lua.
Такое делал не помогает.
 
Цитата
mmonk1980 написал:
Цитата
El El   написал:
Если нужно, как вы писали выше, подключить библиотеку уже к существующему не-CMake проекту в студии, нужно сделать то же самое, но скачав только qluacpp, и указав дополнительно всего-лишь две опции: путь к .h файлу от lua и путь к .lib файлу от lua.
Такое делал не помогает.
"Не помогает" - как конкретно? Что конкретно делали и какие именно ошибки? Лучше открыть issue на github, чтоб не напрягать читателей этого форума лишней информацией.
 
Ладно буду сидеть на DDE раз LUA не доступна. Удачи вам за ответы. Может сделаете .sln когда нибудь!
 
Скомпилировал библиотеку, даже запустил. my_main вызывается и все нормально, а вот OnAllTrade и OnQuote молчит, нечего не приходит! Что надо сделать что бы тоже работали?

static struct luaL_reg ls_lib[] = {
{ NULL, NULL }
};

void OnAllTrade(lua::state& l, const qlua::alltrade& data) {
qlua::extended_api q(l);
q.message(std::string("OnAllTrade: ") + data.sec_code + std::to_string(data.price));
}

void OnQuote(lua::state& l, const char* class_code, const char* sec_code) {
// Print depth for currently opened depth windows (aka "level 2 quotes"
qlua::extended_api q(l);
if (class_code == qlua::classcode::TQBR::name()) {
// Get quote info with normal API
auto quote = q.getQuoteLevel2(class_code, sec_code);
// Same with Extended API, with typechecked class code
auto quote_tl = q.getQuoteLevel2<qlua::classcode::TQBR>(sec_code);

//ss << "Quotes for " << sec_code << " (class " << class_code << "):\n"
// << "  Bid:\n";
//for (const auto& r : quote.bid) ss << "    " << r.quantity << " - " << r.price << "\n";
//ss << "  Offer:\n";
//for (const auto& r : quote.offer) ss << "    " << r.quantity << " - " << r.price << "\n";

//q.message(ss.str());
}
}

void my_main(lua::state& l) {
using namespace std::chrono_literals;
qlua::extended_api q(l);
const char *path;
path = q.getScriptPath();
q.message(path);
q.message(q.getInfoParam("VERSION"));

qlua::param par;
//par = q.getParamEx("SPBFUT", "RIM7", "BID");
par = q.getParamEx("SPBFUT", "MMM7", "BID");
q.message(std::to_string(par.double_value));

//q.message("qluacpp tutorial: Starting main handler");
//for (int i = 0; i < 3; ++i) {
// q.message("qluacpp tutorial: Tick " + std::to_string(i));
// std::this_thread::sleep_for(1s);
//}
//q.message("qluacpp tutorial: Terminating main handler");
}

extern "C" {
LUALIB_API int luaopen_Win32Project1(lua_State *L) {
lua::state l(L);
qlua::extended_api q(l);

q.set_callback<qlua::callback::main>(my_main);
q.set_callback<qlua::callback::OnAllTrade>(OnAllTrade);
q.set_callback<qlua::callback::OnQuote>(OnQuote);

luaL_openlib(L, "Win32Project1", ls_lib, 0);
return 0;
}
}
 
Вы уверены, что у вас OnQuote случается в первые 3 секунды после запуска скрипта?
 
Кроме того, и 3 секунды работы - у вас закоментированы.
 
my_main вызывается и все нормально, а вот OnAllTrade и OnQuote молчит, нечего не приходит! Может QUIK в квик надо поставит и еще что?
 
Цитата
mmonk1980 написал:
my_main вызывается и все нормально, а вот OnAllTrade и OnQuote молчит, нечего не приходит! Может QUIK в квик надо поставит и еще что?
Моя догадка: если вы раскоментируете строку, в которой пользователю сообщается, когда скрипт завершил работу, скорей всего увидите, что вы ждете вызовов, когда скрипт уже не работает. Если main уже не работает, то и весь скрипт не работает, см. родную документацию QLUA. А может, дело в другом. Лучше подробно описать, чего вы хотите добиться от плагина.
 
Мне нужно callback "Таблица всех сделок" и "Таблица текущих торгов" с разными инструментами. Что бы когда-они менялись C++ я принимал это. Как это сделать?  
 
Документации никакой. Я этой строчной час бился например:

qlua::param par;
par = q.getParamEx("SPBFUT", "MMM7", "BID");

без мне брать param.
 
Как например вызвать CreateDataSource и CALLBACK к нему?
 
Как делать getItem получать цену, так не хочет работать:

auto item_t = q.getItem("all_trades", 0).price;
 
Написал

auto it = q.getItem<>("all_trades", 0);

выдает такую ошибку:

'qlua::api::getItem': no matching overloaded function found
'item_t qlua::api::getItem(const char *,const int) const': could not deduce template argument for 'item_t'

видимо функция не реализована.
 
Можно сделать как вот с этим?

par = q.getParamEx("SPBFUT", "MMM7", "BID");

вот так:

auto it = q.getItem("all_trades", 0, "BID");  
 
Цитата
mmonk1980 написал:
my_main вызывается и все нормально, а вот OnAllTrade и OnQuote молчит, нечего не приходит! Может QUIK в квик надо поставит и еще что?
Пример по OnAllTrade добавлен сюда https://github.com/elelel/qluacpp-tutorial/
Цитата
mmonk1980 написал:
Как например вызвать CreateDataSource и CALLBACK к нему?
CreateDataSource не реализовывалась.
Цитата
mmonk1980 написал:
Написал

auto it = q.getItem<>("all_trades", 0);

выдает такую ошибку:

'qlua::api::getItem': no matching overloaded function found
'item_t qlua::api::getItem(const char *,const int) const': could not deduce template argument for 'item_t'

видимо функция не реализована.
Все реализовано, у вас неправильный стейтмент с точки зрения С++
Цитата
mmonk1980 написал:
Можно сделать как вот с этим?

par = q.getParamEx("SPBFUT", "MMM7", "BID");

вот так:

auto it = q.getItem("all_trades", 0, "BID");
Возможно, сделать так можно, но я так никогда не делал, потому что это имеет мало смысла. Вопрос, можно ли так делать, общий для QLUA и не относится к qluacpp, ответ следует искать на форуме Lua в других топиках или задавать отдельно, если он не задан. Если нужны данные, которые впоследствии оказываются в таблице all_trades, их надо получать по OnAllTrades. Если зачем-то нужна информация, как они представлены в этой таблице, например соотносить с привязкой к номеру ряда, то, наверное, можно делать как у вас.
 
А как правильно? Можете переписать эту строку? (getItem чтобы вoзращала price)
auto item_t = q.getItem("all_trades", 0).price;
Страницы: 1 2 След.
Читают тему
Наверх