swerg (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 22 След.
Ошибка работы getScriptPath() из индикатора (версия 8.11.0.66), QUIK 8.11.0.66
 
Код тестового индикатора ниже.
Кладем в папку LuaIndicators, вызываем диалог добавления графика (индикатора).
В окне сообщений выводится:
{}

Т.е. наш скрипт вызвался, но getScriptPath() вернула пустое значение. Это явно ошибка.

Добавим этот индикатор.
В окне сообщений выводится:
{}
{D:\Quik-Junior\LuaIndicators}
<D:\Quik-Junior\LuaIndicators>

Т.е. индикатор сначала выполняется, но getScriptPath() вернула пустое значение.
Потом индикатор еще раз выполняется, но тогда уже getScriptPath() вернула правильное значение.

Проблема в том, что первоначальное выполнение, когда только открывали диалог - getScriptPath() вернула пустое значение, а значит индикатор не смог корректно отработать, если в нем используется getScriptPath(), и не добавился в диалог выбора индикатора.

Надо исправить эту ошибку.


Код
Settings = {}
Settings.line = {}

Settings.Name = "*swerg_test"

Settings.line[1] = {}
Settings.line[1].Name = "swerg_test"

message("{".. getScriptPath() .. "}")

function Init()
   message("<".. getScriptPath() .. ">")
   return 1
end

function OnCalculate(idx)
   return 5
end

ParamRequest и getParamEx2, Как получить актуальные данные через getParamEx2?
 
Цитата
Старатель написал:
Если последнее, то давайте начнём хотя бы с сообщения  #19

Могли бы вы накидать псевдокод как планируете использовать эту новую функцию?
ParamRequest и getParamEx2, Как получить актуальные данные через getParamEx2?
 
Описка:
Цитата
swerg написал:

следует читать так:
а) когда данные по подписке прИехали - а толку?
ParamRequest и getParamEx2, Как получить актуальные данные через getParamEx2?
 
Причем тут даже не понятно что требовать от QUIK-то.
В самом деле, предположим реализована схема "подписался на данные - передал call-back".
Но когда это call-back должен вызваться?
а) когда данные по подписке проехали - а толку? это ж не актуальные данные; не говоря уж о том, что данных объективно этих может не быть (неликвид)
б) когда данные по подписке все доехали - так этого момента никто и не знает.

И как быть? в самом деле, реализацию какого функционала требовать от QUIK? у меня нет идей, увы
ParamRequest и getParamEx2, Как получить актуальные данные через getParamEx2?
 
Цитата
Старатель написал:
Но в скриптах почему-то неактуальность цифры становится принципиальной. Но почему?
Разное время реакции. Пока трейдер примет решение, котировка поменяется. А скрипт: получил котировку - выполнил действие.[/QUOTE]

Ну т.е. грубо говоря нужен функционал:
1) подписались на новые данные
2) взвели признак (таймер) "позови функцию2" через 1 сек (условный интервал типичной актуализации данных)
3) вышли из функции
4) через секунду считаем, что данные приехали - на этом основании получаем данные и принимаем решение.

Здесь мне видится принципиальным пункт 3), дабы не подвешивать QUIK на sleep() и точно дать ему обработать полученные данные.

Я про то, что QUIK (да и не только) в принципе ведь не позволяет вам узнать актуальные сейчас вы видите данные в терминале или нет. Просто считается что если человек что-то видит - то он принимает на этом основании решение - и это как бы никого не парит (хотя данные могут быть вовсе не актуальными).
А вот при автоматизации почему-то непременно начинает всех волновать актуальность данных.

Так может вопрос лишь в подходе к написанию скрипта?
Я прекрасно понимаю, что хочется писать скрипт максимально просто и прозрачно, я и сам так делаю:
- подписался на данные
- прочитал данные
- вычислил формулы
- принял решение

Но почему я и привожу постоянно аналогии с визуальным получением данных - потому что, вероятно, раз там это все работает и никого не парит - то может вопрос в том, что подход к написанию надежных скриптов надо просто как-то поменять?
Я не знаю точно как. Это всё не "наезд" на вас лично, я просто сам давно маюсь этой темой и высказываю наболевшие мысли вслух в надежде на взаимное обсуждение "Как нам реорганизовать Рабкрин"©.
Как облегчить работу с метками на графике, Медленное перемещение графика при просмотре и масштабировании
 
А область видимости вы как определяете?
Или плюс-минус эмпирически подобрали по используемый вами масштаб? Хотя, если двигать график влево-вправо... То как?!
ParamRequest и getParamEx2, Как получить актуальные данные через getParamEx2?
 
Цитата
С первого сообщения пытаюсь объяснить. Если параметр уже заказан (а проверить мы это никак не можем) до запуска скрипта (в ТТТ али другим скриптом), то если брать данные только в OnParam(), придётся ждать следующего обновления параметров. А для неликвидного инструмента это может быть очень не скоро. Глядишь к концу сессий чё-нить дождёмся...
А если вызывать getParamEx2 до прихода OnParam(), то нет гарантии, что там не старьё.

Суть проблемы мне понятна, и я с вами согласен, что все это очень не гладко.

Однако, если посмотреть вот с какой стороны. В описанной ситуации откроем в терминале таблицу параметров. Она нам что-то покажет (т.к. когда-то данные были), какую-то цифру мы увидим.
Актуальная это цифра или нет? когда она изменилась? когда приедет актуальное значение? Ведь никого это не волнует, правда? Видим цифру - отлично,  с ней работаем.
Но в скриптах почему-то неактуальность цифры становится принципиальной. Но почему?
Это не в плане с пора с вами, это просто понять, порассуждать.
Как облегчить работу с метками на графике, Медленное перемещение графика при просмотре и масштабировании
 
Цитата
Евгений написал:
Если бы каждый график или хотя бы вкладка были в отдельных потоках проблема думаю бы решилась

Так не бывает в Windows.
Ну вернее так: можете посмотреть на Google Chrome, он так сделан (там даже отдельные процессы) и на прожорливоть им ресурсов "как не в себя".
Как облегчить работу с метками на графике, Медленное перемещение графика при просмотре и масштабировании
 
1) Если меток несколько сотен - очевидно, что они маленьгого размера. В этом случае gif будет точно меньшего размера, пересохраните картинки в этом формате. Ну просто для пробы помогает ли это.
Хотя проблема скорее в большом количестве меток, а не в формате, но попробовать стоит, думаю.

2) Решит ли замена процесора - в момент перемещения графика посмотрите по диспетчеру задач что нагружается: центральный процессор или видеокарточка. Если ЦП - то замена на более мощный поможет, вопрос только в том "на сколько улучшится".

3) Попробуйте в метки не вставлять картинки, а обозначить (метки) только текстом. Найдите подходящий вам символ - и выводите его вместо картинки. Возможно, это будет быстрее работать.

4) Судя по тому, что меток огромное количество - вы наверняка метками пытаетесь нарисовать какой-то график.
Переделайте ваш скрипт в индикатор в таком случае, индикаторы работают побыстрее.
Как драйвер RSI переделать под обычный скрипт
 
Цитата
Максим написал:
он брал бы данные свечек, считал rsi и рисовал его на графике в квике

Приведённый вами скрипт это по идее уже делает. Просто добавьте его на график нужного инструмента - и будет "рисовал его на графике в квике"
Как драйвер RSI переделать под обычный скрипт
 
Цитата
Максим написал:
под обычный скрипт, чтобы я его мог запустить в терминале, указав в коде нужную мне бумагу.

Не понятно что вы подразумеваете под этой фразой.
Какого результата вы хотите достичь? чтобы "обычный скрипт" нарисовал индикатор?
чтобы "обычный скрипт" получил данные индикатора и по ним принял какое-то торговое решение?
что-то еще?
Подскажите как работает CreateDataSource
 
Цитата
swerg написал:
Было бы очень здорово, если бы вы приводили нормальный полный код, которым получаете указанное вами.

Уточню: нормальный полный, но минимально возможный для воспроизведения проблемы. Бесплатно 5 страниц текста программы мало кто готов разбирать, так что чем короче полный проблемный код - тем выше шансы на успех получения толковой подсказки.
Подскажите как работает CreateDataSource
 
Было бы очень здорово, если бы вы приводили нормальный полный код, которым получаете указанное вами.
Ибо телепаты на данный момент в отпуске.

Цитата
Евгений написал:
В ds хранятся данные в виде таблицы или нет?

Как вы к ds обращаетесь? не понятно
Подкиньте идею
 
Цитата
Kolossi написал:
Swerg   огромное спасибо за библиотеку !!!

Рад, если помогло. Обращайтесь :)
Подкиньте идею
 
Цитата
Kolossi написал:
Проверил. Нумерация окон меняется конкретно для каждого скрипта-увеличивается с каждым перезапуском начиная с запуска Квика.
Запустив два одинаковых скрипта при помощи перезапусков легко получил окна с одинаковыми идентификаторами.
Облом.

Один скрипт выводит все таблицы, включая "сводную", другой кидает ему данные через

Цитата
Nikolay написал:
Библиотеки обмена: раз - StaticVar от swerg  https://quik2dde.ru/viewtopic.php?id=61  два - luashare от toxa  https://quik2dde.ru/viewtopic.php?id=306

Ну или даже один скрипт выводит сводную таблицы, остальные ему кидают данные через указанные механизмы.
getCandlesByIndex в индикаторе, Как используется функция getCandlesByIndex в индикаторе?
 
Цитата
Дмитрий написал:
function   OnCalculate (index)
   plusdi,n,q  =   getCandlesByIndex  ( "SBAdx" , 1 , 0 , getNumCandles ( "SBAdx" ))   -- get +DI table
   minusdi,n,q  =   getCandlesByIndex  ( "SBAdx" , 2 , 0 , getNumCandles ( "SBAdx" ))  -- get -DI table
    return  handler()
end

function handler(index)
   if plusdi[index].close ~= nil and minusdi[index].close ~= nil then [/CODE]

1) Правильно ли, что  из plusdi[] и minusdi[] значения берутся по индексу index?
Ведь в OnCalculate индексы приходят начиная с 1, а в возвращаемых значениях массивов из getCandlesByIndex  индексы начитаются с 0...

Наверное правильно будет plusdi[index-1].close и minusdi[index-1].close ?

2) Про оптимизации.
Здесь получается, что мы в каждом OnCalculate получаем все свечи с другого графика через getCandlesByIndex(), после чего берём только какое-то одно значение...
думаю будет эффективнее написать так:

   plusdi  =   getCandlesByIndex  ( "SBAdx" , 1 , index-1 , 1)   -- get +DI table
   minusdi  =   getCandlesByIndex  ( "SBAdx" , 2 , index-1 , 1)  -- get -DI table
...
и, соответственно, данные брать как
plusdi[0].close и minusdi[0].close
Ошибка в работе lua скрипта в quik 8.8.4.3
 
Это вы что-то сами накрутили
Штатно такого функционала нет
Ошибка в работе lua скрипта в quik 8.8.4.3
 
Цитата
foobar написал:
Кстати, lua 5.1 поддерживается Квиком. У меня работают написанные под lua 5.1 скрипты в 8.11.0.66

Добавьте в начало скрипта строчку
Код
message(_VERSION)

и напишите что отобразится в окне сообщений при этом.
Ошибка в работе lua скрипта в quik 8.8.4.3
 
Цитата
Владимир написал:
И подобные Вам программисты, гнущие пальцы с вумным видом и немедленно затыкающие хлебальники при первом же щелчке по носу (как это сделали лично Вы в соседней ветке)

Ты, дурач0к, просто достал своей напыщенной тупостью и некомпетентностью. Об тебя мараться не хочется, потому и бегут подальше и не отвечают на твой идиотизм. А ты, глупенький, решил, что сумел кого-то "по носу" достать.
Шел бы ты к своим сверстникам по разуму, в старшую группу детского садика.
Сравнение вещественных чисел., (55.3 < 55.3) - верно!
 
Люди новые, вопросы десятилетиями одни и те же...

https://forum.quik.ru/forum10/topic2229/
https://forum.quik.ru/forum10/topic1881/
https://forum.quik.ru/forum10/topic2572/

Почитайте. Там и ссылки на разные растолковывающие материалы есть.
Формирование звуковых алертов в таблице ”Оповещения” с помощью Lua, Необходимо автоматическое формирование звуковых алертов в таблице ”Оповещения” для роботов-помощников
 
Цитата
Юрий написал:
Подключение внешних библиотек трудоёмко и не решает проблему для сетки алертов.

Такого быть не может. Казалось бы, как раз из скрипта можно нагородить сколь угодно сложную систему оповещений.
Впрочем, есть есть "сетка алертов" - не понятно.
У снятой заявки не заполняется поле canceled_uid, если заявка снята вскоре после выставления
 
Цитата
Старатель написал:
Я не понял: наблюдаете или нет? Запустите предложенный скрипт на своём демо.

Согласитесь, то, что речь про демо-сервер - вообще не очевидно было по вопросу.
А проблема скорее всего именно в сервере, который не заполняет, потому и важно уточнить какой он.
Отладка QUIK 8.11
 
Цитата
s_mike@rambler.ru написал:
Неинтересный вариант. Его нельзя в bat файл засунуть

https://github.com/swerg/qlua-exe
Сгодится для батничка?
У снятой заявки не заполняется поле canceled_uid, если заявка снята вскоре после выставления
 
Я не понял где именно не заполняется canceled_uid
Вы его в скрипте где-то считываете? или смотрите в таблицу заявок?
Отладка QUIK 8.11
 
Цитата
Anton написал:
Тоже можно

Вставляя проверялку в каждый интерфейсный метод библиотеки, я о чем я и писал сразу.
Оно, конечно, затраты на проверялку копеечные - фактически сравнить несколько интов (чем являются указатели) по готовым адресам, особенно если развернуть и убрать вызовы вложенных красивых функций.
Но синтаксически все загромождается и загромождается.
Отладка QUIK 8.11
 
И всё же.
Волшебно работать с какой-то одной версией - это поможет.
А вот с двумя разными одновременно в рамках одной dll...
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Александр
Код
    unk : =   nil ;
  OleCheck(CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, unk));
  FMetaHost : =  unk as ICLRMetaHost;
  

Wow, под .NET на Delphi?! Мсье знает толк! :)
Без обид, просто неожиданно очень было увидеть.
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
ВиталийКак правило, люди крестят Lua и C++, но не QLua. И как я понял исходя даже из этого форума - это немного разные вещи.

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

Просто для справки, для понимания.
Отладка QUIK 8.11
 
Попробую написать подробнее.
Напишу как я вижу структуру волшебной библиотеки. Возможно у вас устроено совсем не так, а как-то иначе и указанной проблемы нет, и вы поделитесь вашей структурой.
Все "исходные коды" ниже - условны, без соблюдения всех нюансов синтаксиса, чисто для иллюстрации структуры программы.

Код
var
   // глобальные переменные, куда будут загружены адреса функций Lua API
   lua_pushstring_addr;
   lua_pushnumber_addr;
   luaL_checkinteger_addr;
   luaL_checkstring_addr;
   .... и т.д. ....

function LoadLua53()
begin
   h := LoadLibrary('Lua53.dll');
   lua_pushstring_addr := GetProcAddress(h, 'lua_pushstring');
   luaL_checkstring_addr := GetProcAddress(h, 'luaL_checkstring');
....
end;

function LoadLua54()
begin
   h := LoadLibrary('Lua54.dll');
   lua_pushstring_addr := GetProcAddress(h, 'lua_pushstring');
   luaL_checkstring_addr := GetProcAddress(h, 'luaL_checkstring');
....
end;

function luaopen_XXX(L: Plua_State)
begin
   if (ХитраяПроверка(L) = Lua54) then
      LoadLua54();
   else
      LoadLua53();

... далее обычный код для luaopen_XXX, ссылки на нужную версию Lua подгружены ...
   luaL_newlib(L, ls_lib);
... и т.д. ...
end;


После чего все реализации функций нашей библиотеки пишем обычным образом (без. доп проверок на версию Lua!)

тогда получится так:
- скрипт 1 выполняется в Lua53, загрузил нашу библиотеку.
Все адреса в глоб. переменных у нас указывают на Lua5.3 и все хорошо.

- скрипт 1 продолжает работать и запустили скрипт 2, для которого указана Lua54.
Наша библиотека это определила (необходимость загрузки Lua54), в глоб переменные загрузила адреса из Lua54.dll
И второй скрипт работает корректно.
Но первый-то скрипт уже будет ходить совсем "не туда"!

Чтобы это исправить - мы должны иметь две полных структуры адресов Lua-API функций для разных версий Lua и вставлять проверку в каждую функцию библиотеку, доступную для Lua-скрипта, переключаясь на адреса нужной версии Lua для каждой интерфейсной функции нашей библиотеки....
Или у вас так и сделано?
Отладка QUIK 8.11
 
Цитата
swerg написал:
Если пользователь запустит одновременно два скрипта,
Уточнение: запустит два скрипта, указав в них разную версию Lua.
Отладка QUIK 8.11
 
Цитата
Александр В луа 5.4 lua_version просто возращает версию луа 504 не зависимо от того, для какой версии LuaState.
Но в целом можно попробовать пошаманить с этим делом.

Ниже вы приводите результаты ваших исследований, за них вам спасибо.

Засада с этим красивым автоматическим определением будет вот где. (предположим что в принципе оно у нас заработало и нам повезло - бинарно интерфейсы совпали)
Если пользователь запустит одновременно два скрипта, использующих такую волшебную библиотеку - ему явно не повезёт.
Потому что указатели на функции в Lua53.dll / Lua54.dll вы явно храните в глобальных переменных, т.е. в каждый момент времени в них фактически указатели на какую-то одну версию Lua.
И даже если разнести указатели в 2 разные структуры по версиям Lua - то придётся в начало каждой интерфейсной функции вставлять хитрую проверку версии переданного стека, а потом еще хитро переключаться на соответствующую версию структуры указателей на функции Lua-API в рамках этой функции, вызванной внутри библиотеки....
Как-то это уже слишком, по-моему.
Отладка QUIK 8.11
 
Цитата
АлександрНе подходит, т. к. в Lua 5.4 lua_version просто возвращает номер версии, а при передаче в luastate от Lua 5.4 в функцию lua_version от Lua 5.3 происходит ACCESS_VIOLATION.

А, ну и славно, вот и проверили, бинарно не совместимы версии.

Цитата
АлександрЕще варианты?

Я немного не понял: я вам чем-то обязан, что вы позволяете себе писать именно так?
Я писал выше, вариант один: две разные dll для разных версий Lua.
Как их загружать в скрипт при условии, что пользователь может выбрать одну из версий Lua - не знаю.
Видимо раскладывать dll разных версий Lua по разным папкам и с путями в скрипте играться в зависимости __VERSION, или имена разные давать dll для разных версий Lua и опять же подгружать нужную библу.
Отладка QUIK 8.11
 
Цитата
Чтобы использовать lua_version надо загрузить нужную dll. Возникает вопрос какую версию dll брать?

Вы не сделаете динамическую загрузку DLL нужной версии.
Во-первых потому, что нет интерфейса для понимания того, на какой Lua-стек вам передали указатель, а во вторых потому, что вполне вероятно (но это надо дотошно проверять), что отдельные интерфейсные структуры в 5.3 и 5.4 версиях - разные. И в этом случае вы просто не сможете сделать бинарно совместимые версии dll.
Вот и остаётся нам максимум - это проверить, что dll собрана под ту версию Lua, для которой она собрана.
Фиговую какашку нам подсунули разработчки QUIK, да. Ведь фактически нельзя теперь просто положить dll в каталог с QUIK и использовать её спокойно, ведь в зависимости от версии Lua, заданной для скрипта, dll либо поедет, либо не поедет.... Да ужж...

Цитата
В луа 5.4 lua_version просто возращает версию луа 504 не зависимо от того, для какой версии LuaState.

Эту фразу не понял.
Если вы скомпилировали вашу библиотеку (или динамически подгрузили) lua54.dll - то она вам и вернёт всегда 504 из lua_version. Т.к. эта функция просто возвращает вкомпилированную константу (см. исходники), на LuaState она не смотрит.
Отладка QUIK 8.11
 
TGB, чем вас не устраивает отдельная ветка обсуждения ваших проблем? зачем вы в каждой ветке обсуждаете свою проблему, притом что эта проблема никак не связана с темой ветки?
Это так, замечание на будущее.

Цитата
TGB  Для обработки всех скриптов пользователя создается один служебный поток (под потоком здесь и далее понимается поток Windows).

В Windows есть понятие "основной поток приложения". В нем и происходит все то, что вы называете "в служебном".
Здесь есть картинка https://quik2dde.ru/viewtopic.php?id=16
(замечу что картинку эту ARQA стырила и включила в свою документацию, предварительно формально перерисовав, не спросив ни разрешения, ни даже хотя бы не сказав "спасибо")

Цитата
TGB Известно, что нативные версии Lua однопоточные. Управление автоматической памятью в них тоже однопоточное. Поэтому при внедрении версий Lua в QUIK требуется, наверное, много чего, но, как минимум, необходима переработка автоматического управления памятью с целью обеспечения ее потокобезопасности. И это сложная задача.

..., полностью решённая в исходниках Lua. Там просто можно включить режим сборки "многопоточный". Ну так, если совсем упрощённо.
Так что всё "от производителя".

Цитата
TGB Моя программа, на которой «падает» QUIK, тестирует автоматическую память QLua. Похоже, что эта память реализована некорректно, а значит в любых скриптах, в произвольные моменты времени могут возникать ошибки. Так как мой тест специально создает очень большую нагрузку на управление автоматической памятью, то ошибки возникают в течении 2-3 минут. При обычной работе эти ошибки возникают реже и могут проявляться в разных местах.

Я не смотрел вашу программу, однако могу предложить другое объяснение: ваша программа портит память процесса QUIK, после чего он падает. Или подгружаемые вами DLL содержат потоконебезопасный код, из-за которого опять же QUIK падает.
Если бы на самом деле управление внутренними хранилищами QUIK было столь потоконебезопасным, то падали бы и обычные скрипты, которые могут нагрузить "автоматческую память" ничуть не хуже.
Всё же согласитесь, какого-то тотально-массового падения скриптов QLua явно не наблюдается.

Надеюсь, ответ на вопрос 2) вы теперь сами знаете?
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Фига себе!
Александр, спасибо вам большое!!
Отладка QUIK 8.11
 
Цитата
Александр написал:
При чем здесь _VERSION, я использую Lua Api?

При том, что вы можете прочитать значение глобальной переменной _VERSION.

Ну а дальше уже из серии "Давай я погуглю за тебя". Ну ок, мне тоже пригодится, так что 1:1.

1) lua_version(lua_State *L)
2) void luaL_checkversion_  -- вызывает luaL_error(), если версия не та, что требуется.
Отладка QUIK 8.11
 
Хотелось бы уточнить у тех. поддержки про новую версию 8.11:

1) Зачем остался в дистрибутиве (в обновлении) файл lua5.1.dll  ? как он функционирует?!
Вроде его планировали убрать.

2) В списке исправленных недоработок есть несколько пунктов про Lua (пункты 10, 11, 12, 13)
Подразумевается, что указанные в них проблемы исправятся только при использовании Lua 5.4 ? или для Lua 5.3 они исправлены тоже?
Добавить колонку прибыль дня по инструментам в окне "Состояние счета", Добавить колонку прибыль дня по инструментам в окне "Состояние счета"
 
Делайте сразу расчет портфеля на Lua по вашим формулам.
Даже не тешьте себя надеждой, нужная вам формула когда-либо появится в QUIK. Там очень своё видение как рассчитывать параметры.
Пропала строка состояния, Пропала строка состояния версия ПО 8.9.0.107
 
В диалоге настроек
Программа - Строка состояния
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Виталий написал:
И что не так? В этой либе мне нужно использовать CLR, там будут формы. Как сам факт поддержки CLR (без каких-либо вызовов) влияет на выгрузку библиотеки?

Как минимум - вот оно коренное отличие вашей DLL от моей, а вовсе не версия QUIK.
Ну и видимо передавайте привет .NET и особенностям ее работы.

Цитата
Виталий написал:
(без каких-либо вызовов) влияет на выгрузку библиотеки?

Вы может и не вызываете, но раз хотите .NET - оно там очень могуче напрягается, чтобы вам его предоставить.
Вам наверное будет не сложно пока отключить использование .NET и проверить.
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Anton написал:
Код
   < CLRSupport >  true  < /CLRSupport >   
вместо тысячи слов.

Слона-то я и не заметил!  :shock:
Кто как решает вопрос с заявками/сделками?
 
Чета ржу  :lol:
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Виталий написал:
Но повторю еще раз: версия квика у вас не та. У меня 8.10.1.1 - они могут отличаться. Чего я не понимаю, так это почему молчат представители поддержки официальной?! Их как-то нужно призывать по особому в тему?? По мне так уже давно могли бы что-то написать.

И? Я не знаю зачем вы используете именно эту версию.
Вам ничего не мешает быстро проверить на 8.9

Цитата
Виталий написал:
Чего я не понимаю, так это почему молчат представители поддержки официальной?! Их как-то нужно призывать по особому в тему?? По мне так уже давно могли бы что-то написать.

Выгрузка / не выгрузка DLL - это последнее, что заботит реальных пользователей торгового терминала, даже если они используют какие-то готовые библиотеки. Так что, по-моему, это "проблема" приоритета из нижней десятки всех тех тысяч реальных проблем, которые есть в QUIK.
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Ровно такой же скрипт сделал у себя для тестов
У меня DLL выгружается (QUIK 8.9) - после запуска и остановки скрипта могу DLL удалять, заново переписывать и т.д. (проверяю просто переписыванием поверх, буквально VS не собирает на то место, откуда запуск)
Но проверяю на другом коде DLL.
Если дойдёт руки - попробую буквально вашу DLL собрать
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Код
path = getScriptPath() .. "\\central-core.dll"
package.loadlib(path, "luaopen_central_core")()

local m = central_core.DoSomething();
message(tostring(m))

function main()
    while (true) do
        sleep(100)
    end
end


У вас луа-скрипт корректно не останавливается. Что ж вы хотите-то?
Как в Lua получить название вкладки терминала?
 
https://quik2dde.ru/viewtopic.php?id=329

Код
w32 = require("w32")

-- Возвращает handle главного окна QUIK или 0 при ошибке
-- Если запущено несколько терминалов - выбирается тот QUIK, из которого запущен наш скрипт
function GetQuikMainWindowHandle()
    local hQuikWnd = 0
    while true do
        hQuikWnd = w32.FindWindowEx(0, hQuikWnd, "InfoClass", "")
        if hQuikWnd == 0 then
            break
        end
        local t,WinProcId = w32.GetWindowThreadProcessId(hQuikWnd)
        if WinProcId == w32.GetCurrentProcessId() then
            break
        end
    end

    return hQuikWnd
end

-- Тестовая функция создания пользовательского окна с таблицей
function CreateTableWindow(caption)
    local t_id = AllocTable()   
    AddColumn(t_id, 0, "1", true, QTABLE_INT_TYPE, 15)
    AddColumn(t_id, 1, "2", true, QTABLE_INT_TYPE, 15)
    local t = CreateWindow(t_id)
    SetWindowCaption(t_id, caption)
    InsertRow(t_id, -1)
    SetCell(t_id, 1, 1, "<<" .. caption .. ">>")
end

-- Основной код

hQuikWnd = GetQuikMainWindowHandle()

-- получим handle окна вкладок, далее все операции по переключению вкладок будем совершать с этим окном
hTabWnd = 0
if hQuikWnd > 0 then
    hTabWnd = w32.FindWindowEx(hQuikWnd, 0, "SysTabControl32", "")
    if hTabWnd ~= 0 and not w32.IsWindowVisible(hTabWnd) then
        -- Если окно вкладок найдено, но отображение вкладок отключено - сбросим в 0
        hTabWnd = 0
    end
end

if hTabWnd > 0 then
    -- Если вкладки в терминале отображаются
    -- Сохраним индекс текущей активной вкладки
    local prevIdx = w32.TabCtrl_GetCurFocus(hTabWnd)

    -- Определим и выведем через message() наименование активной вкладки на момент старта
    -- (индекс активной вкладки сохранён ранее, так что здесь получаем / отображаем имя просто так)
    -- w32.TabCtrl_GetItemText() вызываем только с 1 параметром, т.к. нас интересует имя активной вкладки
    local activeTabName = w32.TabCtrl_GetItemText(hTabWnd)
    if activeTabName then
        -- т.к. явно проверили, что имя вкладки получить удалось (оно не nil)
        -- просто отображаем его без tostring()
        message("Активна вкладка: " .. activeTabName)
    end

    -- Получим индекс вкладки с именем "Графики" (если такая существует)
    local idxGr = w32.TabCtrl_GetItemIndexByText(hTabWnd, "Графики")
    if idxGr >= 0 then
        -- Если вкладка "Графики" найдена
        -- переключимся на неё и создадим таблицу на ней, получив имя
        w32.TabCtrl_SetCurFocus(hTabWnd, idxGr)
        -- Получим название текущей активной вкладки (только что на нее переключились)
        local txt = w32.TabCtrl_GetItemText(hTabWnd)
        -- Используем tostring(), т.к. TabCtrl_GetItemText при ошибке возвращает nil
        CreateTableWindow("Вкладка '" .. tostring(txt) .. "'")
    end

    -- Получим общее количество вкладок
    cnt = w32.TabCtrl_GetItemCount(hTabWnd)
    for i = 0, cnt-1 do
        -- Переключаемся поочередно на каждую вкладку и создаем таблицу с именем вкладки
        w32.TabCtrl_SetCurFocus(hTabWnd, i)
        -- Получим название вкладки
        -- т.к. получаем название текущей активной вкладки (только что на нее переключились),
        -- то второй параметр можно не указывать; но здесь оставлен второй параметр для тестов
        local txt = w32.TabCtrl_GetItemText(hTabWnd, i)
        -- Используем tostring(), т.к. TabCtrl_GetItemText при ошибке возвращает nil
        CreateTableWindow(tostring(txt))
    end

    -- Переключимся назад на исходную вкладку
    w32.TabCtrl_SetCurFocus(hTabWnd, prevIdx)
else
    -- Если вкладки в терминале не отображаются
    CreateTableWindow("Вкладки отключены")
end
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Виталий написал:
Второй момент, вы не описываете поведение в 8.10.

На ftp arqa нет этой версии. Я не знаю где вы её взяли, поверить возможности нет.
Quik 8.5 не освобождается память
 
Цитата
Виталий написал:
Видимо, не была или была не полностью. Вот описание  https://forum.quik.ru/messages/forum10/message50829/topic6030/#message50829

Ветка, на которую вы ссылаетесь - вообще про другое абсолютно.
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Виталий написал:
Только не говорите, что еще нужен код библиотеки, чтобы уверовать в некорректность выгрузки    

Во-первых, безусловно нужен. Про него вас и спрашивали изначально.

Во-вторых, я проверил на простейшей библиотеке
https://github.com/swerg/simple-lua-c-dll

на простейшем скрипте с использованием этой библиотеки:
luacdll = require("luacdll")
message(tostring(luacdll.GetCurrentThreadId()), 1)

QUIK 8.6 -- после того, как скрипт отработал - dll-файл библиотеки остаётся заблокированным, т.е. dll не выгружена корректно.
QUIK 8.9 -- после того, как скрипт отработал - dll-файл библиотеки НЕ остаётся заблокированным, т.е. dll выгружена корректно, dll-файл с библиотекой можно переписать / удалить, не закрывая QUIK.
Оповещения пользователя в Квик, Оповещения (алерты), на соблюдение заданных условий на торговых инструментах
 
Цитата
просто вы являетесь монополистом на данном рынке

А как же МТ5 ? А как же Transaq ?
Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 22 След.
Наверх