Берем тот же скрипт, приводим к универсальному виду:
Код
_G.message = _G.message or _G.print
_G.message('begin: '..tostring(os.clock()))
local t = {}
for i = 1,150000 do
t = os.time()
end
_G.message('end: '..tostring(os.clock())..', memory: '..tostring(collectgarbage("count")))
Да, разница с чистым lua есть, но не сказал бы, что это как-то мешает. Тем более, что накладные расходы при запуске скрипта в окружении терминала есть.
Что касается хранения таблиц, то, как правило, необходимы последние для расчета чего-то в скользящем окне. Остальное то зачем держать - вычистить, сборщик уберет со временем.
Если данные транслируются в ТТТ, то и getParamEx вернет их. Укажите корректный код класса и код инструмента. Можете увидеть их в информационном окне: правая клавиша в строке ТТТ - информация об инструменте.
Как уже правильно сказали выше, файл должен быть в бинарном представлении открыт.
Вот отрывок из книги создателя языка:
Lua принимает предкомпилированный код практически везде, где он допускает исходный код. В частности, loadfile и load принимают предкомпилированный код.
Мы можем написать упрощенную версию luac непосредственно на Lua:
Код
p = loadfile(arg[1])
f = io.open(arg[2], "wb")
f:write(string.dump(p))
f:close()
Основная функция здесь — это string.dump: она получает функцию Lua и возвращает ее предкомпилированный код как строку, правильно оформленную для ее обратной загрузки в Lua.
Т.к. в Квике теперь две версии lua, то необходимо запускать все в одной версии.
Если версия Квика 7, то там lua 5.1. А вот с ним уже не все так очевидно. Он, действительно, может не переварить номер из 19 символов. Поэтому, собственно, и был переход на lua 5.3. https://forum.quik.ru/forum10/topic5119/ Поэтому обновляйте версию.
Если тип number и предположительно целое, то достаточно такой конструкции
Код
if type(x) == "number" and (math.floor(x) == x) then
return _VERSION == "Lua 5.1" and string.format("%0.16g", x) or tostring(math.tointeger(x) or x)
end
Что же касается получения данных из таблиц Квика, то вызов getItem необходимо свести к минимуму. Один вызов на индекс и запомнить в переменной. Иначе большой расход памяти.
А зачем изменять два раза параметр? Одного раза достаточно. Что касается видеть - то нет. Это либо ошибка, либо разработчики не предполагают изменение вне настроек. Правда если Вы хотите изменять и в коде и в поле настроек, то это уже другая задача: необходимо как-то "сказать коду", что поле изменено в форме и не изменяй его.
Впрочем, Вы можете решить данную задачу используя две (три) переменные.
Одна - в структуре Settings. Вторая - прошлое используемое значение (чтобы понимать, что в форме его изменили). Ну и третья - рабочая, значение которой берется из прошлых двух.
Если это чисто внутренние данные, то может тогда и не хранить их в Settings. А если необходимо именно в них, то можно перед выходом из функции Init установить необходимое значение и оно будет использоваться в расчетах.
Правда возникнет неоднозначная ситуация - в окне ввода параметров будет отображаться то, что ввел пользователь, а расчет будет вестись от переопределенного значения. Но это уже вопрос к разработчикам - Settings явно кешируется и выдается в форме ввода из кеша, не учитывая, что параметры изменены в коде.
Возможно, но чтобы понять проблему необходимо видеть код функции inicfg.load.
Хотя, как правило, если нет уверенности, что данные корректны, то стоит проверять значения прежде чем их использовать. Как минимум убедиться что type(updateIni) == 'table'. Но это не решит проблемы загрузки(записи по указанному пути) файла через сеть.
Видимо, все же стоит обратиться на форум для того продукта, где этот скрипт используется. Поиск дает ответ, что это какая-то игра GTA. Это форум посвящен совсем другому продукту.
nikolz написал: Ну да, типа скрыть тот ужас, который нагородили в роботе, который сливает депозит, но за деньги заказчика. Чтобы не было мучительно стыдно за такой развод. Тогда обязательно.
В принципе да. Но покупать алгоритм - то еще занятие. Тем более, что они все давно исследованы вдоль и поперёк. Для примера, если кто не видел - https://oxfordstrat.com/rd-blog/
Проверьте, что запускаете в корректной версии. В последних версиях Квика две версии lua 5.3.5 и 5.4.1. Если не выбираете в версию при запуске, то выбирается по умолчанию из настроек.
Что значит зачем. Lua не имеет встроенной поддержки web soсket. Поэтому необходимы библиотеки (а не программы), чтобы сие действие стало доступно. Ссылки на сборки библиотек недавно обсуждались.
Если речь про срочный рынок, то цену активации необходимо задавать конкретным значением. Например, рассчитать как сдвиг стоп-цены на 100-200 шагов цены, помня о зависимости ГО от цены. Но, как уже обсуждалось, не факт, что проскальзывание будет меньше. Поэтому контролировать связанный лимитный ордер необходимо.
Также ситуацию когда стоп ордер исполнен, а лимитный ордер не установлен, тоже необходимо контролировать. При этом учитывать, что просто может долго приходить ответ об его установке, а не кидаться и закрывать позицию самому. А то в итоге выйдет уже не закрытие позиции.
Не на всех рынках есть понятие "По рынку". Если после активации ордера лимитный ордер не смог пройти контроль лимитов цен, достаточности средств, то он не будет зарегистрирован. Правда, статус стоп-ордера должен быть "исполнен" т.е. не активный и не снят. А вот биты 10 и 11 как раз могут говорить о причине проблемы.
Проще можно, но когда сервер начнет возвращать данные не в ожидаемом формате, то придется уже разбирать формат.
Если же для себя пишешь, то конечно, можно упрощать. Правда надо помнить, что 9 утра сегодня - это больше чем 22:00 вчера. Если же просто время сравнивать, то будет ошибка.
Пару раз словил странное явление: Есть скрипт использующий библиотеки. Был запущен один, который использовал библиотеку, расположенную в одной из папок отладки. Потом был запущен другой скрипт, использующий ту же библиотеку (то же имя), но уже из рабочей папки.
Второй скрипт при этом не использовал корректную библиотеку, а тоже использовал отладочную от прошлого запуска другого скрипта. Не показалось (как можно было бы подумать), т.к. у меня все модули выводят в лог свою версию.
Скорее всего просто нарушено форматирование при сохранении или уже при чтении проблема алгоритма.
Лучше пойти путем хранения самого контекста скрипта. Для примера, есть некое состояние, скажем State - это таблица с необходимыми данными. Мы ее сохраняем в файл в виде сериализованой таблицы. Тогда чтение будет через одну единственную команду loadfile.
Да, но важно отметить, что в таком случае важно обеспечить постоянную работоспособность алгоритма, вне зависимости от отключения связи и электропитания.
Есть варианты: - увеличивать отступ исполнения стоп-ордера, чтобы была больше вероятность исполнения отправленной лимитной заявки (но, возможно, больше будет ГО) - не ставить стоп физически, а отслеживать цену алгоритмом и закрывать "по рынку" исходя из текущей ситуации, если алгоритм решил, что стоп сработал. - более сложный вариант отслеживания активации стопа. После того как получен признак что стоп исполнен, проверять установку связанного с ним лимитного ордера и его исполнение. Если он не исполнен, снимать его алгоритмом и ставить новый исходя из текущей цены. Т.е. реализовать алгоритм "гонки за ценой". Т.к. мы никогда не знаем какая в будущем будет ситуация в момент активации стопа (т.е. угадать отступ), то, по хорошему, какой-то вариант "гонки" все равно необходимо реализовать.
Также не стоит забывать про битовые флаги 10 и 11 стоп ордера:
бит 10 (0x400) - Стоп-заявка сработала, но была отвергнута торговой системой бит 11 (0x800) - Стоп-заявка сработала, но не прошла контроль лимитов
Ордер может исполнится, а лимитный ордер вообще не прошел. Позиция останется, если это не контролировать.
С одно стороны да, иметь как вариант неплохо было бы. Но стабильность всего этого дела (одна сборка работает, другая нет - это про ssl), уже давно заставила пойти другим путем. А именно - написание программ реализующих отправку, прием запросов. А терминал(ы) уже с ней общается. В таком варианте все уходит в NET (я выбрал C#). А там уже все "их коробки".
Из-за специфики Lua библиотеки мало кто поддерживает. Они старые. Если бы разработчики терминала реализовали бы методы HTTP requset, доступные в qlua, многие бы вопросы ушли.
Более информативным был бы скрипт где есть три потока: Получение данных LAST для цены последней сделки Данные таблицы обезличенных сделок Данные от CreateDataSource
Последний самый медленный. Между его обновлениями десятки сделок могут пройти. Исключение Тиковый график, он равносилен обезличенным сделкам.
Если же использовать SSL, то необходимо иметь luasec. Я стабильно работающую с 5.4 и 5.3 не нашел.
Поэтому, чтобы не зависеть от библиотек lua, уже давно написал себе консольную программку, читающую почту и записывающую в файлы, которые уже скрипт читает и обрабатывает.
Речь про то, что если с графика, то график необходимо открыть, установить идентификаторы, индикаторы и т.д.
А если данные заказать, то ничего открывать не надо. Единственное когда это имеет смысл - это если есть какой-то экзотический индикатор без известного алгоритма.
А Вы точно хотите с графика данные брать? Если алгоритмы простые, то можно сделать через заказ данных. Тогда можно в списке задать настройки построения и пусть себе выгружает без открытия графика. Кажется я такое делал, надо поискать.
Что касается базы данных, то хотелось бы, конечно, видеть стабильно работающий luasql odbc. Я пока для 5.4 не собирал. 5.3 падал постоянно. А драйверы для конкретных баз - это хорошо, но очень уж узко-применимо.
Не очень понятна терминология, но т.к. сервер передает данные, то, видимо, решением вопроса будет контроль параметров, позволяющих оценить, что данные идут.
В частности, можно проверять время сервера и время последнего пришедшего пакета, и разницу между ними.