Выставление и снятие лимиторованной заявки в торговую систему.

С помощью языка Lua в систему QUIK можно отправлять все виды заявок, включая все разновидности стоп-заявок. Заявки в торговую систему QUIK отправляются с помощью специальной функции sendTransaction(). Функция sendTransaction() является мощным инструментом работы с заявками. Все параметры настройки заявок, которые есть в окне «Ввод заявки»

и окне «Стоп-заявка»,

можно настроить с помощью языка Lua. Параметров настройки заявок большое количество, но скорее всего, большая часть из них вам не понадобится. Основную часть параметров мы рассмотрим в течении ближайшего времени, но если какие-то параметры будут пропущены вы всегда сможете обратиться к справочному списку с параметрами заявок. Все параметры заявок указаны в справочном руководстве к терминалу QUIK, файл «6 Работа с другими приложениями.pdf» и в отдельном файле к данному курсу.

С начала мы рассмотрим выставление лимитированной заявки. Для справки, лимитированной заявкой, называется заявка на покупку или продажу по определенной цене. Приступим к написанию кода. Создадим новый скрипт под названием «017 Лимитированная заявка.lua».

Для выставления заявки в торговую систему и отслеживания результата ее исполнения нам потребуется скрипт, который будет выполняться не единожды, а некоторое количество времени. Т.е. терминал QUIK будет многократно проходить все строки кода с заданной периодичностью до того момента пока мы его не остановим кнопкой «Остановить» в окне «Доступные скрипты» или пока из скрипта не придет команда на его остановку. Подобное мы уже делали в разделе «Интерпретатор языка Lua», когда мы рассматривали скрипт «014 Пользовательские таблицы.lua», напомню, там мы выводили в таблицу QUIK параметры фьючерса RIZ7 с интервалом 2 раза в секунду (500 мс.). Скопируем из файла «014 Пользовательские таблицы.lua» первые 5 строк и пропишем основную функцию main.

Напомню, первые 5 строк отвечают за остановку скрипта. Функция OnStop() вызывается терминалом QUIK при нажатии кнопки «Остановить» в окне «Доступные скрипты».

И, так функция sendTransaction().

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

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

В разделе «Таблицы с текстовыми ключами к строкам» мы уже заполняли таблицу, подходящую для использования в функции sendTransaction().

Создадим таблицу с именем LimitOrderBuy, создадим в ней строки с определенными ключами и заполним эти строки значениями.

Рассмотрим подробнее строки таблицы. Строка таблицы с ключом «ACTION» содержит указание, какое действие совершить, «NEW_ORDER» означает выставить новую заявку. Строка «ACTION» может принимать 17 видов значений, часть из них мы будем рассматривать, часть нет, все значения, принимаемые данной строкой, представлены в справочном руководстве к терминалу QUIK, файл «6 Работа с другими приложениями.pdf» и в отдельном файле к данному курсу.

Строка с ключом «ACCOUNT» содержит номер торгового счета в данном примере счет «SPBFUT00000». Номер своего торгового счета Вы можете посмотреть в окне «Ограничения по клиентским счетам», колонка «Торговый счет» или в окне «Клиентский портфель», колонка «Код клиента». Чтобы открыть окна «Клиентский портфель» и «Ограничения по клиентским счетам» воспользуйтесь основным меню терминала QUIK пункт «Создать окно». Если в меню «Создать окно» нет нужных пунктов откройте пункт «Все типы окон…» и выберете необходимые окна.

Строка с ключом «OPERATION» содержит вид операции, покупка «B» или продажа «S».Строка с ключом «CLASSCODE» содержит код класса для бумаги, все фьючерсы имеют код класса «SPBFUT».

Строка с ключом «SECCODE» содержит код инструмента, в данном примере «RIZ7».

Cтрока с ключом «PRICE», содержит цену инструмента, в данном примере tostring(100000). Цена в обязательном порядке должна быть передана в виде строкового значения, поэтому используется преобразование числового значения в строковое. Все параметры, передающиеся в функцию sendTransaction(), должны быть строкового типа. Для теста, выставим цену на покупку значительно ниже, чем текущая рыночная цена.

Строка с ключом «QUANTITY» содержит объем сделки в лотах, в данном примере лот. Тип значения строковый.

Строка с ключом «TRANS_ID» содержит идентификатор транзакции, для примера идентификатор равняется 1. Данный идентификатор должен быть уникальным для всех ваших транзакций. Используя данный идентификатор, мы будем находить номер заявки, который ей присвоила система QUIK, а номер заявки нам потребуется для снятия заявки или проверки ее состояния.
Таблица для отправки заявки в торговую систему готова. Создадим новую переменную с именем Err_Order и вызовем функцию sendTransaction() одновременно передав в нее таблицу LimitOrderBuy.

Разберем строку кода 18. Данной строкой мы вызываем функцию sendTransaction() и передаем в нее таблицу LimitOrderBuy, содержащую параметры заявки. Функция sendTransaction() отправляет транзакцию в торговую систему, если в результате транзакции произошла ошибка, то функция sendTransaction() вернет описание ошибки в переменную Err_Order, если ошибок нет, то переменная Err_Order будет содержать пустую строку.

Пока что не будем запускать скрипт. Для тестирования работы скрипта нам требуется выставить ламинированную заявку и не требуется ее исполнение. Конечно, мы можем вручную прописать значение цены, поставив его ниже текущей цены инструмента, но гораздо познавательнее будет сделать цену заявки расчетную исходя из текущей рыночной цены. Для этого возьмем цену последней сделки из таблицы «Текущие торги» при помощи функции getParamEx() и вычтем из нее определенное значение, например 2000 пунктов. Работу функции getParamEx() мы рассматривали в разделе «Интерпретатор языка Lua для терминала QUIK». Объявим две переменные и присвоим им значения, первая переменная SecCode будет содержать код инструмента, вторая переменная PriceRTSBuy будет содержать цену последней сделки. Переменные объявим выше строки с таблицей LimitOrderBuy.

Далее изменим две строки в таблице с параметрами заявки. Первая это код инструмента (строка кода 15), вместо прямого ввода кода инструмента вставим переменную, содержащую код, вторая вместо фиксированного значения цены вставим расчетное (строка кода 16), а именно из переменной содержащей цену последней сделки вычтем 2000.

Скрипт для заявки на покупку готов, сохраним его.Откроем таблицу заявок в терминале QUIK. Меню «Создать окно» пункт «Заявки». Настроим колонки окна. Нам понадобятся следующие колонки: Номер, Выставлена (время), Бумага, Операция, Счет, Цена, Количество, Комментарий, Состояние, ID транзакции.

Это ознакомительная часть курса, что бы просмотреть полный курс, пожалуйста оплатите подписку, подписка действует 2 года. Помимо доступа к полному тексту курса, предоставляются все коды скриптов и вспомогательные файлы. Первые три раздела предоставляются бесплатно в полном объеме. Всем кто ранее покупал коды скриптов доступ будет предоставлен бесплатно, пожалуйста пришлите запрос с Email на который Вам были направлены коды.