Заметка

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

  12  

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

Прежде чем приступить к уроку, хочу сказать пару слов о языке программирования qlua, который мы будем изучать. На сегодняшний день этот язык – самый удобный и доступный способ что-либо автоматизировать для начинающих программистов. Язык qlua гораздо лучше и удобнее его предшественника – qpile, он содержит больше возможностей, и роботов, написанных на нем, можно сделать гораздо боле гибкими. Что особо радует, так это, например, наличие так называемых CALLBACK функций (функций обратного вызова), благодаря которым появилась возможность легко писать роботов, реагирующих на разные события: изменение статуса заявки, приход сделки и т. д. (см.  статью  http://robostroy.ru/community/article.aspx?id=765).

Итак, начнем. Для начала мы просто возьмем и создадим программу, которая просто выведет на экран сообщение «Hello, World!». Очень многие начинали именно с этого. Вот текст этой очень и очень простой программы:

message("Hello, World!",1)

Текст программы можно набрать в блокноте:

 

Но лучше, конечно, воспользоваться специализированной программой типа «Notepad++», там есть даже подсветка синтаксиса:

 

Обратите внимание, что сохранять файл нужно обязательно с расширением lua.

Итак, программа набрана, запускаем ее. Для этого идем в меню «Таблицы» -> «Lua» -> «Доступные скрипты».

 

У нас откроется вот такое окошко:

 

Жмем кнопочку добавить, выбираем там наш файл:

 

Он появился в списке доступных скриптов:

 

Выделяем его, жмем на кнопочку «Запустить» и видим результат:

 

Поздравляю, вы написали свою первую программу. Просто, не правда ли?

Но слышу разочарованные вздохи. Несмотря на просто изумительную простоту, наша программа абсолютно бесполезна. Ну что я могу сказать? Наберитесь терпения! Сейчас мы научится делать более сложные вещи.

Итак, давайте попробуем ввести заявку. Создаем новый скрипт (файл lua) вот с таким текстом:

t = {

            ["CLASSCODE"]="TQBR",

            ["SECCODE"]="LKOH",

            ["ACTION"]="NEW_ORDER",

            ["ACCOUNT"]="L01-00000F00",

            ["CLIENT_CODE"]="52134",

            ["TYPE"]="L",

            ["OPERATION"]="B",

            ["QUANTITY"]="1",

            ["PRICE"]="1950",

            ["TRANS_ID"]="1"

      }

res=sendTransaction(t)

message(res,1)

Это программа чуть-чуть сложнее, поэтому я подробно сейчас разберу ее. Итак, сначала у нас идет строка t={…

t – это переменная. Она хранит в себе какое-то значение (число, строку, массив, таблицу, какой либо специальный объект или ничего не хранит, если ничего ей не присваиваем). В данном примере мы переменной t присваиваем целую структуру. У этой структуры есть поля. Они указываются в квадратных скобках, после них идет знак «=» и то, чему они равны. Такие пары перечисляются через запятую. Первое поле CLASSCODE. Это код класса. Его можно посмотреть, например, в текущей таблице параметров:

 

В нашем случае мы используем код класса акций ЛУКОЙЛ.

Саму текущую таблицу параметров можно открыть через меню «Таблица» -> «Текущая таблица».

 

В этой таблице необходимо настроить колонки, которые мы хотим видеть:

 

Следующее поле SECCODE – это код бумаги, в данном случае код ЛУКОЙЛа, так же смотрим его в текущей таблице параметров:

 

Поле ACTION – это действие, которое мы производим. В нашем случае это NEW_ORDER – новая заявка.

Поле ACCOUNT – это номер брокерского счета, можно посмотреть в таблице счетов, колонка «Счет»:

 

Эта таблица находиться в меню «Торговля» -> «Торговые счета»:

 

Далее идет поле CLIENT_CODE – это код клиента, можно посмотреть в таблице «Клиентский портфель»:

 

Открывается данная таблица через «Лимиты» -> «Клиентский портфель»:

 

Поле TYPE – тип заявки. «L» — лимитированная, «M» — рыночная.

OPERATION – тип операции, «B» если покупаем, «S» если продаем.

QUANTITY – количество, как правило, в лотах. Но у разных брокеров может быть по-разному (в лотах или в штуках акций).

PRICE – цена.

TRANS_ID – идентификатор транзакции. Иногда он бывает нужен, например, в случае, описанном в одной из моих предыдущих статей: http://robostroy.ru/community/article.aspx?id=765. Но чаще всего безразлично, что вы зададите в этом поле, например, можно просто поставить единичку.

После заполнения полей переменной t мы вызываем функцию sendTransaction, она вернет нам сообщение, которое мы выведем на экран функцией message, которую мы ранее использовали для вывода сообщения “Hello, World!”. Обратите внимание, что res идет без кавычек, это переменная, а не жестко заданный текст, как в предыдущем примере.

Итак, поставим в текст программы те параметры, которые правильные для вашего случая (номер счета, код клиента, параметры бумаги, цену и количество) и запускаем скрипт. Если все правильно, то вы увидите примерно такое сообщение:

 

Иначе может вылезти сообщение с ошибкой. Проверьте, действительно ли выставилась заявка.

 

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

price=1995

for v=1,5,1 do

      --покупка

      t = {

                  ["CLASSCODE"]="TQBR",

                  ["SECCODE"]="LKOH",

                  ["ACTION"]="NEW_ORDER",

                  ["ACCOUNT"]="L01-00000F00",

                  ["CLIENT_CODE"]="52134",

                  ["TYPE"]="L",

                  ["OPERATION"]="B",

                  ["QUANTITY"]="1",

                  ["PRICE"]=tostring(price-v),

                  ["TRANS_ID"]="1"

            }

      res=sendTransaction(t)

      message(res,1)

     

      --продажа

      t = {

                  ["CLASSCODE"]="TQBR",

                  ["SECCODE"]="LKOH",

                  ["ACTION"]="NEW_ORDER",

                  ["ACCOUNT"]="L01-00000F00",

                  ["CLIENT_CODE"]="52134",

                  ["TYPE"]="L",

                  ["OPERATION"]="S",

                  ["QUANTITY"]="1",

                  ["PRICE"]=tostring(price+v),

                  ["TRANS_ID"]="1"

            }

      res=sendTransaction(t)

      message(res,1)

     

end

Запускаем его и видим, что он выставил кучу заявок с заданным шагом:

 

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

Может возникнуть вопрос: «А если надо выставить заявки с шагом 3?»  Не проблема, строку

for v=1,5,1 do

Заменим на строку

for v=1,15,3 do

Первая цифра в этом списке – откуда начинать. В данном случае начинаем с единицы, то есть, первый раз прибавляем (или вычитаем) к цене 1. Затем каждый раз это число увеличиваем на 3 (третья цифра).  То есть, получается ряд 1, 4 ,7, 11. Вторая цифра – 15 это ограничитель, до каких пор мы повторяем цикл. В данном случае до тех пор, пока переменная v не превысит 15.

Хотя можно эту же задачу решить по-другому, более изящно:

price=1988

for v=1,5,1 do

      --покупка

      t = {

                  ["CLASSCODE"]="TQBR",

                  ["SECCODE"]="LKOH",

                  ["ACTION"]="NEW_ORDER",

                  ["ACCOUNT"]="L01-00000F00",

                  ["CLIENT_CODE"]="52134",

                  ["TYPE"]="L",

                  ["OPERATION"]="B",

                  ["QUANTITY"]="1",

                  ["PRICE"]=tostring(price-v*3),

                  ["TRANS_ID"]="1"

            }

      res=sendTransaction(t)

      message(res,1)

     

      --продажа

      t = {

                  ["CLASSCODE"]="TQBR",

                  ["SECCODE"]="LKOH",

                  ["ACTION"]="NEW_ORDER",

                  ["ACCOUNT"]="L01-00000F00",

                  ["CLIENT_CODE"]="52134",

                  ["TYPE"]="L",

                  ["OPERATION"]="S",

                  ["QUANTITY"]="1",

                  ["PRICE"]=tostring(price+v*3),

                  ["TRANS_ID"]="1"

            }

      res=sendTransaction(t)

      message(res,1)

     

end

В этом случае мы опять же повторяем цикл 5 раз с шагом 1 (для v от 1 до 5), но  прибавляем (вычитаем) к цене не v, а v, умноженное на 3.

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

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

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

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

Комментарии

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

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

2 +

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

oktb, ок, буду иметь в виду.

0 +

asas55555 — 18 августа 2014 г.

интересно
можно пример чтоб в 23-40 закрывались все открытые позы по рынку

0 +

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

asas55555, да так можно сделать, возможно, напишу про это статью, буду иметь в виду.

0 +

asas55555 — 18 августа 2014 г.

megabax, спс буду ждать

0 +

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

а ещё есть http://www.qlua.org/ ; ребята сделали библиотеку QL, в ней реализованы большинство необходимых функций (отправка заявок разных типов, проверка позиции по инструментам и пр) + форум + примеры некоторых алгоритмов. В общем новичкам поможет (сам сейчас тестирую скрипт на базе QL, без этой библиотеки процесс разработки занял бы гораздо больше времени).

0 +

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

DenisDV875, Только вот документации по этой библиотеке что то у них нет на сайте...

0 +

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

это заявки.стоп заявки?

0 +

megabax — 13 октября 2014 г.

drghestykmb, В данном уроке речь идет об обычных заявках

0 +

kolya-nikolaev — 15 февраля 2015 г.

megabax, а не подскажите как переделать так что бы выставлялись не обычные а стоп заявки?

0 +

suvik — 27 февраля 2015 г.

подскажите
как написать чтоб простенький робот торговал от цены мувинга

0 +

suvik — 27 февраля 2015 г.

хотел сам , но ничего не смыслю в этом
хотя знаю что на таких редких выстрелах руками не успеешь
и двигать самому заявки от мувинга туда сюда иногда целый день уходит

0 +

k-175699 — 9 апреля 2017 г.

написал Hello Word в блокноте, а из квика его не видно. т.к. файл не lua расширения. В какой программе писать робота, где ее взять и как? Я хочу сам попробовать писать робота.

0 +

Surmounter — 12 апреля 2017 г.

k-175699,
можно в любом редакторе, хоть в блокноте, главное поменять расширение файла на *.lua

0 +

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

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

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