Заметка

Qlua для чайников. Часть 2. Циклы

  5  

Продолжу публикацию уроков «Qlua для чайников». В первой части мы научились писать программу “Hello, World” и выставлять программно заявки. Сегодня пойдем дальше. Вы, наверное, обратили внимание, что все программы, которые мы написали на прошлом уроке, сразу же заканчивают работу, как только выполнили все запрограммированные функции? Возникает вопрос: как быть, если надо, чтобы программа работала постоянно, следила за рынком и совершала сделки? Очень просто. Надо сделать так, чтобы при запуске программа повторяла набор команд. Для этих целей в языке Qlua предусмотрены циклы.

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

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

is_run=true

count=1

function main()

      while is_run do

            sleep(2000)

            message("Hello, World! №"..tostring(count),1)

            count=count+1

      end

end

function OnStop(stop_flag)

      is_run=false

end

Данная программа у нас будет каждые 2 секунды выдавать сообщение “Hello, World!”,  с номером, каждый раз большим на 1:

 

И это будет до тех пор, пока мы не остановим ее кнопочкой «Остановить»:

 

Теперь разберем программу. Сначала у нас идет строка

is_run=true

Этой строкой мы присваиваем переменной is_run значение true (истина). Эта переменная у нас обозначает признак, запущена ли программа. Когда пользователь нажимает кнопочку «Остановить», происходит событие OnStop. Если у нас в программе есть функция с именем OnStop, то код внутри этой функции запуститься на выполнение. Функция обозначается словом function, после нее идет имя функции, которое обязательно должно начинаться с буквы, может содержать в себе латинские буквы и цифры, а так же знак _. Никакие другие символы (пробел, русские буквы, специальные знаки) в именах функций не допускаются. После имени функции идут скобки, а в них список аргументов функции. Потом идет программный код, относящийся к данной функции, который оканчивается словом end.

Функции могут быть двух видов – пользовательские и предопределенные. Первые служат для того, чтобы один и тот же набор команд можно было запускать несколько раз из разных мест программы, не переписывая каждый раз одно и тоже. То есть вы один раз пишите этот набор команд, присваиваете ему имя, а потом уже где надо используете это имя как самостоятельную команду. Очень удобно. Предопределенные функции – это функции, которые вызывает сама система при наступлении тех или иных событий. Имена этих функций можно посмотреть в справке (http://help.qlua.org). Как правильно использовать эти самые предопределенные функции мы тоже будем изучать в данном цикле уроков.

Функция OnStop, которую мы используем, там тоже описана:

 

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

Но вернемся к нашей программе. Далее у нас идет строка:

count=1

Думаю, вы поняли, для чего она – что бы задать начальное значение счетчика. Далее мы объявляем функцию main, у нее нет параметров:

function main()

      while is_run do

            sleep(2000)

            message("Hello, World! №"..tostring(count),1)

            count=count+1

      end

end

Эта функция так же является предопределенной. Система запускает ее при запуске скрипта, сразу же после того, как выполнит сам скрипт. В нашем случае это два присваивания.

Внутри функции main у нас цикл. Это цикл «пока». Он выполняется, пока справедливо условие, заданное между словами while и do. В нашем примере это значение переменной is_run. При начале работы программы оно задается true (истина), поэтому цикл выполняется. Внутри этого цикла мы включаем двухсекундную задержку командой

sleep(2000)

Где в скобках задержка в миллисекундах. Затем выводим сообщение, после чего значение счетчика увеличивается на 1. И так происходит до тех пор, пока пользователь не нажмем кнопку «Остановить». В этом случае вызовется функция OnStop, значение is_run станет равное false, после чего условие цикла перестанет выполнятся, цикл прекратиться, программа будет завершена, так как кроме этого цикла в ней далее ничего нет.

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

До новых встреч.

Читайте продолжение:

Qlua для чайников. Часть 3. Работа со стаканом

Комментарии

drghestykmb — 20 августа 2014 г.

unction OnStop(stop_flag)

is_run=false

end
без этой функции не работает?
QPL работает.в чем отличие.и как переписать на луа.

0 +

megabax — 20 августа 2014 г.

drghestykmb, Вообще то эта функция нужна что бы сбросить переменную is_run, по которой у нас цикл в main. Если эту переменную не сбрасывать, то мы не сможет выйти из цикла (зависнем).

0 +

drghestykmb — 21 августа 2014 г.

спасибо.значитQPL сама.а луа надо сбрасывать .на начало.

0 +

oktb — 22 августа 2014 г.

Ув. megabax вопрос - скажите можно в скриптах Lua использовать внешние dll ?
Если, да то не могли бы Вы описать синтакс функции обращения?
Спасибо.
P.S. Просто я использую внешную dll написанную под Omega и хотелось бы ее "прикрутить" к графику цены в Квике через LUA

0 +

megabax — 16 сентября 2014 г.

oktb, Добрый день. dll-ами еще не занимался, но вроде как кто то пишет, что можно. Когда дойдут руки, обязательно займусь этим вопросом.

0 +

Николай Камынин — 30 августа 2014 г.

Добрый день,
Интересно будет прочитать Ваше объяснение для чайников работу с колбеками.
Полагаю, что написать руководство для чайников по программированию на QLUA реально работающих роботов ( не игрушек) дело сложное.
Посмотрим на сколько Вас хватит.
Успехов.

0 +

megabax — 16 сентября 2014 г.

Николай Камынин, Несколько сложное, сколько объемное. До коллбэков, думаю, доберусь.

0 +

Николай Камынин — 13 октября 2014 г.

oktb,
можно использовать внешние DLL .

0 +

crn05 — 16 февраля 2015 г.

Функция вызывается терминалом QUIK при остановке скрипта из диалога управления.
Формат вызова:
OnStop(NUMBER stop_flag)
Примечание:
Значение параметра «stop_flag» – «1». После окончания выполнения функции таймаут завершения работы скрипта 5 секунд. По истечении этого интервала функция main() завершается принудительно. При этом возможна потеря системных ресурсов.
------------------------------------------------------------------------------------------------------------------
не совсем понятно как работает stop_flag, вроде объявлена как переменная типа NUMBER, при этом значение переменной нигде не присваивается. Может это какая-то системная переменная?

0 +

drghestykmb — 1 декабря 2015 г.

цикл работает один раз. откроет и закроет позицию. для бесконечности реверса что надо?

0 +

vit10052 — 28 мая 2018 г.

tostring - это что можно поподробнее?

0 +

Написать комментарий

Чтобы написать комментарий, необходимо авторизоваться.

Написать администратору