Найти в Дзене
Код торгового робота

Основные операции в языке LUA. Часть 2 (циклы, функции, встроенные команды)

Итак, продолжаем рассматривать операторы и конструкции языка LUA. Повторюсь, я не рассматриваю все возможные операторы. Для этого нужно было бы написать отдельную книжку по языку LUA. Я показываю только то, что использую в своих реальных скриптах. Первую часть по основным операциям в языке LUA можно посмотреть по данной ссылке. ==================================== Краткое содержание данного канала. ==================================== 4. Циклы. Циклы – очень мощные конструкции практически любых языков программирования. Эти конструкции позволяют несколько раз запускать один и тот же код без изменений или с незначительными изменениями входных данных. Для того, чтобы скрипт торгового робота работал весь день, можно использовать бесконечный цикл. Или долгий цикл, который будет работать намного дольше, чем будет длиться торговый день на бирже. Я использую второй вариант. Вариантов циклов есть несколько. Однако я использую всего три. Первый вариант: for i=1,6000 do (команды внутри цикла) end

Итак, продолжаем рассматривать операторы и конструкции языка LUA. Повторюсь, я не рассматриваю все возможные операторы. Для этого нужно было бы написать отдельную книжку по языку LUA. Я показываю только то, что использую в своих реальных скриптах.

Первую часть по основным операциям в языке LUA можно посмотреть по данной ссылке.

====================================

Краткое содержание данного канала.

====================================

4. Циклы.

Циклы – очень мощные конструкции практически любых языков программирования. Эти конструкции позволяют несколько раз запускать один и тот же код без изменений или с незначительными изменениями входных данных.

Для того, чтобы скрипт торгового робота работал весь день, можно использовать бесконечный цикл. Или долгий цикл, который будет работать намного дольше, чем будет длиться торговый день на бирже. Я использую второй вариант.

Вариантов циклов есть несколько. Однако я использую всего три.

Первый вариант:

for i=1,6000 do
(команды внутри цикла)
end

В таком варианте команды внутри цикла будут выполняться 6000 раз. При этом при первом выполнении переменная i будет равна 1, при втором – 2, при третьем – 3 и так далее до 6000. Увеличение переменной на единицу идет по умолчанию.

Если первую строку указать так:

for i=1,6000,2 do

то переменная будет увеличиваться на 2.

Обратите внимание, что в данном примере я назвал переменную просто одной буквой. Хотя ранее, говоря про переменные, я не рекомендовал так делать. Это общепринятое в среде программистов исключение. Переменные, используемые как счетчик в циклах (как в приведенном примере) можно называть кратко. И часто для этих целей используют именно букву i.

Попробуйте запустить такой код:

for i=1,60 do
message("Переменная i равна "..i);
end

Посмотрите что получится.

Второй вариант цикла выглядит так:

for key, val in pairs(massiv) do
(команды внутри цикла. Обычно с обращением к переменным key, val)
end

Этот цикл берет массив с именем massiv и перебирает все его элементы. При этом внутри цикла индекс очередного элемента помещается в переменную key. А значение очередного элемента помещается в переменную val.

Давайте рассмотрим такой пример:

massiv = {} –создаем пустой массив
massiv["one"] = "green"; -- создаем первый элемент массива с индексом "one" и значением "green"
massiv["two"] = "blue"; -- создаем второй элемент массива с индексом "two" и значением "blue"
massiv["three"] = "black"; -- создаем третий элемент массива с индексом "three" и значением "black"
for key, val in pairs(massiv) do
message("Элемент массива с индексом"..key.." равен значению "..val);
end

Попробуйте запустить такой код и посмотрите что будет выдано.

Очень редко я использую еще один вариант цикла:

while (условие)do
(операции внутри цикла)
end

Этот цикл выполняется пока верно условие, указанное в начале.

5. Функции

Функции – еще одна мощная конструкция языка программирования. Функции тоже, как и циклы, позволяют многократно запускать один и тот же код, как правило с разными исходными данными. Также функции позволяют сделать код скрипта более понятным, вынося блоки кода в отдельные функции.

Запись функции имеет следующий вид:

function nazvanie_functcii(znachenie1, znachenie2)
(операции внутри функции)
return peremennaya
end

В данном случае написана функция с произвольным(собственным) названием - nazvanie_functcii.

В нее мы передаем два значения - znachenie1, znachenie2.

В результате каких либо действий получается переменная – peremennaya.

Данная функция должна быть написана за пределами основной функции – main.

Вызов функции стандартный - nazvanie_functcii(znachenie1, znachenie2).

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

function main()
perem1 = summ(5,8); -- вызываем функцию, передавая ей два значения.
message("Сумма чисел равна:"..perem1);
end
function summ(znachenie1, znachenie2) -- начало написания собственной функции.
peremennaya = znachenie1 + znachenie2;
return peremennaya
end

Скачать данный код

После запуска этого кода у Вас должно появиться окно:

-2

То есть мы написали свою функцию summ, передали в нее два значения. Наша функция просуммировала эти значения, вернула результат. Основной код получил этот результат и записал в переменную perem1. Затем вывел эту переменную через команду message.

Обратите внимание на следующее.

В коде была запись такая:

message("Сумма чисел равна:"..perem1);

Вроде бы можно было бы ограничиться просто выводом переменной:

message(perem1);

Но, нет. Не знаю почему, но в таком виде вообще ничего не выводится. Поэтому, если Вы выводите значение какой-либо переменной, то обязательно дописывайте пояснения. Это будет правильно: будет понятно что выводится и будет работать.

Также следует отметить, что функция не обязательно должна возвращать какие-либо значения.

То есть строки с командой return может не быть.

Например, это может быть функция выставления заявки. Функция получит все данные: по какой бумаге, по какой цене, какой объем и пр. Выставит заявку и в ответ ничего не вернет. Такое тоже возможно.

Говоря, про функции нужно задеть тему видимости переменных. Тут правило такое: Любая переменная, объявленная где угодно может быть использована где угодно (честно сказать, это бардак какой-то). Если Вы используете внутри функции какие-то временные переменные, которые используются только для работы этой функции, то лучше сделать эту переменную локальной. Для этого перед объявлением переменной нужно написать слово local

Пример:

local perem = 9;

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

6. Встроенные функции

Помимо собственных функций в LUA есть встроенные функции или команды, которые позволяют реализовывать различные манипуляции с данными.

Я здесь приведу только те функции, которые использую в своих реальных скриптах.

message() – уже ранее рассматривали эту команду. Но, про нее еще поговорим в отдельном выпуске.

math.ceil(х) – данная команда возвращает наименьшее целое значение, которое больше или равно x.

math.abs(x) – возвращает модуль числа х.

table.remove(massiv, index) – удаляет из массива значение с указанным индексом.

string.find(stroka, znak) – выдает номер позиции в строке с указанным знаком.

string.sub (stroka, nachalo, konec) – выдает подстроку из указанной строки с позиции nachalo до konec

sleep(х) – останавливает выполнение скрипта на х миллисекунд. Без этой команды никуда!

Регулярно возникает задача перевода переменной из стокового значения в числовое. Наверняка, для этого есть соответствующая функция. Но, я просто добавляю к переменной 0. Так полученное значение переводится в число, и с ним можно начинать проводить математические операции, использовать в качестве индекса для обращения к массиву и пр.

Вот, пожалуй, и все встроенные команды, которые я использовал.

Полный список встроенных функций языка программирования LUA можно посмотреть по адресу: http://lua.org.ru/contents_ru.html

На этом я завершаю рассмотрение стандартных возможностей языка программирования LUA. Дальше мы будем рассматривать встроенные функции, которые позволяют вести торговлю или собирать данные для анализа. То есть, такие функции как запрос баланса, просмотр свечей, выставление заявок и прочее.

Дальше будет интереснее. Подписывайтесь на канал, что бы не пропустить новые темы.

====================================

Если Вы хотели бы получить программную реализацию своей торговой идеи, но понимаете, что сами не готовы облачить идею в код, то можете обратиться ко мне. Мой адрес в телеграм: https://t.me/Nikolai_Antonov

Моя электронная почта: nantonov@mail.ru

⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇

📃 Краткое содержание данного канала.

➖➖➖➖➖➖➖➖➖➖➖➖➖

Landingcentr.ru - разработка сайтов для малого и среднего бизнеса.

⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆