Виталий написал: И что не так? В этой либе мне нужно использовать CLR, там будут формы. Как сам факт поддержки CLR (без каких-либо вызовов) влияет на выгрузку библиотеки?
Как минимум - вот оно коренное отличие вашей DLL от моей, а вовсе не версия QUIK. Ну и видимо передавайте привет .NET и особенностям ее работы.
Цитата
Виталий написал: (без каких-либо вызовов) влияет на выгрузку библиотеки?
Вы может и не вызываете, но раз хотите .NET - оно там очень могуче напрягается, чтобы вам его предоставить. Вам наверное будет не сложно пока отключить использование .NET и проверить.
Виталий написал: Но повторю еще раз: версия квика у вас не та. У меня 8.10.1.1 - они могут отличаться. Чего я не понимаю, так это почему молчат представители поддержки официальной?! Их как-то нужно призывать по особому в тему?? По мне так уже давно могли бы что-то написать.
И? Я не знаю зачем вы используете именно эту версию. Вам ничего не мешает быстро проверить на 8.9
Цитата
Виталий написал: Чего я не понимаю, так это почему молчат представители поддержки официальной?! Их как-то нужно призывать по особому в тему?? По мне так уже давно могли бы что-то написать.
Выгрузка / не выгрузка DLL - это последнее, что заботит реальных пользователей торгового терминала, даже если они используют какие-то готовые библиотеки. Так что, по-моему, это "проблема" приоритета из нижней десятки всех тех тысяч реальных проблем, которые есть в QUIK.
Ровно такой же скрипт сделал у себя для тестов У меня DLL выгружается (QUIK 8.9) - после запуска и остановки скрипта могу DLL удалять, заново переписывать и т.д. (проверяю просто переписыванием поверх, буквально VS не собирает на то место, откуда запуск) Но проверяю на другом коде 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
У вас луа-скрипт корректно не останавливается. Что ж вы хотите-то?
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
на простейшем скрипте с использованием этой библиотеки: luacdll = require("luacdll") message(tostring(luacdll.GetCurrentThreadId()), 1)
QUIK 8.6 -- после того, как скрипт отработал - dll-файл библиотеки остаётся заблокированным, т.е. dll не выгружена корректно. QUIK 8.9 -- после того, как скрипт отработал - dll-файл библиотеки НЕ остаётся заблокированным, т.е. dll выгружена корректно, dll-файл с библиотекой можно переписать / удалить, не закрывая QUIK.
STRING getScriptPath() Функция возвращает путь, по которому находится запускаемый скрипт, без завершающего обратного слеша («\»). Например, C:\QuikFront\Scripts
Roman Azarov написал: перенести данный файл в папку с терминалом (если потребуется - подтвердить замену существующего (в таком случае, вся информация в заменяемом файле будет удалена)) и перезагрузить терминал.
А у спрашивающего, возможно, включена галка "Сохранять настройки в файл при выходе". Вот он удивится-то, когда после запуска терминала ничего не изменится :)
Кстати, Roman Azarov, ваше сообщение написано так, что можно подумать, что под "данный файл" подразумевается alerts.dat, о котором написано чуть выше. Хотя вы явно не его имели ввиду.
Еще один недоросль учит как надо вести безнес. Даже не смешно уже. Особенно, конечно, умиляют применяемые штампы. Это ж не твои мысли, чувак, это штампы, которых ты нахватался от твоих друзей-школьников по уровню развития. Ну ладно друзья, это их проблемы, но почему ты не растёшь над ними?
Иван написал: Anton, а разве таблица обезличенных сделок + экспортированные стаканы из QUIK не дадут в сумме этот самый полный ордерлог?
В стакане вы не видите отдельные заявки. Только суммированный объем по всем заявкам с одной ценой. Если записать все изменения стакана - то примерно лог ордеров получится, но и то не полный, т.к. в стакан транслируются на абсолютно все изменения, там данные поступают лишь с определённым интервалом (хоть и маленьким). Если за время между интервалами выставили 10 заявок и сняли 5, то "дельта" стакана вам даст дельту между новыми и снятыми заявками, а не реальный объем всех этих реальных заявок.
Денис написал: з.ы. Мне не смогли помочь на этом ресурсе с отключением маржинальной тороговли. Жаль что ТП Квика настоль не компетента. Помог же мне пользователь квика на яндекс дзене. Для того чтобы, отключить маржинальную торговлю, надо в настройках запретить использование заёмных средств.
Чушь. Вас обманул "пользователь квика на яндекс дзене". Запретить самому себе маржинальную торговлю настройками терминала вы не можете. Максимум что вы можете - это вести расчеты в терминале "только на собственные средства", такая настройка есть, да. Но ни к какому запрету она отношения не имеет, вы по прежнему можете выставлять заявки с использованием заёмных средств брокера, хотя расчет доступного количества в терминале осуществляется лишь в рамках ваших собственных средств.
Вопрос один: нафига козе боян?? Что нового даёт этот инструмент в сравнении с QUIK? Впрочем, объяснение мы видим в начальных строках по ссылке.
Однако, Зачем сужать видение своего мира строго в рамках 1С и продажи конфигураций, причем называя это "хобби" (т.е. буквально лишь те 2 составляющие разноцветного окружающего мира, какие вы и так видите и так каждый день) - вот что не понятно. Вопрос философский.
Artem написал: Не могу понять, что произошло. Последний раз баловался Qlua еще на 7 Квике и таких проблем не припомню. Запускал два Квика от разных брокеров, один 8.10, другой 8.7 и везде одно и тоже
Ответ как обычно в вашем вопросе. Между квиком 7.x и 8.5 изменилась версия Lua, теперь она 5.3 И в ей такое вот умолчательное конвертирование float в строку.
Отличаются режимами сборки Для /MD требуется еще установленный Microsoft Visual C++ Redistributable соответствующей версии (в зависимости от версии Visual C++, в котором собирали). Ну либо установленный MS Visual C++ соответствующей версии.
_sk_ написал: Есть потребность в отключении слушателей по таймауту (а не когда придёт очередной коллбэк)
"Отключить слушателей по таймауту (а не когда придёт очередной коллбэк)" абсолютно эквивалентно "в начале колбека проверить надо ли уведомлять этого конкретного слушателя или таймаут его уведомлений истёк". В целом вся эта машинерия выглядит через чур запутанной, потом же сами концов в ней не найдёте... "Почему этот слушатель не сработал? то ли по тайм-ауту отключили, то ли колбека не было, то ли просто что-то пошло не так." "Архитектурно-правильно".... но это так, мысли вслух
_sk_ написал: Надо всё это для того, чтобы можно было выполнять в потоке коллбэков регулярные задачи, которые удобнее и архитектурно правильнее делать там, а не в main.
Архитектурно правильно (в тех рамках, что мы имеем) как можно меньше нагружать колбеки основного потока, вынося всё что возможно в main(). Некоторые еще и несколько потоков делают, этакие множественные main(). Или даже в отдельный процесс. А потому всё же хотелось бы услышать что это за такие "архитектурно правильные задачи", которые нельзя вынести в main().
Требуется событие в QLua, которые бы вызывалось в основном потоке и вызывалось бы всегда гарантированно при завершении скрипта. Рабочее название: OnFinalize Сейчас такого события нет. OnStop вызывается только при нажатии на кнопку. При ошибке выполнения скрипта (не синтаксического разбора) хорошо бы бы тоже его вызывать с передачей соответствующего признака
Пожелание такое на форуме совершенно точно было, но сейчас его на удивление даже найти не удаётся. Что слышно про его реализацию?
Анатолий написал: как известно начиная с версии 8.3.2.5 в квике версия луа повысилась до луа 5.3
А вот тут, кстати, ошибка. В QUIK 8.3 - Lua 5.1 (но x64 платформа) Lua 5.3 началась только в QUIK 8.5 Может в этом у вас проблемка и причина неработоспособности?
Ошибка создания заявки. [GW] "Превышен лимит отправки транзакций для данного логина."., Учебный сервер выдает ошибку: Ошибка создания заявки. [GW] "Превышен лимит отправки транзакций для данного логина.".
Олег написал: А какое ограничение стоит на демо стенде и при реальной торговле (для общего развития)?
На демо вы только что узнали - "в минуту 1800 транзакций" А на реальных торгах - это проблема вашего брокера как обеспечить вам и другим участникам торговлю без такого сообщения. Зачем вам об этом печалиться. Ну либо спросить у конкретного брокера.