Всем привет!
Сегодня хотел бы показать вам как можно внутри скрипта на QLUA перебирать разные инструменты (акции, фьючерсы и пр.). Например, Вы хотите просмотреть графики по разным бумагам и найти там какую-нибудь фигуру или заглянуть в стакан каждой бумаги и по каким-то своим правилам сделать заявку (или просто сделать какой-то вывод). Если вы внимательно читали все статьи на данном канале и разбирали написанный код, то такой прием как перебор инструментов я применял при анализе паттернов «падающая звезда» и «молот». С функциональной точки зрения, я ничего нового не покажу. Все будет работать также. Но, вот я покажу как работу со списками можно элегантно оформить. Так, чтобы удобно было работать со списком – не ковыряясь в коде и исправляя значения, а просто заполнив таблицу в Эксель и нажав кнопку. Наверняка, на этом моменте вы поняли, что мы выйдем за пределы использования языка QLUA и воспользуемся возможностями написания формул в Excel и немного окунемся в написание макросов на VBA (Visual Basic for Application). Но все будет не слишком сложно.
Итак, поехали. 🚀
Для начала напомним принцип перебора. Создаем массив stock_name, в котором индексы будут идти подряд от 1 и далее, а значениями в данном массиве будут коды бумаг («SBER», «ROSN» и пр.). Далее мы создаем массив stock_code, в котором в качестве индекса будем использовать код бумаги («SBER», «ROSN» и пр.), а значением будет код класса бумаги (если работаем на реальном счете с акциями, то это будет «TQBR»). И, аналогично массиву «stock_code» можно создать много других нужных нам массивов с нужными значениями. Например, создадим массив stock_count в котом в качестве индекса будет код бумаги, а значением будет количество лотов которыми мы будем работать по этой бумаге. И, например, создадим еще массив stock_price, индекс тут будет также код бумаги, а значение – какая-то цена, нужная нам для наших целей. Так можно создать много массивов.
Отдельно о таком подходе я рассказывал в статье о замене объектно-ориентированного программирования в LUA.
Давайте посмотрим на такой код:
function main()
init() -- запускаем функцию с инициализацией исходных данных.
for key_stock, name_stock in pairs(stock_name) do -- цикл для прохода по всем бумагам.
message("Работаем с инструментом: "..stock_name[key_stock]);
message("Количество лотов для работы: "..stock_count[name_stock]);
message("Цена по инструменту для работы: "..stock_price[name_stock]);
message("========================");
end
end
function init() -- функция инициализирует исходные данные в виде задания глобальных переменных.
stock_name = {} -- массив с названиями бумаг по которым будем работать.
stock_code = {} -- массив с кодами бумаг по которым будем работать.
stock_count = {} -- массив с указанием количества лотов по которым будем работать.
stock_price = {} -- массив с указанием какой-то цены по конкретному инструменту.
local i = 1 -- локальный счетчик для заполнения массивов
prom="SBER"; stock_name[i]=prom; stock_code[prom]="TQBR"; stock_count[prom]=10; stock_price[prom]=265; i = i +1;
prom="ROSN"; stock_name[i]=prom; stock_code[prom]="TQBR"; stock_count[prom]=8; stock_price[prom]=520; i = i +1;
prom="TATN"; stock_name[i]=prom; stock_code[prom]="TQBR"; stock_count[prom]=7; stock_price[prom]=542; i = i +1;
prom="RTKM"; stock_name[i]=prom; stock_code[prom]="TQBR"; stock_count[prom]=15; stock_price[prom]=77; i = i +1;
prom="MGNT"; stock_name[i]=prom; stock_code[prom]="TQBR"; stock_count[prom]=20; stock_price[prom]=5660; i = i +1;
end
В функции init() инициированы обозначенные массивы и заполнены значениями по пяти акциям. При этом одна строка соответствует внесению данных по одной акции.
В основной части скрипта main() после запуска инициализации и заполнения массивов осуществляется просто проход по массиву с кодами бумаг и выдача данных из массивов. Тут уже можно обрабатывать инструменты как посчитаем нужным. Но, в данной статье мы рассматриваем только процесс перебора бумаг.
Если запустить такой скрипт, то в таблице сообщений будет следующее:
Итак, перебор работает. Можно заканчивать статью.
Но, я уже наобещал более интересных вещей. Поэтому продолжим.
В нашем тестовом скрипте все просто – всего пять бумаг, и функционал основной части скрипта не сильно разнообразный. А, что если у нас будет не пять, а двести пять бумаг, и сам скрипт будет содержать множество функций и реализовывать сложную логику? В этом случае не так просто будет редактировать список бумаг, держа в голове наименования массивов, значения какие необходимо поставить, соблюдать правильность написания кода и пр.
Для упрощения корректировки списка бумаг эту часть можно вынести в отдельный файл. Как работать с файлами, я рассказывал в отдельной статье.
Давайте создадим отдельный файл с названием «stocks.lua» и запишем в него строки, вносящие данные в массивы, то есть эти:
prom="SBER"; stock_name[i]=prom; stock_code[prom]="TQBR"; stock_count[prom]=10; stock_price[prom]=265; i = i +1;
prom="ROSN"; stock_name[i]=prom; stock_code[prom]="TQBR"; stock_count[prom]=8; stock_price[prom]=520; i = i +1;
prom="TATN"; stock_name[i]=prom; stock_code[prom]="TQBR"; stock_count[prom]=7; stock_price[prom]=542; i = i +1;
prom="RTKM"; stock_name[i]=prom; stock_code[prom]="TQBR"; stock_count[prom]=15; stock_price[prom]=77; i = i +1;
prom="MGNT"; stock_name[i]=prom; stock_code[prom]="TQBR"; stock_count[prom]=20; stock_price[prom]=5660; i = i +1;
А рабочем скрипте на их месте напишем такую строку:
dofile ("stocks.lua") -- из этого файла загружаются данные по которым будем работать.
Оба файла должны лежать рядом. И еще важный момент: переменная «i» в функции init() теперь должна быть не локальной.
🧐 Посмотреть код файла «stocks.lua»
🧐 Посмотреть код файла «perebor2.lua»
Теперь управлять списком проще, но мы продолжим…
Давайте в Excel создадим такую таблицу:
Я в данной таблице создал такие же колонки с данными, которые использовал в написанных скриптах. Если Вам необходимы дополнительные данные, то нужно добавить соответствующие колонки. Количество строк должно быть такое, что бы Вам хватило перечислить все нужные Вам инструменты.
Теперь у нас следующая задача: на отдельном листе (пусть он называется «код») нужно написать такие формулы, что бы каждая строка таблицы с помощью этих формул создавала отдельную строку для файла «stocks.lua». Для этих целей нам потребуется две функции Excel: ЕСЛИ и СЦЕПИТЬ.
Итак, создаем новый лист Эксель, и там в поле A2 или A1 пишем такую формулу:
=СЦЕПИТЬ("prom=";"'";таблица!RC;"';";"stock_name[i]=prom; stock_code[prom]=";"'";таблица!RC[1];"'; stock_count[prom]=";таблица!RC[2];"; stock_price[prom]=";таблица!RC[3];"; i = i +1; ")
Или такую:
=СЦЕПИТЬ("prom=";"'";таблица!B2;"';";"stock_name[i]=prom; stock_code[prom]=";"'";таблица!C2;"'; stock_count[prom]=";таблица!D2;"; stock_price[prom]=";таблица!E2;"; i = i +1; ")
Это зависит от того какой тип ссылок у Вас настроен. Если колонки пронумерованы, то нужно использовать первую формулу, если колонки обозначены латинскими буквами – то вторую.
Если все получилось правильно, то данная формула сформирует строку для файла «stocks.lua» для одного инструмента. Если ячейку с данной формулой скопировать ниже, то получим такое:
Первые пять сток сформировали нужную нам информацию, но последующие пытаются из пустых строк сделать данные. Нам это не нужно. Поэтому давайте немного трансформируем формулу, воспользовавшись функцией ЕСЛИ. Суть такая, если в строке на месте кода будет пусто, то и строка будет выдавать пустоту. Иначе выдаст то, что должно выдать.
Формула будет следующей:
=ЕСЛИ(таблица!RC[1]="";"";СЦЕПИТЬ("prom=";"'";таблица!RC[1];"';";"stock_name[i]=prom; stock_code[prom]=";"'";таблица!RC[2];"'; stock_count[prom]=";таблица!RC[3];"; stock_price[prom]=";таблица!RC[4];"; i = i +1; "))
Или такой в зависимости от того, какой тип ссылок у Вас настроен для листа Эксель:
=ЕСЛИ(таблица!B2="";"";СЦЕПИТЬ("prom=";"'";таблица!B2;"';";"stock_name[i]=prom; stock_code[prom]=";"'";таблица!C2;"'; stock_count[prom]=";таблица!D2;"; stock_price[prom]=";таблица!E2;"; i = i +1; "))
После этого на листе будут формироваться нужные нам строки для файла «stocks.lua»:
Теперь мы можем заполнять таблицу нужными нам данными, копировать строки с листа «код», вставлять в файл «stocks.lua» и сохранять его. И все будет работать.
Но, раз уж мы занимаемся программизмом, то давайте это делать рьяно и по-взрослому. 😂
Давайте теперь дополним файл Excel макросом, который будет сам данные из листа «код» записывать в нужный нам файл.
Для начала давайте сохраним файл Excel. И сделать это необходимо не абы как, а в формате «.xlsm». Это позволит сохранять в этом файле написанные макросы. И сохранить этот файл лучше рядом с файлом «stocks.lua».
Далее давайте делать следующее: Если у Вас в Эксель в меню нет позиции «Разработчик», то нужно ее добавить. Для этого проходите по пути «Файл»-«Параметры»-«Настроить ленту» и выделяем вкладку «Разработчик».
Теперь давайте запишем какой-нибудь макрос. Не важно какой – все равно его код мы будем править.
Проходим в меню в позицию «Разработчик», нажимаем записать макрос. Во всплывающем меню ничего не правим.
Теперь делаем какие-нибудь действия, например, перейдем на лист «код». После этого в меню нажимаем «Остановить запись».
Дальше нажимаем на иконку «макросы»
И в открывшемся окне, выбираем Макрос1 и жмем «изменить».
Откроется окно с кодом записанного макроса:
Этот код нам нужно изменить на следующий:
Sub Макрос1()
'
' Макрос1 Макрос
'
'
Sheets("код").Select
i = 1
pathForFile = ThisWorkbook.Path & "\stocks.lua"
Open pathForFile For Output As #1
While (i < 200)
Adress = "a" & i
Range(Adress).Select
Print #1, ActiveCell.Text
i = i + 1
Wend
Close #1 ' Close file.
Sheets("таблица").Select
End Sub
Я не буду подробно разбирать этот код. Как Вы понимаете, данные с листа «код» записываются в файл «stocks.lua»
Для полной красоты давайте на листе «таблица» создадим кнопку при нажатии на которую данный скрипт будет запускаться.
В позиции меню «Разработчик» выбираем «Вставить» и выбираем элемент управления «Кнопка»
Во всплывшем меню выбираем наш макрос.
Текст на кнопке можно отредактировать и отформатировать.
Теперь при нажатии на кнопку запускается макрос и в файл «stocks.lua» записываются данные для обхода по инструментам. Теперь можно запускать основной скрипт.
Вот такой подход я хотел показать в этой статье.
💾 Скачать файл Эксель можно по этой ссылке.
💾 Скачать все файлы (скрипт, список бумаг и файл Эксель).
Спасибо за внимание. Всем удачи – всем пока.🖐
Если будут вопросы – пишите, обсудим.
⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇
📃 Краткое содержание данного канала.
➖➖➖➖➖➖➖➖➖➖➖➖➖
Landingcentr.ru - разработка сайтов для малого и среднего бизнеса.
⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆