Переход с Lua 5.1 на Lua 5.3 в терминале QUIK. (Обновление Lua 5.3 QUIK)

Переход с Lua 5.1 на Lua 5.3  в терминале QUIK. (Обновление Lua 5.3 QUIK)

Ссылки на документацию Lua
Lua 5.1 - https://www.lua.org/manual/5.1/manual.html#7
Lua 5.2 - https://www.lua.org/manual/5.2/manual.html#8
Lua 5.3 - https://www.lua.org/manual/5.3/manual.html#8

Версия Lua 5.2.
Так вышло, что в терминале QUIK происходит переход версии с Lua 5.1 сразу на версию Lua 5.3, минуя версию 5.2. В версии Lua 5.2 также были нововведения, которые не совместимы с версией Lua 5.1. Если учитывать то, что в скриптах, представленных на сайте, не используются сторонние  библиотеки, и тем более мы не обращаемся к API Lua, то переход с Lua 5.1 на Lua 5.2 пройдет вообще не заметно.

Единственным исключением может быть то, если Вы используете в своих расчетах, логарифмы. Если в версии Lua 5.1 запись math.log(x)  - возвращала натуральный логарифм числа x, то версии Lua 5.2, функция math.log(x, base), принимает на вход уже два значения, первое значение это х и второе значение это base – основание логарифма. Поскольку появилась возможность указывать основание логарифма, то и потребность в функции math.log10(x) – отпала, тот же результат можно получить, используя функцию math.log(x, base).

Версия Lua 5.3.
В Lua 5.3 произошло более серьезное изменение. Появился новый тип данных, а именно целочисленные переменные integer. Ранее все числовые переменные, были переменными с плавающей точкой (запятой). В версии Lua 5.3 если объявить числовую переменную, содержащую целое число, то данная переменная будет считаться целочисленной. Если с этой переменной произвести арифметические вычисления, после которых она будет иметь дробную часть, то Lua автоматически преобразует ее в переменную с плавающей точкой.   Давайте посмотрим на пример, как поведет себя Lua 5.1 и Lua 5.3 с одинаковыми значениями переменных

Объявим переменную x и присвоим ей значение 2. Сначала пример на Lua 5.1

Lua 5.1
local x = 2
print("x = ", x)
x = x / 2
print("x = ", x)

Результат выполнения скрипта будет следующий
x = 2
x = 1 -- результат после деления х на 2
Все логично и понятно.

Теперь рассмотрим тот же  пример на Lua 5.3
Lua 5.3
local x = 2
print("x = ", x)
x = x / 2
print("x = ", x)

Результат выполнения скрипта будет следующий
x = 2
x = 1.0 -- результат после деления х на 2.
В переменной х уже содержится не просто 1, а 1.0.
Вот тут уже заметна разница. По сути, значения этих переменных равны, если записать условие сравнения двух переменных, в одной из которых содержится значение 1, а во второй значение 1.0, то результатом будет их равенство.

А если они равны, то зачем вообще говорить об этом?
Вспомним, как мы задаем значение цены или объема или идентификатора для отправки транзакции на биржу, уточню для фьючерса на индекс РТС или любого другого фьючерса, цена которого не имеет дробной части.
Например, цена для отправки транзакции, рассчитывается на основании каких-либо параметров, если после расчета, цена будет иметь дробную часть, то нужно обязательно эту дробную часть отбросить в противном случае торговая система QUIK вернет ошибку транзакции.

Что мы делали в таком случае ранее?
Мы, вычитали из числа с дробной частью его дробную часть и получали целое число, далее целое число преобразовывали в строку, для записи в таблицу с параметрами транзакции, код был такой.

Пример Lua 5.1
x =1.99
x = x - x%1  -- операция %x вычитала дробную часть числа, до целого.
x = tostring(x) -- после преобразования в переменной х содержится строка со значением 1

Результат
x = 1

В Lua 5.3 такой вариант уже не пройдет.

Пример Lua 5.3
x =1.99
x = x - x%1  -- операция %x определяла дробную часть числа, до целого.
x = tostring(x) -- поле преобразования, в переменной х содержится строка со значением 1.0

Результат
x = 1.0

Нам не подходит значение x равное 1.0 – такое значение в поле цена, для фьючеров, не имеющих дробной части, вызовет ошибку транзакции. Следовательно, нужно использовать другое преобразование числа с плавающей точкой в целое число. Делать мы это будем через функцию math.floor() –  это функция округления вниз, по-простому, отброс дробной части. Проверим, как она работает в Lua 5.3, возьмем тот же пример:

Пример Lua 5.3
x =1.99
x = math.floor(x) -- операция округления вниз. Отброс дробной части числа.
x = tostring(x) -- поле преобразования, в переменной х содержится строка со значением 1

Результат
x = 1

Вот теперь, у нас все хорошо, переменная x содержит значение 1 и никаких точек и нолей. На самом деле функция math.floor() работает одинаково, что в Lua 5.1, что в Lua 5.3. Возможно, функцию math.floor() нужно было сразу применять в скриптах к Курсу, но, по моему мнению, запись x - x%1 была более понятна, плюс эту конструкцию мы использовали для отображения нужного количества знаков после точки, в общем универсальный подход для нескольких случаев. Теперь эту конструкцию допускается использовать только для уточнения количества знаков после точки. 

По какой-то причине в Lua не придумали логически понятное преобразование числа с плавающей точкой в целое число, например, мог бы быть хороший вариант tointeger() по аналогии с tostring() или tonumber().   

С целыми числами, надеюсь понятно.

Еще одно нововведение Lua 5.3, которое затрагивает наши коды, это изменение параметров чтения файлов. Для чтения значений из файлов мы используем функцию io.open, которая открывает файл и функцию read, которая читает файл. Читать данные из файла можно несколькими способами, вспомним параметры чтения из файла:
"*l" – читает следующую строку;
"*a" – читает весь файл;
"*n" – читает числовое значение.

Перед каждым параметром стоит символ * звездочка, в Lua 5.3 решили упростить запись и убрали этот символ из параметров чтения файла. В Lua 5.3 допускается использовать следующий формат записи:
"l" – читает следующую строку;
"a" – читает весь файл;
"n" – читает числовое значение.

Хочу отметить, предыдущий формат записи также поддерживается, просто символ * звездочка игнорируется.

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

Хорошо Lua 5.3 поддерживается QUIK, но встает вопрос, как сделать так, чтобы Lua 5.3 поддерживался в редакторе кода SciTE?
У меня есть простое решение этого вопроса, может быть не самое правильное с точки зрения основ работы с библиотеками, зато легко выполнимое для любого пользователя. Я скомпилировал Lua 5.3, в результате получилось несколько файлов, которые нужно скопировать в папку Lua и наслаждаться возможностями обновленного языка Lua до версии 5.3.

По запросу, отправлю нужные фалы, всем кто покупал доступ к Курсу и тем, кто покупал отдельно коды скриптов с сайта. Всем новым покупателям фалы с Lua 5.3 будут отправлены по умолчанию. Ниже будет описан процесс замены файлов.

И так, что и где необходимо заменить для работы с Lua 5.3 в редакторе кода SciTE.

Переходим в папку с установленным языком Lua 5.1, стандартный путь выглядит так
C:\Program Files (86)\Lua\5.1

На всякий случай сделаем резервную копию папки 5.1, в результате в папке Lua должно находиться два каталога "5.1" и "5.1 – копия".
Далее откроем папку 5.1, после, откроем папку Lua, которую Вы получили в письме. Папка содержит каталог
include и файлы
lua.dll
lua.exe
lua.lib
luac.exe

Скопируем файлы lua.dll, lua.exe, lua.lib, luac.exe и вставим их в папку с установленным Lua 5.1 (C:\Program Files (86)\Lua\5.1), копировать будем с заменой существующих файлов.

Далее, в папке 5.1 (C:\Program Files (86)\Lua\5.1), удалим каталог include. Теперь из папки содержащей Lua 5.3 скопирует каталог include и вставим его в папку 5.1 (C:\Program Files (86)\Lua\5.1).

Если мы сейчас запустим какой-нибудь скрипт в редакторе SciTE, то можем получить ошибку следующего вида:

В некоторых случаях этой ошибки может не быть, если у Вас установлена Microsoft Visual Studio с компонентами для разработки на языке C++.

Если ошибка возникла, то нужно сделать следующее действие. У Вас в файлах есть две папки это vcruntime140(System32) и vcruntime140(SysWOW64), в каждой из них лежат по одному файлу с одинаковым именем vcruntime140.dll, хоть имена и одинаковые, но файлы разные.
Файл из папки vcruntime140(System32) нужно скопировать в папку по следующему адресу C:\Windows\System32, если появится сообщение, что такой файл уже есть, то заменить его.

Файл из папки vcruntime140(SysWOW64) нужно скопировать в папку по следующему адресу C:\Windows\ SysWOW64, если появится сообщение, что такой файл уже есть, то заменить его.

Все теперь в редакторе кода SciTE будет запускаться Lua 5.3. и ошибок быть не должно. Если ошибка все же будет появляться, то Вам придется самостоятельно скомпилировать Lua 5.3 у себя на компьютере. Как это сделать будет показано позже. 

Если будут вопросы, пожалуйста, обращайтесь.