Найти в Дзене
Код торгового робота

Снимаем заявку с помощью QLUA. Проходимся по таблицам.

Всем привет!

В прошлом выпуске мы познакомились с командой sendTransaction() с помощью которой выставили заявку в QUIK. В том выпуске я говорил, что снятие ранее выставленной заявки так же выполняется этой командой, но для этого нам необходимо знать номер заявки в системе. Этот номер присваивает сама система. Сегодня я покажу как программно получить данный номер. Но, на самом деле, этот процесс (нахождение номера в таблице заявок) является частным случаем прохождения по таблице. Таким образом можно изымать из любых таблиц QUIK практически любую информацию. Но, давайте обо всем по порядку.

Давайте для начала выставим любым способом несколько заявок, несколько заявок из ранее выставленных снимем и несколько заявок выставим так что бы они исполнились.

Я провел несколько обозначенных действий, и меня теперь таблица заявок выглядит так.

-2

Давайте программно снимем активную заявку по Сбербанк-п.

Первое, что нам нужно сделать получить данные из этой таблицы. Таблица заявок имеет свое имя – orders. Это обозначено в помощнике по QLUA. А вот весь перечень таблиц, к которым мы можем получить доступ.

-3

В свою очередь также в справке по QLUA приведены колонки каждой из этих таблиц. В нашем случае у таблицы «orders» есть следующие позиции:

-4

Это не вся таблица. Всего в таблице 71 показатель. Подробно можно посмотреть в справке (по поиску «Описание параметров Таблицы заявок»).

Нам нужно найти order_num.

При этом нам нужно получить активную заявку на покупку. А эта информация зашита в переменной «flags». Причем это – набор битовых флагов. И что это такое показывает следующая расшифровка:

-5

По сути это означает, что в одной переменной зашито сразу несколько – активная ли заявка, исполнена ли она, на продажу она или на покупку и пр.

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

(bit.band(order_find.flags, 0x1)==1)) – Если данное условие верно, то заявка активна.

Проверка на факт того, что заявка на покупку проверяется так:

(bit.band(order_find.flags, 0x4)~=4) – Если данное условие верно, то заявка на покупку.

Таким образом, алгоритм у нас такой: загружаем таблицу заявок. Читаем ее по строкам. Каждую строку проверяем – по нужному ли она инструменту, активна ли она и на покупку она или нет. Если все условия совпадают, то мы запоминаем номер данной заявки.

Потом, имея номер заявки, направляем задание на снятие данной заявки.

Код этого скрипта выглядит так:

function main()
Kod_klienta="11006"; -- нужно поставить свое значение
Torg_schet="NL0011100043"; -- нужно поставить свое значение
CLASS_CODE = "QJSIM" -- Kод класса
SEC_CODE = "SBERP" -- Kод бумаги
trans_id = 9;
razmer_orders=getNumberOf("orders"); -- получаем количество записей в таблице заявок.
num_order = 0; -- устанавливаем номер в торговой системе равный 0. Потом будем искать нужную заявку и сюда запишем ее номер, если найдем.
for f=0,razmer_orders-1 do -- Начинаем проходить по каждой позиции таблицы.
order_find=getItem("orders",f); -- получаем очередную запись.
if ((order_find.sec_code==SEC_CODE)and(bit.band(order_find.flags, 0x4)~=4)and(bit.band(order_find.flags, 0x1)==1))then
--Нашли заявку по нужной бумаге, на покупку, активную заявку
num_order=order_find.order_num--Номер заявки в торговой системе
end
end
message("Номер заявки в торговой системе - "..num_order);
sleep(100);
--Теперь готовим данные для снятия заявки в системе.
if (num_order > 0) then -- Если что-то нашли и номер заявки узнали, то выполняем снятие этой заявки.
podgot={
ACCOUNT=tostring(Torg_schet),
CLIENT_CODE=tostring(Kod_klienta),
TYPE="L",
TRANS_ID=tostring(trans_id),
CLASSCODE=CLASS_CODE,
SECCODE=SEC_CODE,
ACTION="KILL_ORDER", -- Это значение указывает, что мы снимаем заявку.
ORDER_KEY=tostring(num_order) -- указываем номер, который ранее нашли.
}
sendTransaction(podgot) -- выполняем удаление заявки
end
end

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

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

Попробуйте запустить данный код (не забудьте в начале скрипта указать данные своего торгового счета и код клиента. Где получить эти данные я рассказывал в выпуске ранее(здесь).)

Если все хорошо, то система выдаст нам сообщение:

-6

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

На сегодня всё!

Пишите в комментариях получилось ли у вас запустить данный скрипт и все ли программа выполнила.

Дальше будет интереснее. Не забудьте подписаться!

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

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

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

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