send Transaction #
Функция предназначена для отправки транзакций в торговую систему. Функция отправляет транзакцию на сервер QUIK. В случае ошибки обработки транзакции в терминале QUIK возвращает строку с диагностикой ошибки. В остальных случаях транзакция отправляется на сервер. Результат транзакции можно получить с помощью функции обратного вызова OnTransReply.
| Внимание! Для корректной обработки данных числовые значения (цена, количество, идентификатор транзакции и т.д.) должны передаваться в виде строковых значений. |
Формат вызова: #
STRING result sendTransaction(TABLE transaction)
Параметры: #
result – строка, содержащая текст ошибки, если она случилась при обработке транзакции.
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"
}
Дополнительные таблицы: #
Параметры tri-файла #
| Параметр | Тип | Описание |
| CLASSCODE | — | Код класса, по которому выполняется транзакция, например TQBR. Обязательный параметр |
| SECCODE | — | Код инструмента, по которому выполняется транзакция, например SBER |
| ACTION | — | Вид транзакции: «NEW_ORDER» – новая заявка; «NEW_NEG_DEAL» – новая заявка на внебиржевую сделку; «NEW_REPO_NEG_DEAL» – новая заявка на сделку РЕПО; «NEW_EXT_REPO_NEG_DEAL» – новая заявка на сделку РЕПО-М; «NEW_STOP_ORDER» – новая стоп-заявка; «KILL_ORDER» – снять заявку; «KILL_NEG_DEAL» – снять заявку на внебиржевую сделку или РЕПО; «KILL_STOP_ORDER» – снять стоп-заявку; «KILL_ALL_ORDERS» – снять все заявки; «KILL_ALL_STOP_ORDERS» – снять все стоп-заявки; «KILL_ALL_NEG_DEALS» – снять все внебиржевые/РЕПО заявки; «KILL_ALL_FUTURES_ORDERS» – снять все заявки FORTS; «MOVE_ORDERS» – переставить заявки FORTS; «NEW_QUOTE» – новая безадресная заявка; «KILL_QUOTE» – снять безадресную заявку; «NEW_REPORT» – заявка-отчет; «SET_FUT_LIMIT» – новое ограничение по фьючерсному счету |
| FIRM_ID | — | Идентификатор участника торгов (код фирмы) |
| ACCOUNT | — | Номер счета Трейдера. Обязателен при ACTION = KILL_ALL_FUTURES_ORDERS. Чувствителен к регистру |
| CLIENT_CODE | — | 20-ти символьное составное поле, может содержать код клиента и текстовый комментарий. Необязательный параметр |
| TYPE | — | Тип заявки. «L» – лимитированная (по умолчанию), «M» – рыночная |
| MARKET_MAKER_ORDER | — | Признак заявки Маркет-Мейкера: «YES» или «NO». По умолчанию «NO» |
| OPERATION | — | Направление заявки: «S» – продать, «B» – купить. Обязательный параметр |
| EXECUTION_CONDITION | — | Условие исполнения: «PUT_IN_QUEUE» – поставить в очередь; «FILL_OR_KILL» – немедленно или отклонить; «KILL_BALANCE» – снять остаток |
| QUANTITY | — | Количество лотов в заявке. Обязательный параметр |
| REPOVALUE | — | Объем сделки РЕПО-М в рублях |
| START_DISCOUNT | — | Начальное значение дисконта в заявке на сделку РЕПО-М |
| LOWER_DISCOUNT | — | Нижнее предельное значение дисконта в заявке на сделку РЕПО-М |
| UPPER_DISCOUNT | — | Верхнее предельное значение дисконта в заявке на сделку РЕПО-М |
| PRICE | — | Цена заявки за единицу инструмента. Обязательный параметр. Для рыночной заявки на FORTS необходимо указывать наихудшую допустимую цену; для других рынков при TYPE=M укажите PRICE=0 |
| STOPPRICE | — | Стоп-цена. Используется только при ACTION = NEW_STOP_ORDER |
| STOP_ORDER_KIND | — | Тип стоп-заявки: SIMPLE_STOP_ORDER, CONDITION_PRICE_BY_OTHER_SEC, WITH_LINKED_LIMIT_ORDER, TAKE_PROFIT_STOP_ORDER, TAKE_PROFIT_AND_STOP_LIMIT_ORDER, ACTIVATED_BY_ORDER_SIMPLE_STOP_ORDER, ACTIVATED_BY_ORDER_TAKE_PROFIT_STOP_ORDER, ACTIVATED_BY_ORDER_TAKE_PROFIT_AND_STOP_LIMIT_ORDER. Если параметр пропущен – стоп-лимит |
| STOPPRICE_CLASSCODE | — | Класс инструмента условия. Только для STOP_ORDER_KIND = CONDITION_PRICE_BY_OTHER_SEC |
| STOPPRICE_SECCODE | — | Код инструмента условия. Только для STOP_ORDER_KIND = CONDITION_PRICE_BY_OTHER_SEC |
| STOPPRICE_CONDITION | — | Направление предельного изменения стоп-цены: «<=» или «>=» |
| LINKED_ORDER_PRICE | — | Цена связанной лимитированной заявки. Для WITH_LINKED_LIMIT_ORDER |
| EXPIRY_DATE | — | Срок действия стоп-заявки: «GTC», «TODAY» или дата в формате «ГГГГММДД» |
| STOPPRICE2 | — | Цена условия «стоп-лимит» для заявки типа «Тэйк-профит и стоп-лимит» |
| MARKET_STOP_LIMIT | — | Исполнение по рыночной цене при наступлении условия стоп-лимит: «YES»/«NO» |
| MARKET_TAKE_PROFIT | — | Исполнение по рыночной цене при наступлении условия тэйк-профит: «YES»/«NO» |
| IS_ACTIVE_IN_TIME | — | Признак действия заявки в определенном интервале времени: «YES»/«NO» |
| ACTIVE_FROM_TIME | — | Время начала действия в формате «ЧЧММСС» |
| ACTIVE_TO_TIME | — | Время окончания действия в формате «ЧЧММСС» |
| PARTNER | — | Код организации-партнера по внебиржевой сделке |
| ORDER_KEY | — | Номер снимаемой заявки. Для KILL_ORDER, KILL_NEG_DEAL или KILL_QUOTE |
| STOP_ORDER_KEY | — | Номер снимаемой стоп-заявки. Только для KILL_STOP_ORDER |
| TRANS_ID | — | Уникальный идентификационный номер заявки: от 1 до 2 147 483 647 |
| SETTLE_CODE | — | Код расчетов при исполнении внебиржевых заявок |
| PRICE2 | — | Цена второй части РЕПО |
| REPOTERM | — | Срок РЕПО. Параметр сделок РЕПО-М |
| REPORATE | — | Ставка РЕПО, в процентах |
| BLOCK_SECURITIES | — | Признак блокировки бумаг на время РЕПО: «YES»/«NO» |
| REFUNDRATE | — | Ставка фиксированного возмещения при неисполнении второй части РЕПО, в процентах |
| COMMENT | — | Текстовый комментарий заявки. Используется при снятии группы заявок |
| LARGE_TRADE | — | Признак крупной сделки: YES/NO |
| CURR_CODE | — | Код валюты расчетов по внебиржевой сделке, например SUR или USD |
| FOR_ACCOUNT | — | Лицо, от имени и за чей счет регистрируется сделка: OWNOWN, OWNCLI, OWNDUP, CLICLI |
| SETTLE_DATE | — | Дата исполнения внебиржевой сделки |
| KILL_IF_LINKED_ORDER_PARTLY_FILLED | — | Признак снятия стоп-заявки при частичном исполнении связанной лимитированной заявки: YES/NO |
| OFFSET | — | Величина отступа от максимума/минимума цены последней сделки для тэйк-профит заявок |
| OFFSET_UNITS | — | Единицы отступа: PERCENTS или PRICE_UNITS |
| SPREAD | — | Величина защитного спрэда |
| SPREAD_UNITS | — | Единицы защитного спрэда: PERCENTS или PRICE_UNITS |
| BASE_ORDER_KEY | — | Регистрационный номер заявки-условия |
| USE_BASE_ORDER_BALANCE | — | Использовать исполненное количество заявки-условия как объем заявки «по исполнению»: YES/NO |
| ACTIVATE_IF_BASE_ORDER_PARTLY_FILLED | — | Активировать заявку «по исполнению» при частичном исполнении заявки-условия: YES/NO |
| BASE_CONTRACT | — | Идентификатор базового контракта для фьючерсов или опционов. Обязателен при снятии заявок FORTS |
| MODE | — | Режим перестановки заявок FORTS: «0» – количество без изменения; «1» – изменить количества; «2» – при несовпадении новых количеств обе заявки снимаются |
| FIRST_ORDER_NUMBER | — | Номер первой заявки |
| FIRST_ORDER_NEW_QUANTITY | — | Количество в первой заявке |
| FIRST_ORDER_NEW_PRICE | — | Цена в первой заявке |
| SECOND_ORDER_NUMBER | — | Номер второй заявки |
| SECOND_ORDER_NEW_QUANTITY | — | Количество во второй заявке |
| SECOND_ORDER_NEW_PRICE | — | Цена во второй заявке |
| KILL_ACTIVE_ORDERS | — | Снять активные заявки по инструменту. Только при ACTION = NEW_QUOTE: YES/NO |
| NEG_TRADE_OPERATION | — | Направление операции в сделке, подтверждаемой отчетом |
| NEG_TRADE_NUMBER | — | Номер подтверждаемой отчетом сделки |
| VOLUMEMN | — | Лимит открытых позиций при типе лимита «Ден.средства» или «Всего» |
| VOLUMEPL | — | Лимит открытых позиций при типе лимита «Залоговые ден.средства» |
| KFL | — | Коэффициент ликвидности |
| KGO | — | Коэффициент клиентского гарантийного обеспечения |
| USE_KGO | — | Определяет загрузку величины КГО: Y – загружать, N – не загружать |
| CHECK_LIMITS | — | Проверка попадания цены в диапазон допустимых цен для FORTS: YES/NO |
| MATCHREF | — | Ссылка, связывающая две сделки РЕПО или РПС; до 10 цифр/букв. Необязательный параметр |
| CORRECTION | — | Режим корректировки ограничения по фьючерсным счетам: Y – изменить действующее значение, N – задать новое значение |
Примеры: #
-- Пример отправки рыночной заявки
-- Код класса
class_code = "QJSIM"
-- Код бумаги
sec_code = "SBER"
-- Номер счета
account = "NL0011100043"
-- Классы фьючерсов и опционов
FUT_OPT_CLASSES = "FUTUX, OPTUX, SPBOPT, SPBFUT"
-- Уникальное число берется из текущей полной даты и времени.
-- Используется для получения случайного числа
RANDOM_SEED = tonumber(os.date("%Y%m%d%H%M%S"))
function main()
-- Вызываем функцию отправки рыночной заявки на покупку. 1 контракт
local trans_id, trans_msg = send_market("B", 1)
-- Выводим результат в виде сообщени
message("trans_id: " .. tostring(trans_id) .. "; trans_msg: " .. tostring(trans_msg))
end
-- Функция для отравки рыночной заявки
function send_market(direction, volume, comment)
-- отправка рыночной заявки
-- все параметры кроме кода клиента и коментария должны быть не nil
-- если код клиента nil - подлставляем счет
-- Данная функция возвращает 2 параметра
-- 1. ID присвоенный транзакции либо nil если транзакция отвергнута на уровне сервера Квик
-- 2. Ответное сообщение сервера Квик либо строку с параметрами транзакции
if (class_code == nil or sec_code == nil or direction == nil or volume == nil or account == nil) then
return nil, "Can`t send order. Nil parameters."
end
-- Получаем случайное уникальное число для id
local trans_id = random_max()
-- Таблица параметров транзацкии
local transaction={
["TRANS_ID"] = tostring(trans_id),
["ACTION"] = "NEW_ORDER",
["CLASSCODE"] = class_code,
["SECCODE"] = sec_code,
["OPERATION"] = direction,
["TYPE"] = "M",
["QUANTITY"] = string.format("%d", tostring(volume)),
["ACCOUNT"] = account
}
-- Если нет кода клиента, то вместо него подставляем номер счета
if client_code == nil then
transaction.client_code = account
else
transaction.client_code = client_code
end
-- Если это заявка для Фьючерсов
if string.find(FUT_OPT_CLASSES, class_code) ~= nil then
local sign = 0
-- Для покупки
if direction == "B" then
sign = 1
-- Получаем максимальную цену
transaction.price = getParamEx(class_code, sec_code, "pricemax").param_value
-- Если текущая цена 0
if transaction.price == 0 then
-- Берем цену предложения и добавляем 10 шагов
transaction.price = getParamEx(class_code, sec_code, "offer").param_value + 10 * getParamEx(class_code, sec_code, "SEC_PRICE_STEP").param_value
end
else
sign = -1
-- Для продажи берем минимальную цену
transaction.price = getParamEx(class_code, sec_code, "pricemin").param_value
-- Если текущая цена 0
if transaction.price == 0 then
-- Берем цену Bid и отнимаем 10 шагов
transaction.price = getParamEx(class_code, sec_code, "bid").param_value - 10 * getParamEx(class_code, sec_code, "SEC_PRICE_STEP").param_value
end
end
-- Если цена так и не установилась
if transaction.price == 0 then
-- То пытаемся отнять/прибавть 10 шагов к последней известной цене
transaction.price = getParamEx(class_code, sec_code, "last").param_value + sign * 10 * getParamEx(class_code, sec_code, "SEC_PRICE_STEP").param_value
end
-- Форматируем цену
transaction.price = to_price(sec_code, transaction.price, class_code)
else
transaction.price = "0"
end
-- Если комментарий не указан
if comment ~= nil then
transaction.client_code = string.sub(transaction.client_code .. '/' .. tostring(comment), 0, 20)
else
transaction.client_code = string.sub(transaction.client_code, 0, 20)
end
-- Отправляем транзацкию
local res = sendTransaction(transaction)
-- Если незультат не пустой
if res ~= "" then
return nil, res
else
local msg =
"Market order sended sucesfully. Class = " .. class_code ..
" Sec = " .. sec_code ..
" Dir = " .. direction ..
" Vol = " .. volume ..
" Acc = " .. account ..
" Trans_id = " .. trans_id ..
" Price = " .. transaction.price
return trans_id, msg
end
end
function random_max()
-- не принимает параметры и возвращает от 0 до 2147483647 (макс. полож. 32 битное число) подходит нам для транзакций
local res = (16807*(RANDOM_SEED or 137137))%2147483647
RANDOM_SEED = res
return res
end
function to_price(security, value, class)
-- преобразования значения value к цене инструмента правильного ФОРМАТА (обрезаем лишнии знаки после разделителя)
-- Возвращает строку
if (security == nil or value == nil) then return nil end
local scale = getSecurityInfo(class or getSecurityInfo("", security).class_code, security).scale
return string.format("%."..string.format("%d", scale).."f", tonumber(value))
end
