Всем привет!
В прошлом выпуске мы рассмотрели как можно получать данные свечей по какому-либо инструменту.
Теперь мы можем начать программно анализировать их: делать выводы о том идет рост или падение, можно строить различные индикаторы и пр.
Однако, перед тем, как мы приступим к этому, я хотел бы завершить рассмотрение встроенных функций 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 позиций. Я тут приведу только позиции, которые мы будем использовать.
Выглядит достаточно громоздко, но, думаю, что в конкретных скриптах будет все понятно.
Вообще, в полном виде данную таблицу можно посмотреть в помощнике по 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
Если запустить этот код, то программа выдаст сообщение, что заявка принята. В моем случае она попала в активные заявки, так как указанная цена была намного ниже других предложений. Это можно увидеть в таблице заявок:
Давайте разберем параметры этой заявки.
Первые два (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 - Уникальный идентификационный номер заявки. Как его получить мы рассмотрим отдельно в других выпусках.
На сегодня, пожалуй, всё!
Пишите в комментариях - все ли вам понятно. Остались ли вопросы? Получилось ли у Вас запустить этот код?
Всем удачи – всем пока!
⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇
📃 Краткое содержание данного канала.
⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆