Кажется, следует предполагать, что синхронизации в gc нет. И поэтому gc останавливают при вызове коллбеков. А также поэтому категорически нельзя в main вызывать collectgarbage('restart').
TGB написал: nikolz забыл вас спросить: вы понимаете почему разработчики QUIK при выполнении коллбеков останавливают сборку мусора?
Сборка мусора не потокобезопасна? Ванильный lua вообще то однопоточный, threads там - это просто короутины, которые выполняются по очереди в одном реальном потоке ос, с явным переключением coroutine.resume()/coroutine.yield() Для поддержки многопоточности надо как минимум задефайнить свои макросы lua_lock()/lua_unlock(). Но блокировка идет только на время работы интерпретатора (то есть просто читать/писать в переменные параллельно можно), а вызовы С функций не блокируются. В том числе и встроенные функции insert/remove/sort не блокируются. Откуда и растут ноги у sinsert/sremove/ssort. На время сборки мусора видимо тоже нет блокировки. Так что если она запустится одновременно в main и колбеке - будет жопа. Так что лучше не трогать collectgarbage('stop')/collectgarbage('restart'). Ведь если вы его на время выключаете, то наверное и включаете потом? А если в этот момент выполняется колбек - сборщик мусора может запуститься в нем.
lua_State это, как написано в документации и в комментарии в исходниках, "per thread state". Структура, одно из полей которой - указатель на global_State. Этот global_State общий для всех потоков, и именно в нем лежит все, связанное с с управлением динамически выделяемой памятью, сборкой мусора и глобальными переменными. У каждого потока есть свой стек, но на стеке живут только локальные переменные - их время жизни до выхода из функции, не сборщик мусора их освобождает.
Т е в каком стеке Вы вызовите сборщик, тот стек он и будет чистить.
Динамическая память - это не стек. Или имелся ввиду поток? Ну мы же можем передавать объекты между потоками. Не может быть разделения по потокам для сборки мусора.
Цитата
Each Lua state has one or more threads, which correspond to independent, cooperative lines of execution. The type lua_State (despite its name) refers to a thread. (Indirectly, through the thread, it also refers to the Lua state associated to the thread.)
Сергей написал: В анонсе версии 12.2 действительно указано что "Ошибка при попытке загрузить в Карман транзакций заявки из файла" исправлена Но в последней версии 12.2.1.2 во всплывающем меню из Кармана нет опций "Загрузить заявки из файла", "Загрузить стоп-заявки из файла", "Загрузить адресные/безадресные заявки из файла" которые есть в версии 11.3.4 Есть только "Загрузить транзакции из tri-файла"
Ну так решили же проблему с ошибками. Нет возможности загрузить из файла - нет ошибок при загрузке. То есть закрыта проблема "ошибки при загрузке", а не "невозможно загрузить".
Роман Н написал: А если же такую же заявку я выставлю в ручном режиме в терминале с признаком "полностью или отклонить", то такая заявка будет ждать снижения цены и встречного предложения и не отменится.
Так не должно быть. Если вы выставляете заявку с признаком "полностью или отклонить", а она ждет - это ошибка.
У меня тоже Linux и тоже проблема с некорреткным обновлением файла vcomp110.dll. Обновляется всё, кроме него. Из-за чего, каждый раз при загрузке крика всплывает сообщение о необходимости обновить квик.
Запустите winecfg и на вкладке libraries добавьте эту библиотеку.
w32 = require("w32")
QuikMainWindowHandle = 0
function OnInit()
QuikMainWindowHandle = GetMainWindowHandle()
end
function main()
if QuikMainWindowHandle ~= 0 then
-- тут можно писать, что вашей душе угодно
w32.SetWindowText(QuikMainWindowHandle, "Testing....")
end
end
function GetMainWindowHandle() -- Получить дескриптор главного окна QUIK
local CurrentProcessId = w32.GetCurrentProcessId()
local hWnd=0
while true do
hWnd = w32.FindWindowEx(0, hWnd, "InfoClass", "")
if hWnd == 0 then break end -- Окно не найдено
local ThreadId, ProcessId = w32.GetWindowThreadProcessId(hWnd)
if ProcessId == CurrentProcessId then break end -- Окно найдено
end
return hWnd
end
Kypat написал: Да добавьте в настройках галочку убрать uid , и добавьте время или бегущую строку мировых индексов типа типа hang seng nasdaq moex и ТД чтоб можно было видеть в % изменении и объем
Можно lua скриптом писать в заголовок окна все, что вам хочется...
Roman Koledin написал: что то не понятно - причем тут винда
Я сейчас уже точно не помню, в Windows чтобы окно можно было перемещать у него должен быть специальный атрибут. Если его нет, то окно не двигается, как сейчас закреплённый стакан. Если этот атрибут вернуть, окно может выглядеть немного иначе, что впрочем не должно быть проблемой.
В Windows, чтобы окно можно было перемещать, у него должен быть заголовок. Тот, который с кнопками.
ДмитрийР написал: а есть ли способ поставить лимитную заявку так, что бы если в этой цене окажется противоположная заявка, она не исполнилась как рыночная, а просто отменилась?
Я бы хотел иметь возможность в LUA видеть статус отправки сообщений в Телегу и если сообщения перестали уходить, то получить какой-то message, Версия с io.popen это позволяла бы сделать, как в приведённом выше примере, но он не работает :(. Ваш вариант отличный, но он позволит только постфактум узнать о проблемах. Но все равно, Вам огромное спасибо за идею в принципе! Это просто прекрасное решение почти всех моих запросов!
Не знаю, что у вас не так, у меня io.popen работает, и ответ от curl я получаю. Может, дело в версии curl
у меня io.popen вообще ничего не возвращает и команду не выполняет. Я пробовал просто dir отправить. У вас windows какой версии?
У меня в win10 работает. И под wine в линуксе тоже работает. Просто dir работать не будет, надо "cmd /c dir" Можно попробовать добавить в начало "cmd /c 2>&1 " перед curl - получите вывод сообщений об ошибках. Ну или в файл ошибки отправлять "cmd /c 2>errorfile.txt "
Я бы хотел иметь возможность в LUA видеть статус отправки сообщений в Телегу и если сообщения перестали уходить, то получить какой-то message, Версия с io.popen это позволяла бы сделать, как в приведённом выше примере, но он не работает :(. Ваш вариант отличный, но он позволит только постфактум узнать о проблемах. Но все равно, Вам огромное спасибо за идею в принципе! Это просто прекрасное решение почти всех моих запросов!
Не знаю, что у вас не так, у меня io.popen работает, и ответ от curl я получаю. Может, дело в версии curl
function tgmsg(text)
local curl = 'curl.exe'
local token = '.....'
local chatid = '....'
text = string.gsub(text, '[^0-9a-zA-Z\x80-\xff._~-]', function(chr) return string.format("%%%02x", string.byte(chr)) end)
local h, e, c = io.popen(curl .. ' -X POST --data-raw text="' .. text .. '" https://api.telegram.org/bot' .. token .. '/sendMessage?chat_id=' .. chatid)
if h then
local a = h:read('a')
return a, h:close()
else
return false, e, c
end
end
Ну только в -I надо путь к заголовкам, а в -L к библиотекам от openssl и нужной версии lua (я просто все накидал рядом с исходниками). По хорошему конечно надо makefile подправить для mingw сборки, а не так вручную.
В transaq можно выставлять стоп-заявки по исполнению в другом инструменте. Из документации:
Цитата
При вводе связанного стопа его направление (покупка/продажа) устанавливается противоположным направлению активной заявки, поля Инструмент, Режим и Клиент также копируются из активной заявки, но при необходимости могут быть изменены.
Связь по исполнению может быть использована как способ автоматизации торговых операций в одном финансовом инструменте по условию цены в другом инструменте. Выставляется «триггерная» заявка на минимальный объём в индикативном инструменте, и к ней привязывается стоп по исполнению, открывающий или закрывающий позицию в торговом инструменте. К этой же «триггерной» заявке можно привязать стоп, который автоматически закроет позицию, возникшую при ее исполнении
Сейчас есть условные стоп-заявки по исполнению. Но там всегда один инструмент. А для арбитражных стратегий хочется иметь возможность при исполнении лимитной заявки в одном инструменте автоматически активировать лимитную/рыночную заявку в другом.
Повторю свой вопрос. Я нажимаю alt-I в таблице "Состояние счёта" и вижу информацию об инструменте по конкретному классу. Как мне получить этот класс в lua? getSecurityInfo('', 'тикер') дает другой класс. Вряд ли на этот вопрос может ответить брокер.
Ну если вы видите нужные значения в таблице, то в чем проблема? Включаете в настройках "Формальное представление заголовков строк и столбцов", копируете всю таблицу, вставляете куда-нибудь и смотрите, как называется нужная колонка.
Текущая цена инструмента таблицы "Состояние счёта" берётся из параметров таблицы текущих торгов для данного класса/инструмента. Для данного показателя позиции используются следующие параметры ТТТ:
1. Цена последней сделки по инструменту из таблицы «Текущие торги». Если такой цены нет, то цена закрытия. 2. Для срочного рынка – цена последней сделки. Если такой цены нет, то указывается расчетная цена. 3. Для облигаций значение указывается в % от номинала, для срочных контрактов – в пунктах. 4. Для клиентов типа «МП»: лучшая цена спроса / предложения из таблицы «Текущие торги»
То, из какого именно класса берутся данные параметры - настраивается на стороне сервера QUIK. Получить эту цену, Вы можете обратившись к таблице текущих торгов с указанием класса и инструмента при помощи функций getParamEx и getParamEx2.
Вопрос актуальный - как именно этот класс, настроенный на стороне сервера, получить? Я нажимаю alt-I (информация об инструменте) в таблице "Состояние счёта" и вижу один конкретный класс. Как его получить в lua? Три дня назад у LQDT ETF был класс TQTF, а сегодня у ВТБ стал класс TQTF_F, а у другого брокера по прежнему TQTF. Поэтому вариант "зафиксировать класс где-то в настройках" не рабочий, класс может меняться.
Меняют конечно. Как минимум, туда добавлено несколько функций: os.sysdate(), table.sconcat(), table.sremove(), table.sinsert(), table.ssort(). А еще должна быть какая-то непустая реализация макросов lua_lock()/lua_unlock() в llimits.h