sendTransaction

Функция предназначена для отправки транзакций в торговую систему. Функция отправляет транзакцию на сервер QUIK. В случае ошибки обработки транзакции в терминале QUIK возвращает строку с диагностикой ошибки. В остальных случаях транзакция отправляется на сервер. Результат транзакции можно получить, воспользовавшись функцией обратного вызова OnTransReply. В качестве параметра принимает таблицу, в которой имена и значения полей соответствуют таблице Параметры tri-файла.
ВАЖНО! Для корректной обработки данных числовые значения (цена, количество, идентификатор транзакции и т.д.) должны передаваться в виде строковых значений.
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 - Цена заявки, за единицу инструмента. Обязательный параметр. При выставлении рыночной заявки (TYPE=M) на Срочном рынке FORTS необходимо указывать значение цены – укажите наихудшую (минимально или максимально возможную – в зависимости от направленности), заявка все равно будет исполнена по рыночной цене. Для других рынков при выставлении рыночной заявки укажите 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 - Направление предельного изменения стоп-цены. Используется только при «STOP_ORDER_KIND» = «CONDITION_PRICE_BY_OTHER_SEC». Возможные значения: «<=» или «>=»
LINKED_ORDER_PRICE - Цена связанной лимитированной заявки. Используется только при «STOP_ORDER_KIND» = «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 - Код организации – партнера по внебиржевой сделке Применяется при «ACTION» = «NEW_NEG_DEAL», «ACTION» = «NEW_REPO_NEG_DEAL» или «ACTION» = «NEW_EXT_REPO_NEG_DEAL»
ORDER_KEY - Номер заявки, снимаемой из торговой системы Применяется при «ACTION» = «KILL_ORDER» или «ACTION» = «KILL_NEG_DEAL» или «ACTION» = «KILL_QUOTE»
STOP_ORDER_KEY - Номер стоп-заявки, снимаемой из торговой системы. Применяется только при «ACTION» = «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 - Признак снятия стоп-заявки при частичном исполнении связанной лимитированной заявки. Используется только при «STOP_ORDER_KIND» = «WITH_LINKED_LIMIT_ORDER». Возможные значения: «YES» или «NO»
OFFSET - Величина отступа от максимума (минимума) цены последней сделки. Используется при «STOP_ORDER_KIND» = «TAKE_PROFIT_STOP_ORDER» или «ACTIVATED_BY_ORDER_TAKE_PROFIT_STOP_ORDER»
OFFSET_UNITS - Единицы измерения отступа. Возможные значения:

«PERCENTS» – в процентах (шаг изменения – одна сотая процента),

«PRICE_UNITS» – в параметрах цены (шаг изменения равен шагу цены по данному инструменту)

Используется при «STOP_ORDER_KIND» = «TAKE_PROFIT_STOP_ORDER» или «ACTIVATED_BY_ORDER_TAKE_PROFIT_STOP_ORDER»

SPREAD - Величина защитного спрэда. Используется при «STOP_ORDER_KIND» = «TAKE_PROFIT_STOP_ORDER» или «ACTIVATED_BY_ORDER_TAKE_PROFIT_STOP_ORDER»
SPREAD_UNITS - Единицы измерения защитного спрэда. Возможные значения:

«PERCENTS» – в процентах (шаг изменения – одна сотая процента),

«PRICE_UNITS» – в параметрах цены (шаг изменения равен шагу цены по данному инструменту)

Используется при «STOP_ORDER_KIND» = «TAKE_PROFIT_STOP_ORDER» или «ACTIVATED_BY_ORDER_TAKE_PROFIT_STOP_ORDER»

BASE_ORDER_KEY - Регистрационный номер заявки-условия. Используется при «STOP_ORDER_KIND» = «ACTIVATED_BY_ORDER_SIMPLE_STOP_ORDER» или «ACTIVATED_BY_ORDER_TAKE_PROFIT_STOP_ORDER»
USE_BASE_ORDER_ BALANCE - Признак использования в качестве объема заявки «по исполнению» исполненного количества бумаг заявки-условия. Возможные значения: «YES» или «NO». Используется при «STOP_ORDER_KIND» = «ACTIVATED_BY_ORDER_SIMPLE_STOP_ORDER» или «ACTIVATED_BY_ORDER_TAKE_PROFIT_STOP_ORDER»
ACTIVATE_IF_BASE_ ORDER_PARTLY_FILLED - Признак активации заявки «по исполнению» при частичном исполнении заявки-условия. Возможные значения: «YES» или «NO». Используется при «STOP_ORDER_KIND» = «ACTIVATED_BY_ORDER_SIMPLE_STOP_ORDER» или «ACTIVATED_BY_ORDER_TAKE_PROFIT_STOP_ORDER»
BASE_CONTRACT - Идентификатор базового контракта для фьючерсов или опционов. Обязательный параметр снятия заявок на рынке FORTS
MODE - Режим перестановки заявок на рынке FORTS. Параметр операции «ACTION» = «MOVE_ORDERS» Возможные значения:

«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 - Параметр, который определяет, будет ли загружаться величина КГО при загрузке лимитов из файла:

при USE_KGO=Y – величина КГО загружается.

при USE_KGO=N – величина КГО не загружается

При установке лимита на Срочном рынке Московской Биржи с принудительным понижением (см. п.7.7.2 Раздела 7 «Операции брокера») требуется указать USE_KGO=Y

CHECK_LIMITS - Признак проверки попадания цены заявки в диапазон допустимых цен. Параметр Срочного рынка FORTS. Необязательный параметр транзакций установки новых заявок по классам «Опционы ФОРТС» и «РПС: Опционы ФОРТС». Возможные значения: «YES» – выполнять проверку, «NO» – не выполнять
MATCHREF - Ссылка, которая связывает две сделки РЕПО или РПС. Сделка может быть заключена только между контрагентами, указавшими одинаковое значение этого параметра в своих заявках. Параметр представляет собой произвольный набор символов (допускаются цифры и буквы количеством до 10). Необязательный параметр
CORRECTION - Режим корректировки ограничения по фьючерсным счетам. Возможные значения:

«Y» – включен, установкой лимита изменяется действующее значение,

«N» – выключен (по умолчанию), установкой лимита задается новое значение


Примеры:

  • 5
-- Пример отправки рыночной заявки

-- Код класса
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