В этом разделе мы рассмотрим пример отправки email из скрипта Lua. Необходимость отправки email возникает в случаях, если Ваш скрипт работает в Ваше отсутствие возле терминала QUIK. Используя отправку email, с информацией о совершенных действиях, Вы будете в курсе, что происходит в скрипте.

В наше время существует большое количество программ, которые присылают PUSH уведомление на телефон, о приходе нового письма на почту. В своей работе я использую связку Яндекс.Почта и приложение для Android под названием AquaMail. За несколько лет использования, это связка, показала безотказную и быструю работу. Рекомендую попробовать и сравнить с используемыми Вами почтовыми приложениями. Пример отправки email будет рассмотрен для Яндекс.Почта.

В языке Lua существуют функции и библиотеки для отправки email, но работа с ними вызывает немало сложностей. Сложности заключаются в следующем, в стандартном наборе библиотек LuaForWindows отсутствуют библиотека для отправки email и библиотека шифрования SSL, да их можно свободно скачать в Интернете, но далее начинаются сложности по их использованию. При использовании, выше указанных библиотек, необходимо соблюсти точное местоположение их файлов на жестком диске компьютера, причем при создании скрипта в SciTE, файлы должны находиться в одних местах, а при использовании готового скрипта, запущенного в QUIK, файлы должны находиться в других местах. Все это крайне неудобно и существует высокая вероятность ошибки, которая остановит скрипт торгового робота. В нашем примере мы не будем использовать язык Lua для отправки email.

Вместо Lua мы будем использовать язык программирования C#. C# является, так сказать, родным языком для Windows, был разработан инженерами в компании Microsoft как язык разработки приложений для программной платформы Microsoft.NET Framework. Программная платформа Microsoft.NET Framework это среда с помощью, которой выполняются приложения на различных языках программирования, включая C#. Не волнуйтесь, если Вы не знаете C#, в скрипте не будет ничего сложного, строки кода будут снабжены описанием. По большому счету, только для отправки email, Вам нет необходимости досконально понимать работу скрипта, можно использовать этот скрипт как шаблон, просто вносите данные и запускаете в работу.

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

Перед тем как начать создавать приложение на C# необходимо скачать и установить среду разработки, в примере будет использована среда разработки Visual Studio Enterprise 2017, это бесплатная версия Visual Studio от компании Microsoft. Скачаете ее по следующей ссылке. https://www.visualstudio.com/ru/vs/community/ и установите на свой компьютер. В процессе установки Вам будут предложены несколько вариантов, выберете первые два в списке.

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

После установки запустите приложение Visual Studio 2017. Откроется следующее окно.

В главном окне, в пункте «Новый проект» нажмем ссылку «Создать проект…».

Откроется окно «Создание проекта». В левой верхней части выберем Установленные > Visual C# > Классический рабочий стол Windows. В центральной части окна выберем «Консольные приложения (.NET Framework). В нижней части окна заполним поля «Имя», «Расположение» и «Имя решения». Присвоим имя «SendMailSR», в примере будет рассмотрена отправка email из скрипта, который отправляет лимитированную заявку на покупку фьючерса на акции ПАО Сбербанк. Поля «Имя» и «Имя решения» совпадают. Нажмем ОК.

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

Это не совсем тот код, который нам нужен, подкорректируем его.

В строках кода с 1 по 5 прописаны, используемые пространства имен. Например, System.Text пространство имен, содержащее классы для работы с текстом. Удалим не нужные и добавим необходимые.

Строка кода 2. Пространство имен содержит классы для работы с сетью.
Строка кода 3. Пространство имен содержит классы для работы с почтой.
Строка кода 5. В строке создается пространство имен с названием SendMailSR, это область, которая содержит набор связанных объектов.
Строка кода 7. В строке создается класс с именем Program внутри пространства имен SendMailSR.
Строка кода 9. Основная функция (метод) приложения, когда приложение запускается, первым вызывается именно функция (метод) Main.

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

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

Строка кода 11. В строке кода создается одномерный массив с текстовым типом данных и именем text, далее считываются все строки файла по указанной ссылке, каждая строка записывается в отдельную ячейку массива text. В строке, после ссылки на файл, прописано перекодировка прочитанного текста в кодировку «Windows-1251», это необходимо для корректного отображения текста в письме.
Строка кода 12. В строке кода создается переменная с именем CountArray, в которую записывается количество строк в массиве, с помощью метода Length. Нумерация строк в массиве начинается с ноля.
Строка кода 13. В строке кода создается переменная, в которую записывается тема письма.
Строка кода 14. В строке кода создается переменная, в которую записывается последняя строка из массива text. Эта и есть последняя строка из файла, которая будет отправлена в тексте письма. Значение из этой переменной будет отображаться в тексте письма.
Строка кода 15. В строке создается объект с именем msg класса MailMessage. В классе MailMessage описано, как создать email. Для создания email в класс передается сначала почта отправителя (от кого), потом почта получателя (кому), потом тема письма, потом содержание письма. Тема письма прописана в переменной Subject, текст письма прописан в переменной Body.
Строка кода 16. В строке создается объект smtpClient класса SmtpClient. В класс передаются параметры подключения к серверу почты. Сначала указывается адрес почтового сервера, а потом его порт. Для Яндекс.Почта указываем порт именно 587, хотя в официальных настройках, на сайте Яндекс.Почта, указан порт 465, с портом 465 письма не отправляются.
Строка кода 17. В строке кода создается объект класса NetworkCredential и записывается в свойства объекта smtpClient. При создании объекта, в класс NetworkCredential передаются, сначала, логин для входа в почту отправителя, потом пароль для входа в почту отправителя. Для Яндекс.Почта логином будет являться имя почтового ящика до знака @. Например если почтовый ящик с именем 12345@yandex.ru то логином будет 12345.
Строка кода 18. В свойство EnableSsl, объекта smtpClient устанавливается значение true, тем самым включая шифрование SSL, без которого не работает почтовый сервер Яндекс.Почта. Все популярные почтовые сервера используют шифрование SSL.
Строка кода 19. В строке для объекта smtpClient вызывается функция (метод) Send, которая отправляет письмо содержащееся в объекте msg.

Это весь код приложения, который будет считывать последнюю строку из указанного txt файла, и отправлять ее на email.

Далее соберем получившийся код в готовое приложение с расширением exe. Перед тем как собрать приложение введите свои данные местоположения файла, данные отправителя и получателя, и данные для входа в почту, строки кода 11, 15 и 17, соответственно. Теперь необходимо проверить работоспособность кода. Сначала необходимо создать txt файл в указанном месте с указанным именем и добавить в него хотя бы одну строку с любым текстом. Если все готово нажмем кнопку «Пуск» на панели управления в верхней части окна. Если все отработало без ошибок в окне «Вывод» выйдет сообщение.

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

После того так код отработал без ошибок и на указанный email пришло соответствующее письмо соберем код в приложение.

В основном меню выберем пункт «Сборка» далее пункт «Построить SendMailSR».

После нажатия «Построить SendMailSR», в окне «Вывод» появится путь к файлу.

Протестируем готовое приложение. Перейдем в папку с расположением приложения SendMailSR.exe и запустим его, как обычную программу. После того как окно приложения закроется на почту должно прийти письмо.

Из всех файлов в папке с приложением нам потребуется только файл SendMailSR.exe, скопируем его в более подходящую папку, в моем случае это будет следующий путь C:\\Lua\email_SR\SendMailSR.exe.

Отлично! Осталось еще чуть-чуть, и мы сможем отправлять email прямо из терминала QUIK.

Приложение готово, отложим Visual Studio, далее оно не понадобится. Перейдем к скриптам на Lua и терминалу QUIK.

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

Для записи информации о транзакциях, в предыдущих примерах, была создана функция ResTransaction(), именно из этой функции мы и будем запускать приложение SendMailSR.exe. Приложение будет запускаться одной единственной строкой кода с помощью функции os.execute(). Функция os.execute() передает свой параметр в командную строку и запускает его. Т.е. мы передадим в функцию os.execute() путь к файлу SendMailSR.exe, функция os.execute() передаст путь в командную строку и запустит файл. Напомню, командная строка в Windows открывается сочетанием клавиш Win+R.

Создадим новый скрипт Lua с именем «024 Отправка email.lua».

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

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

Строки кода с 7 по 10 это идентификатор транзакции, номер заявки в системе, статус транзакции и информационное сообщение от торговой системы.

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

Далее добавим функцию ResTransaction(), в которой записываются данные в лог файл, в эту функцию мы пропишем вызов функции os.execute(), с помощью которой отправим email.

Посмотрим, что поменялось в нашей функции ResTransaction(). Во-первых обратите внимание на строки кода 29, 34 и 39. В них прописан вызов функции os.execute() единственным параметром ее вызова является путь к файлу SendMailSR.exe.

В строки кода 29, 33 и 38 были добавлены команды на закрытие файла, в который только что была записана строка, это необходимое действие, поскольку, если оставить файл открытым, то приложение SendMailSR.exe не сможет его прочитать. Ранее мы закрывали файл для записи одной строкой, которая находилась в самом конце функции ResTransaction().

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

Строки кода с 43 по 62 отправляют транзакцию на покупку фьючерса SRH8, по лимитированной цене, равной текущая рыночная цена минус 100 пунктов. После получения статуса транзакции или после получения ошибки отправки транзакции, вызывается функция ResTransaction() и мы получаем информацию, в виде письма, на указанные почтовый ящик.

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

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