Найти тему
Код торгового робота

Выставляем заявку в QUIK через скрипт QLUA

Всем привет!

В прошлом выпуске мы рассмотрели как можно получать данные свечей по какому-либо инструменту.

Теперь мы можем начать программно анализировать их: делать выводы о том идет рост или падение, можно строить различные индикаторы и пр.

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

И в данном выпуске мы рассмотрим как программно выставлять заявку в торговую систему.

За выставление в систему заявки отвечает функция: sendTransaction().

sendTransaction(TABLE transaction)

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

Пример заполнения таблицы входных данных:

transaction = {
ACCOUNT="YY0070001234",
CLIENT_CODE="XXX",
TYPE="M",
TRANS_ID="7",
CLASSCODE="TQBR",
SECCODE="HYDR",
ACTION="NEW_ORDER",
OPERATION="B",
PRICE="0",
QUANTITY="15"
}

А полный перечень возможных позиций в этой таблице очень большой и насчитывает 65 позиций. Я тут приведу только позиции, которые мы будем использовать.

Часть 1
Часть 1
Часть 2
Часть 2

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

Вообще, в полном виде данную таблицу можно посмотреть в помощнике по QUIK (не путайте с помощником по QLUA). Этот помощник располагается также в папке с установленной программой QUIK – файл «info.chm». В нем смотрите раздел 6. «Формат .tri-файла с параметрами транзакций».

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

Давайте уже напишем код для выставления заявки:

function main()
Kod_klienta="10646"; -- нужно поставить свое значение
Torg_schet="NL0011100043"; -- нужно поставить свое значение
CLASS_CODE = "QJSIM" -- Код класса
SEC_CODE = "SBER" -- Код бумаги
podgot={
ACCOUNT=Torg_schet,
CLIENT_CODE=Kod_klienta,
TYPE="L",
TRANS_ID="2",
CLASSCODE=CLASS_CODE,
SECCODE=SEC_CODE,
ACTION="NEW_ORDER",
OPERATION="B",
PRICE="140",
QUANTITY="1"
}
rez=sendTransaction(podgot)
end

Скачать данный код

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

-4

Давайте разберем параметры этой заявки.

Первые два (ACCOUNT, CLIENT_CODE) мы рассматривали ранее и они у нас внесены в переменные.

TYPE="L" – лимитированная заявка. Альтернатива – «M» - в этом случае заявка будет рыночная. То есть будет выставлена по рыночной цене и сразу же будет выполнена.

TRANS_ID="2" – это должно быть любое число, уникальное для каждой сделки. На практике заводится какая-то переменная, которая увеличивается на 1 после каждой заявки. И эта переменная используется в этой строке. Но! Обратите внимание, что в конечном счете это должна быть строка. То есть число, облаченное в кавычки. Тут пригодится встроенная функция tostring(), с помощью которой можно перевести число в строку.

Код класса бумаги и код бумаги (CLASSCODE, SECCODE) мы тоже уже разбирали. И в данном скрипте данные заведены через переменные (CLASS_CODE, SEC_CODE).

ACTION="NEW_ORDER" - такие данные означают, что мы создаем новую заявку.

OPERATION="B" – «В» означает, что мы покупаем. Альтернатива – «S» - продажа.

PRICE="140" – это цена за единицу (в данном случае за одну акцию).

QUANTITY="1" – Это объем в лотах. Обратите внимание, что по SBER в одном лоте 10 акций.

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

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

Для снятия заявки нам потребуется показатель TRANS_ID - Уникальный идентификационный номер заявки. Как его получить мы рассмотрим отдельно в других выпусках.

На сегодня, пожалуй, всё!

Пишите в комментариях - все ли вам понятно. Остались ли вопросы? Получилось ли у Вас запустить этот код?

Всем удачи – всем пока!

⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇

📃 Краткое содержание данного канала.

⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆