В примере, торгового робота, будет рассмотрена работа со стаканом котировок. Для начала мы возьмем по одному значению цены и объема с каждой стороны стакана и выведем их в таблицу. Далее усложним задачу и возьмем весть доступный стакан котировок. В примерах будет рассмотрена работа двух функций это функция интерпретатора QLua с именем getQuoteLevel2() и функция обратного вызова OnQuote().

В интерпретаторе QLua предусмотрена функция получения стакана котировок по классу и коду бумаги. Функция именуется getQuoteLevel2(). Для вызова функции в нее необходимо передать класс и код бумаги. Для работы функции необходимо чтобы стакан, с необходимыми котировками, был открыт. Функция возвращает таблицу, содержащую следующие параметры:

1.Строка с ключом bid_count содержит количество лотов на покупку, т.е. количество цен в стакане со стороны покупки. (Параметр возвращается в строковом виде.)
2.Строка с ключом offer_count содержит количество лотов на продажу, т.е. количество цен в стакане со стороны продажи. (Параметр возвращается в строковом виде.)
3.Строка с ключом bid содержит таблицу из двух столбцов с ключами price и quantity для котировок на покупку. Соответственно строка с ключом price таблицы bid содержит цену, а строка с ключом quantity содержит количество лотов выставленных по этой цене.
4.Строка с ключом offer содержит таблицу из двух столбцов с ключами price и quantity для котировок на продажу. Соответственно строка с ключом price таблицы bid содержит цену, а строка с ключом quantity содержит количество лотов выставленных по этой цене.Таблица, возвращаемая функцией getQuoteLevel2() выглядит следующим образом:

Рассмотрим нумерацию строк в таблицах bid и offer. Здесь есть важная особенность. «Лучшая цена» bid (покупка) содержится в последней строке таблицы, а «Лучшая цена» offer (продажа) содержится в первой строке таблицы (нумерация строк в таблице начинается с единицы).

Рассмотрим гипотетический стакан. С обеих сторон есть шесть предложений на покупку и на продажу.

Как видно из примера нумерация строк идет снизу вверх.

По ходу написания кода разберем особенности работы со стаканом. В первом примере выведем лучшие котировки в окно таблицы.

Создадим новый файл скрипта Lua и назовем его «020 Стакан котировок вывод одной строки.lua».Добавим обязательные строки кода для остановки скрипта из окна «Доступные скрипты». В данном примере у нас не будет никаких дополнительных функций, поэтому стразу же пишем основную функцию mail()

Значения из стакана котировок будем выводить в окно таблицы. Как создавать окно таблицы рассматривалось в разделе «12. Интерпретатор языка Lua для терминала QUIK.» Пропишем необходимые строки кода.

Строка кода 8. Создается переменная, в которую записывается числовой идентификатор окна таблицы, функция AllocTable() создает структуру таблицы и возвращает числовой идентификатор окна таблицы. Любое обращение к окну таблице осуществляется через числовой идентификатор.
Строки кода 9 – 11. Функция AddColumn() создает колонки с номерами от 1 до 3 в таблице с числовым идентификатором Table и указанными параметрами.
Строка кода 12. Функция создает окно таблицы по указанному идентификатору.
Строка кода 13. Функция прописывает заголовок окна таблицы по указанному идентификатору.
Строка кода 14. Функция задает координаты верхнего левого и нижнего правого угла окна таблицы, в пикселях.

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

Для добавления строки используется функция InsertRow(). Можно конечно два раза прописать InsertRow(Table, -1), но это не подойдет, если строк будет много, поэтому воспользуемся циклом.

Создадим переменную с именем RowN, которая будет содержать количество строк, и присвоим ей значение 2.

Запишем цикл перебора значений. В данном случае нам идеально подойдет цикл for. Цикл переберет значения от 1 до RowN с шагом единица.

Внутри цикла пропишем функцию InsertRow(Table, -1), которая добавит строку в конец таблицы.

Окно таблицы готово. Далее нам понадобятся переменные, в которые будут записаны необходимые параметры. Создадим переменные.

Строка кода 19. Переменная, в которую запишутся объемы котировок на продажу.
Строка кода 20. Переменная, в которую запишутся цены котировок на продажу.
Строка кода 21. Переменная, в которую запишется количество котировок на продажу.
Строка кода 22. Переменная, в которую запишутся объемы котировок на покупку.
Строка кода 23. Переменная, в которую запишутся цены котировок на покупку.
Строка кода 24. Переменная, в которую запишется количество котировок на покупку.
Строка кода 25. Создается таблица, в которую запишутся все данные из стакана котировок.
Строка кода 26. Переменная, содержащая код торгового инструмента.

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

В теле цикла вызовем функцию getQuoteLevel2(), с необходимыми параметрами и результат ее выполнения поместим в таблицу Quotes.

Далее, возьмем из таблицы Quotes значение количества котировок для offer и bid и поместим их в соответствующие переменные. Поскольку функция getQuoteLevel2() возвращает эти два параметра в строковом типе данных, то нам необходимо преобразовать их в числовой тип, для дальнейшего использования, поэтому добавим преобразование в числовой тип.

Количество котировок у разных инструментов может отличаться, в первую очередь это зависит от их ликвидности, так же различные брокеры предоставляют разную рубину стакана.

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

Строка кода 31. Условие проверяет наличие хотя бы одной котировки на продажу в стакане котировок.
Строка кода 32. В переменную записывается объем лучшей котировки на продажу. Нумерация строк в таблице котировок начинается с единицы.
Строка кода 33. В переменную записывается цена лучшей котировки на продажу. Нумерация строк в таблице котировок начинается с единицы.

Значение, в строках кода 32 и 33, преобразуется в числовой тип данный для корректного отображения в окне таблицы.

Котировки на продажу получены, далее пропишем вывод их в окно таблицы.

Строка кода 34. В строку 1 и колонку 1, таблицы Table выводится значение переменной Offer_Vol.
Строка кода 35. В строку 1 и колонку 2, таблицы Table выводится значение переменной Offer_Price.

Если с котировками на продажу все просто, первая строка является лучшей ценой, то с котировками на покупку немного сложнее. Лучшая котировка на покупку содержится в самом конце таблицы Quotes.

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

Далее добавим проверку наличия котировок на покупку и при их наличии возьмем значение лучшей.

Строка кода 37. Условие проверяет наличие хотя бы одной котировки на покупку в стакане котировок.
Строка кода 38. В переменную записывается объем лучшей котировки на покупку.
Строка кода 39. В переменную записывается цена лучшей котировки на покупку.

В строках кода 38 и 39 из таблицы Quotes берется последняя строка с индексом Bid_Count. Так же как в случае с котировками на продажу значения преобразуются в числовой тип данных.

Пропишем вывод значений в окно таблицы терминала QUIK.

Строка кода 40. В строку 2 и колонку 2, таблицы Table выводится значение переменной Bid_Price.
Строка кода 41. В строку 2 и колонку 3, таблицы Table выводится значение переменной Bid_Vol.

Перед самым концом цикла while stopped == false do пропишем пазу выполнения скрипта в 100 миллисекунд.

Скрипт торгового робота готов, сохраним и запустим его в терминале QUIK.

Скрипт торгового робота работает, в окно выводятся лучшие котировки на покупку и продажу.

У Вас могут быть другие настройки QUIK, при которых, стакан котировок отображается перевернутым, это не влияет на работу скрипта торгового робота. Если Вам потребуется перевернуть стакан, так как на скриншоте, то это можно сделать в окне «Редактирование таблицы котировок» окно открывается через контекстное меню стакана котировок, пункт «Редактировать таблицу». В этом окне снимите галочку в пункте «Покупку показывать сверху».

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

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

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

В коде были добавлены следующие строки: 32, 35, 36, 40, 44, 45.

Строки под номерами 31, 33, 34, 40, 42, 43. Были закомментированы.
В строках кода 32 и 41 мы проверяем, чтобы количество котировок было больше одной.
В строках кода 35 и 36 просто указываем индекс второй строки в таблице Quotes.
В строках кода 44 и 45 берем предпоследнюю строку Bid_Count-1 в таблице Quotes.

Сохраним и запустим скрипт торгового робота в терминале QUIK.

На скриншоте видно, что котировки, верно, отображаются в окне «Стакан котировок».

С этим скриптом, торгового робота, мы закончили. Теперь усложним задачу. Возьмем весь стакан котировок.

Создадим новый файл скрипта Lua, назовем его «021 Стакан котировок вывод всех строк.lua».

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

Переменной RowN присвоим значение 1, в данном примере добавление строк в окно таблицы «Стакан котировок» будет происходить в другом месте кода с использованием цикла while и другого условия, но об этом чуть позже.

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

Создадим вышеуказанные таблицы в нашем скрипте торгового робота.

Строка кода 20. Таблица, в которую запишутся объемы котировок на продажу.
Строка кода 21. Таблица, в которую запишутся цены котировок на продажу.
Строка кода 22. Таблица, в которую запишутся объемы котировок на покупку.
Строка кода 23. Таблица, в которую запишутся цены котировок на покупку.

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

Для того чтобы записать значения из стакана в таблицы используем циклы while.

Сначала запишем значения котировок на продажу в соответствующие таблицы. Для цикла потребуется управляющая переменная, создадим ее и присвоим ей значение 1, обратите внимание индексы строк в таблице Quotes, которая содержит данные из стакана котировок, начинаются с единицы, а не с ноля.

Создадим цикл while, который перебирает значения от 1 до Offer_Count, и заполним таблицы Table_Offer_Vol и Table_Offer_Price, напомню Offer_Count это количество котировок на продажу.

Строка кода 29. Цикл, который будет считывать котировки на продажу из таблицы с котировками, и записывать их в соответствующие таблицы.
Строка кода 30. В таблицу записывается объем котировок на продажу.
Строка кода 31. В таблицу записывается цена котировки на продажу.В строках кода 30 и 31 значение предварительно преобразуется в числовой тип данных.
Строка кода 32. Управляющая переменная увеличивается на единицу для перехода на следующую строку стакана котировок.

Для записи значений котировок на покупку будем использовать код с некоторыми отличиями. Поскольку лучшая цена котировки на покупку записана в самой последней строке, то для того, чтобы в нашей таблице запись была обратная, т.е. лучшая цена котировки на покупку была записана в первой строке, то соответственно необходимо начать запись с конца таблицы Quotes в начало таблиц Table_Bid_Vol и Table_Bid_Price.

Перед записью цикла создадим переменную i_BC и присвоим ей значение количества котировок на покупку Bid_Count. С помощью переменной i_BC будем перебирать значения в стакане, а для записи значений в таблицы Table_Bid_Vol и Table_Bid_Price понадобится еще одна переменная, создадим переменную i и присвоим ей значение 1, поскольку запись будет осуществляться с начала таблиц.

Далее запишем цикл полностью, а ниже разберем его по строкам.

Строка кода 36. Цикл, который будет считывать значения со стакана котировок на покупку и записывать их в соответствующие таблицы. Цикл выполняется, пока не прочитает все котировки на покупку, количество котировок на покупку содержится в переменной Bid_Count.
Строка кода 37. В таблицу записывается объем котировки на покупку. Считывание значений происходит из таблицы Quotes содержащей стакан котировок.
Строка кода 38. В таблицу записывается цена котировки на покупку. Считывание значений происходит из таблицы Quotes содержащей стакан котировок.
Обратите внимание на строки кода 37 и 38. Лучшая котировка на покупку записана в самом конце таблицы Quotes, по этому, считывание осуществляется с конца таблицы Quotes, а запись значений, в таблицу Table_Bid_Vol, осуществляется с начала таблицы.
Строка кода 39. Переменная, управляющая записью значений в таблицы, увеличивается на единицу.
Строка кода 40. Переменная, управляющая чтением значений из таблицы, содержащей данные стакана котировок, уменьшается на единицу.

Код для записи значений из стакана в таблицы готов. Значения лучших котировок записаны в начале таблицы.

Далее по условию необходимо вывести значения в окно таблице в таком же виде, как и в стакане котировок.

Сначала создадим необходимое количество строк в окне таблицы. Для этого используем цикл while и уже созданную переменную RowN. В условии цикла пропишем создать количество строк равное сумме котировок на продажу и покупку.

Необходимое количество строк в окне таблицы «Стакан котировок» создано. Далее нам понадобится еще одна переменная, которая будет указывать, в какую строку окна таблицы записывать котировку. Создадим переменную и назовем ее Row, присвоим ей значение 1, чтобы начать вывод в окно таблицы «Стакан котировок» с первой строки.

Сначала будем выводить значения котировок на продажу, поскольку в стакане котировок сверху указаны котировки на продажу. Вывод значений в окно таблицы «Стакан котировок» будем осуществлять с помощью цикла. Для цикла нам потребуется управляющая переменная, создадим ее с именем i_offer и присвоим ей значение количества строк в таблице Table_Offer_Vol.

В цикле мы будем уменьшать переменную i_offer при каждой итерации на единицу, т.е. вывод значений из таблиц Table_Offer_Vol и Table_Offer_Price будет осуществляться с конца в начало. Цикл будет выполняться до того момента пока переменная i_offer больше или равна единице. В тело цикла добавим строки вывода котировок из таблиц Table_Offer_Vol и Table_Offer_Price в окно таблицы «Стакан котировок». В первую колонку будет выводиться объем продажи во вторую цена продажи. В конце цикла увеличим переменную Row на единицу, тем самым, при следующей итерации цикла, значения выведутся в следующую строку окна таблицы, а переменную i_offer уменьшим на единицу, тогда, при следующей итерации цикла, считаются значения из предыдущих строк таблиц Table_Offer_Vol и Table_Offer_Price.

Строка кода 49. В строку Row и колонку 1, в окно таблицы «Стакан котировок», выводится значение объема котировки на продажу.
Строка кода 50. В строку Row и колонку 2, в окно таблицы «Стакан котировок», выводится значение цены котировки на продажу.
Строка кода 51. Переменная управляющая выводом в строки окна таблицы «Стакан котировок» увеличивается на единицу.
Строка кода 52. Переменная управляющая считыванием из таблицы Table_Offer_Vol и таблицы Table_Offer_Price, уменьшается на единицу, поскольку считывание осуществляется с конца таблиц к их началу.

Цикл вывода значений котировок на продажу закончен. Далее выведем значения котировок на покупку.

Создадим управляющую с именем i_bid и присвоим ей значение 1. Для котировок на покупку идет правильный порядок вывода от начала таблиц Table_Bid_Vol и Table_Bid_Price в их конец.

Значение в переменной Row не меняем, поскольку на данный момент в ней хранится номер следующей строки окна таблицы «Стакан котировок». В условии цикла пропишем если i_bid меньше или равно значению количества строк в таблице Table_Bid_Vol, то выполнять цикл. В тело цикла добавим строки вывода значений в окно таблицы «Стакан котировок». В конце цикла увеличим значения переменных Row и i_bid на единицу.

Строка кода 54. Создается переменная, управляющая считыванием строк из таблицы Table_Bid_Vol и таблицы Table_Bid_Price. Считывание осуществляется от самой лучшей к самой худшей котировки на покупку.
Строка кода 55. Цикл выводит котировки на покупку в окно таблицы «Стакан котировок», сразу за лучшей котировкой на продажу.
Строка кода 56. В строку Row и колонку 2, в окне таблицы «Стакан котировок», выводится значение цены котировки на покупку.
Строка кода 57. В строку Row и колонку 3, в окне таблицы «Стакан котировок», выводится значение объема котировки на покупку.
Строка кода 58. Переменная управляющая выводом в строки окна таблицы «Стакан котировок» увеличивается на единицу.
Строка кода 59. Переменная управляющая считыванием из таблицы Table_Bid_Price и таблицы Table_Bid_Vol, увеличивается на единицу.

Цикл для вывода котировок на покупку готов.

Добавим в основной цикл программы паузу выполнения скрипта в сто миллисекунд.

Скрипт торгового робота готов сохраним и запустим его в терминале QUIK.

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

В предыдущих двух примерах мы самостоятельно считывали значения из стакана котировок через определенный интервал времени, равный 100 миллисекунд. В интерпретаторе QLua существует функция обратного вызова, которая автоматически вызывается терминалом QUIK при изменении значений в стакане котировок, функция называется OnQuote(). Параметрами вызова функции являются класс бумаги и ее код.

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

Создадим новый файл скрипта Lua с именем «022 Стакан котировок функция OnQuote.lua». Запишем обязательную функцию OnStop(), ниже создадим переменные, в которые будут записаны значения котировок из стакана.

Строка кода 7. Переменная, в которую будет записан объем лучшей котировки на продажу.
Строка кода 8. Переменная, в которую будет записана цена лучшей котировки на продажу.
Строка кода 9. Переменная, в которую будет записан объем лучшей котировки на покупку.
Строка кода 10. Переменная, в которую будет записана цена лучшей котировки на покупку.
Строка кода 11. Переменная, в которую будет записан объем следующей после лучшей котировки на продажу.
Строка кода 12. Переменная, в которую будет записана цена следующей после лучшей котировки на продажу.
Строка кода 13. Переменная, в которую будет записан объем следующей после лучшей котировки на покупку.
Строка кода 14. Переменная, в которую будет записана цена следующей после лучшей котировки на покупку.
Строка кода 15. Переменная, содержащая код торгового инструмента.

Переменные создаются выше функции OnQuote() и основной функции main(), для того чтобы их значения были видны в обеих функциях.

Далее пропишем функцию обратного вызова OnQuote(). При вызове функции терминал QUIK передает в нее класс бумаги и код бумаги, по которой произошли изменения в стакане котировок. Нам требуется вывести значения из стакана котировок фьючерса SRH8, следовательно, в теле функции OnQuote() необходимо добавить проверку. Являются ли изменения в стакане котировок, по которому терминал QUIK вызвал функцию OnQuote(), изменениями в стакане котировок фьючерса SRH8. Добавим соответствующее условие в тело функции OnQuote().

Строка кода 17. Функция обратного вызова, которая автоматически вызывается терминалом QUIK при изменении значений в стакане котировок.
Строка кода 18. Условие, проверяющее, по какому инструменту произошел вызов функции. Если это нужный нам инструмент, выполняется тело условия.

После того как мы определили, что изменения произошли в стакане котировок фьючерса SRH8. Вызовем функцию getQuoteLevel2() и запишем значения из стакана котировок в таблицу Quotes. Ниже добавим переменные и запишем в них количество котировок на покупку и на продажу.

Строка кода 19. В таблицу Quotes записываются все данные из указанного стакана котировок при помощи функции getQuoteLevel2(), в функцию передаются значения класса бумаги и ее код. Для корректной работы функции стакан котировок должен быть открыт в окне программы QUIK.
Строка кода 20. В переменную записывается количество котировок на продажу.
Строка кода 21. В переменную записывается количество котировок на покупку.

По условию, нам нужно вывести две лучшие котировки на продажу и две лучшие котировки на покупку. Перед тем как обратится к таблице с котировками, добавим условия, проверяющие количество котировок на покупку и на продажу.
Первым пропишем условие для котировок на продажу.

Строка кода 22. Условие проверяет наличие более одной котировки на продажу в стакане котировок.

В теле условия возьмем из таблицы Quotes значения котировок на продажу и запишем их в соответствующие переменные, значения предварительно преобразуем в числовой тип. Лучшая котировка на продажу записана в первой строке таблицы Quotes, поэтому нам понадобятся котировки с индексами 1 и 2.

Строка кода 23. В переменную записывается объем лучшей котировки на продажу.
Строка кода 24. В переменную записывается цена лучшей котировки на продажу.
Строка кода 25. В переменную записывается объем следующей после лучшей котировки на продажу.
Строка кода 26. В переменную записывается цена следующей после лучшей котировки на продажу.

Далее создадим переменную, в которую запишем количество котировок на покупку. Ниже не добавим условие проверяющее наличие котировок на покупки их должно быть более одной. Лучшая котировка на покупку записана в самой последней строке таблицы Quotes. Следовательно, нужно взять последнюю и предпоследнюю строки. В теле условия возьмем из таблицы Quotes значения котировок на покупку и запишем их в соответствующие переменные, значения предварительно преобразуем в числовой тип.

Строка кода 28. Создается переменная, с помощью которой буду считываться значения котировок на покупку. Лучшая котировка на покупку записана в самой последней строке таблицы Quotes. Переменной присваивается количество котировок на покупку.
Строка кода 29. Условие проверяет наличие более одной котировки на покупку в стакане котировок.
Строка кода 30. В переменную записывается объем лучшей котировки на покупку.
Строка кода 31. В переменную записывается цена лучшей котировки на покупку.
Строка кода 32. В переменную записывается объем следующей после лучшей котировки на покупку.
Строка кода 33. В переменную записывается цена следующей после лучшей котировки на покупку.

Код для функции OnQuote() готов. В теле функции считываются необходимые значения котировок.

Далее пропишем основную функцию main(). В теле функции добавим строки кода, создающие окно таблицы «Стакан котировок».

Строки кода с 39 по 45, Вам уже хорошо знакомы, их работа неоднократно рассматривались в предыдущих двух примерах.
В строках кода с 46 по 49 поочередно добавляются строки в окно таблицы «Стакан котировок». В данном случае мы не используем цикл для создания строк, а добавляем их напрямую.

Ниже пропишем цикл, который будет с заданной периодичностью обновлять значения в окне таблицы «Стакан котировок».

Строка кода 51. В строку 2 и колонку 1, в окно таблицы «Стакан котировок», выводится значение объема лучшей котировки на продажу.
Строка кода 52. В строку 2 и колонку 2, в окно таблицы «Стакан котировок», выводится значение цены лучшей котировки на продажу.
Строка кода 53. В строку 3 и колонку 2, в окно таблицы «Стакан котировок», выводится значение цены лучшей котировки на покупку.
Строка кода 54. В строку 3 и колонку 3, в окно таблицы «Стакан котировок», выводится значение объема лучшей котировки на покупку.
Строка кода 56. В строку 1 и колонку 1, в окно таблицы «Стакан котировок», выводится значение объема следующей после лучшей котировки на продажу.
Строка кода 57. В строку 1 и колонку 2, в окно таблицы «Стакан котировок», выводится значение цены следующей после лучшей котировки на продажу.
Строка кода 58. В строку 4 и колонку 2, в окно таблицы «Стакан котировок», выводится значение цены следующей после лучшей котировки на покупку.
Строка кода 59. В строку 4 и колонку 3, в окно таблицы «Стакан котировок», выводится значение объема следующей после лучшей котировки на покупку.

Скрипт торгового робота готов. Сохраним и запустим его в терминале QUIK.

На этом мы закончим работу со стаканом котировок.

Далее предлагаю Вам самостоятельно изучить создание индикаторов на языке Lua. В руководстве к интерпретатору QLua, есть документ под названием «Создание индикаторов технического анализа с помощью скриптов Lua.pdf», в данном документе подробно описано создание индикаторов на примере скользящей средней. Самостоятельное изучение поможет Вам лучше понять материал и потренироваться в чтении чужого кода.

В следующем разделе, будет рассмотрено создание индикаторов на языке Lua.

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

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