Проблема не в библиотеках, а в том, судя по сообщению ликёра, что проект 32 битный собираете Менять в свойствах проекта И не понятно как именно вы былдитк, вы это упорно не пишете
Тупость и глупость. Кто захочет дебажить именно терминал - тот защиту обойдёт. Кто захочет вполне легально дебажить свою библиотеку для Lua - не сможет это сделать. Так какого хрена мешать легальный действиям и не особо мешать нелегальным? Все как наши законодатели делаете: соблюдать законы сложно, нарушать - легко. Верной дорогой!
99% что проблема именно в том, что вы написали. Никакого признака "вот теперь заполнено все" нет. С другой стороны заполненность trans_id и есть в вашем случае такой маркер.
Владимир написал: Это САМ СКРИПТ формирует айдишки заявок!
Я ж сказал что ты не понимаешь разницу между транзакцией и заявкой. И даже когда я все подробно расписал - ты, дебила кусок, понять прочитанное не сумел.
Это не ошибка. Это результат произвольно го порядка поступления информации с биржи. И, соответственно, произвольного порядка наполнения данных в колбеках скрипта. Если от биржи информация о зарегистрированной заявке пришла раньше информации о случившемся сделке, что происходит в большинстве случаев, то в ontrade приходит сразу полная информация, включая указанный пользователем ID транзакции. Если информация о сделке пришла раньше информации и породившей её заявке, то стачала будет ontrade, в котором часть полей, данные в которые попадают с заявки, будут не заполнены. А после того как с биржи придёт информация о заявке, сервер квика сможет опознать заявку для уже известной ему сделки и вызовет ontrade уже с заполненной информацией в полях про заявку
Я тебе рассказываю как оно на самом деле. Причём инфу эту ты не найдёшь нигде, она из очень глубокого многолетнего изучения. А ты вместо спасибо продолжаешь выпендриваться по-идиотски. Дурак и напыщеный идиот.
А сервер при том, что терминал лишь передаёт инфу на сервер и получает её с сервера. Терминал вообще не производит содержательного работы со сделкам и заявками. Впрочем, сервер 4вика тоже. Все биржа. И это абсолютно правильно, иначе барак полный выйдет.
Владимир написал: Но, господа, это же МОЯ айдишка, это НА МЕНЯ возлагается обеспечение её уникальности, так какие могут быть нули? Откуда им взяться? И это на 146% ошибка именно ПО Квика - ни брокеру, ни бирже до моей айдишки нет никакого дела. Непорядок...
Нет, это ошибка скриптописателя, который не понимает. "прерывания", как вы их называете, приходят в любом порядке. Но это не болажь квика, а особенность работы биржевых API В том случае, если сервер квика получает об биржи информацию о сделке раньше чем информацию о зарегистрированный заявке, он сообщает вам о сделке вызовом ontrade, но про заявку он ещё не знает, биржа это ещё не сообщила. Соответственно и информацию поставленную вами на заявке он сообщить не может, у него сервера квик в этот момент ещё нет такой заявки, он про неё не знает Потом, когда с биржи приходит информация про зарегмюистрированную заявку, в скрипте вызывается снова ontrade, но уже с поставленной информацией о заявке,т.к.теперь появилась возможность все это связать, теперь сервар знает про заявку и сделку. Ещё в этот момент будет вызван onorder, конечно.
А то что вы отправляете - это транзакция а не заявка.
В функции main для каждого инструмента запускается свой поток. Потоки берутся из пула.
Без иллюстрации кодом вот этого момента, сказать что-то предметное - невозможно. Ибо не понятно чем ваши потоки (где не работает) отличаются от потока main (где работает).
Как-то все в одну кучу. 1. При работе в QLua надо четко различать два абсолютно разных термина "таблица": 1) Таблица как тип данных в программе Lua, т.е.
Код
а = {} -- здесь переменная a - таблица в терминах языка программирования Lua
a[1] = 5 -- так к ней можно обращаться в программе
2) Таблица как элемент визуального интерфейса, таблица, которую вы видите на экране, визуальная таблица с данными. [/CODE] a = AllocTable() -- здесь переменная a содержит в программе идентификатор визуально отображаемой таблицы в терминале QUIK -- дальше вы знаете как работать с такой таблицей, раз у вас она отображается[/CODE]
Теперь понимаете? вы в своём вопросе смешали в кучу две эти совершенно разные "концепции", называемые, к сожалению, одним термином "таблица".
Цитата
и в итоге: attempt to call a nil value (global 'SaveTable')
Потому что штатно нет в QLua функции SaveTable(t_id, SaveResalt) Вам надо найти реализацию нагугленной вами этой функции или написать ее самостоятельно. Замечу, что в данном случае будет идти речь про сохранение значений из "таблицы" в смысле 1), а никак не про визуальные!
Старатель написал: Так тут вопросов больше не брокеру, а к разработчику. Обработкой заявок занимается торговая система биржи. Какой смысл обрабатывать заявку, если пользователь хочет её снять? Это лишняя работа.
Заявка уже в обработке на бирже. По поводу кому какой вопрос - у разработчиков просто недостаточно информации, чтобы предметно ответить на ваш вопрос. Более того, у вас просто нет требуемой им информации. Но есть у брокера, потому и просят зайти через брокера.
Все верно. Не ожидайте какого-либо последовательного изменения статусов. Заявка к вам может приехать в любом статусе, как сразу исполнена, так и частично исполнена, так и сразу снята.
Денис написал: Прежде всего, низкий Вам поклон за Ваш форум, если бы не он, я бы бросил изучать Lua ровно там же, где и начал.
Спасибо Вам на добром слове
Цитата
Например, в скрипте получены значения переменных и он должен просто их сложить. Все прекрасно до тех пор, пока не нажата кнопка "Остановить" - тут скрипт вылетает со словами "Не могу сложить а и б, потому что б равно nil. С какого перепугу, имеющая определенное значение переменная б, вдруг, его теряет после отработки функции OnStop?
Тут бы пример. Честно говоря не верится мне, что если OnStop() содержит только { Stopped = true; return 5; } то переменные, используемые только в main() внезапно становятся равными nil после этого. Ну а по примеру уже можно было бы и подсказать что там не так.
2. Из OnStop() возвращаем 0 Зачем? принуждаем QUIK мгновенно по выходу из OnStop() прибиваь поток main() - чтобы что? чтобы не дать функции потока корректно доработать (хотя доработает она очень быстро в приведенном слуучае), т.к. взводим флаг Stopped Делаем всё, чтобы насильно прибить потоковую функцию, от нее ожидаемо повисают сопли незакрытых ресурсов, куски незафинализированных вызовов Lua. А после - удивительно! - оставшаяся часть софта начинает глючить (и я подозреваю, что QUIK эти 5..7 минут не просто сам по себе живет, наверняка выполняются другие Lua-скрипты)
Ну т.е. сделано все, чтобы ожидаемо получить глюки. Но зачем?? В чем ценность этой демонстрации?
По-моему, код в первом сообщении специально написан так, чтобы максимально пройтись по граблям.
1. Открываем файл в main(), а закрываем зачем-то в другом потоке в OnStop(). Это и само по себе некрасиво просто-напросто (открывать в одном месте, в закрывать в другом, совершенно не связанном ни визуально, ни логически), да еще и ожидаемое может приводить (и приводит) к появлению сообщения "attempt to use a closed file", механизм появления которого вполне понятен. (нет? уточните, мне не сложно, напишу, но потом, не буду это сообщение разбухать).2.
Если записать в QLuа, потом прочитать в QLua и отобразить в quik через message данные - корректно отобразится? Если да - разбирайтесь с тем средством, каким вы просматривает базу , там проблема
но на выходе только mysql.dll, как получить luasql.mysql
Так вам и нужна mysql.dll Просто ее надо положить в папку luasql внутри quik, и тогда, по правилам библиотек Lua, возьмётся библиотека luasql/mysql.dll при загрузке require("luasql.mysql ")
Деградация от версии к версии определённо печалит. Хоть я и поставил бы под сомнение корректность некоторых полученных результатов (v(0) больше, чем v(10000000) ??). Но, похоже, в 9.3 точно случилось что-то.
swerg написал: если вы просто возьмете Луа без привязки к квик - вызов среди десятков тысяч переменных тоже будет тормозить.
Пруф в студию.
Для экспериментов возьмем online lua https://qlua.ru/demo/ Результаты выходят не очень стабильными, но все же проведя пару десятков экспериментов и выкинув пару экстремально отличающихся результатов, получил следующее время выполнения: 100 глобальных переменных - 1,4753 сек 100 тыс. глобальных переменных - 1,5608 сек
Да, разница не фантастически великая. Но какая-то явно есть. Разница много меньше, чем в ваших экспериментах внутри квика, это стоит отметить.
Тестовый код:
Скрытый текст
Код
local function v(n)
for i = n, 1,-1 do
_G["v"..i] = i % 100
end
end
v(100000) -- max 100000 by memory limit
local t = os.clock()
for i = 0, 50000000 do
v56 = v75
end
t = os.clock() - t
print(tostring(v56))
print("time:"..tostring(t))
Только сейчас разглядел создание 50 тыс глобальных переменных Ну и чего вы хотите? функция в ЛУА - это просто глобальная переменная типа "функция". Чтобы функцию вызвать - ее надо найти, на это, очевидно, уходит время. Давайте десятки миллионов глобальных переменных создадим и будем требовать оптимизации. Зачем? кому интересен этот сценарий??
Уверен, если вы просто возьмете Луа без привязки к квик - вызов среди десятков тысяч переменных тоже будет тормозить. Т.е. это такое вполне понятное свойство интерптетатора Луа. Просто не надо заводить десятки тысяч глобальных переменных.
Так что в данном случае я согласен с первыми высказавшимися "флудерам". Завалить можно любую систему. Вот только не со всеми "завалами" есть смысл разбираться, ибо некоторые из них (как здесь) будут сугубо не жизненные.
Я про приведённый скрипт. А если main убрать - станет лучше? В целом в самом деле не понятно по каким критериям вы говорите, что есть загрузка процессора. А совсем этот скрипт остановить - какая загрузка? А запустить скрипт какая загрузка? И сколько ядер у вас процессор, чтобы отмасштабировать цифры. Потому как "большая загрузка" - не понятная вводная. Надо бы знать что такое небольшая для вас и наоборот что большая, в цифрах. Чтобы масштаб проблемы был понятен.
Все-же скрипты с кольеками есть буквально у всех и как-то не особо слышно чтобы тормозил от колбеков так, что прям работать невозможно.
Нет, вы не описали "простой случай". Вы написали свои фантазии про неввполняющийся require. После и вовсе пустились в какие-то фантащийные рассуждения о причинах. Описывать же следует только факты. Т.е. последовательность ваших действий и наблюдаемые эффекты. Просто рекомендация для будущих сообщений
Предлагаю просто вот это вот "переопределял глобальную системную ф-цию" вынести в отдельную функцию в модуле, а не в общем коде. И добавить вызов этой функции в вашем скрипте после require
Вообще ваше исходное сообщение очень путанное. лучше бы вы описали последовательность действий, приводящих в ошибке. Как я понял - при повторном запуске того же самого скрипта не не работает переопределение глобальных функций, описанное в подгружаемом через require модуле.