Во время работы терминала QUIK в нем происходят различные события, такие, как приход новой обезличенной сделки, выставление заявки, сработал стоп-ордер и т.п. Для того, чтобы своевременно и определенным образом реагировать на эти события, в скрипте QLua можно использовать функции обратного вызова, которые будут выполнять блок кода, расположенного внутри них, в тот момент, когда это событие произойдет.
Для каждого определенного события есть своя предопределенная разработчиками QLua функция!
Функции OnInit(), main() и OnStop() рассматриваются в статье "База скрипта в QLua(Lua)".
Для использования функций в терминале QUIK должны быть открыты соответствующие им таблицы!
Функция вызывается терминалом QUIK при получении изменений текущей позиции по счету (ТОЛЬКО ДЛЯ БРОКЕРА).
function OnAccountBalance(acc_bal) message("Идентификатор фирмы "..tostring(acc_bal.firmid));-- STRING message("Код бумаги "..tostring(acc_bal.sec_code));-- STRING message("Торговый счет "..tostring(acc_bal.trdaccid));-- STRING message("Счет депо "..tostring(acc_bal.depaccid));-- STRING message("Входящий остаток "..tostring(acc_bal.openbal));-- NUMBER message("Текущий остаток "..tostring(acc_bal.currentpos));-- NUMBER message("Плановая продажа "..tostring(acc_bal.plannedpossell));-- NUMBER message("Плановая покупка "..tostring(acc_bal.plannedposbuy));-- NUMBER message("Контрольный остаток простого клиринга "..tostring(acc_bal.planbal));-- NUMBER Равен входящему остатку минус плановая позиция на продажу, включенная в простой клиринг message("Куплено "..tostring(acc_bal.usqtyb));-- NUMBER message("Продано "..tostring(acc_bal.usqtys));-- NUMBER message("Плановый остаток "..tostring(acc_bal.planned));-- NUMBER Равен текущему остатку минус плановая позиция на продажу message("Плановая позиция после проведения расчетов "..tostring(acc_bal.settlebal));-- NUMBER message("Идентификатор расчетного счета/кода в клиринговой организации "..tostring(acc_bal.bank_acc_id));-- STRING message("Признак счета обеспечения "..tostring(acc_bal.firmuse));-- NUMBER Возможные значения: "0" – для обычных счетов,"1" – для счета обеспечения end; |
function OnAccountBalance(acc_bal) message("Идентификатор фирмы "..tostring(acc_bal.firmid));-- STRING message("Код бумаги "..tostring(acc_bal.sec_code));-- STRING message("Торговый счет "..tostring(acc_bal.trdaccid));-- STRING message("Счет депо "..tostring(acc_bal.depaccid));-- STRING message("Входящий остаток "..tostring(acc_bal.openbal));-- NUMBER message("Текущий остаток "..tostring(acc_bal.currentpos));-- NUMBER message("Плановая продажа "..tostring(acc_bal.plannedpossell));-- NUMBER message("Плановая покупка "..tostring(acc_bal.plannedposbuy));-- NUMBER message("Контрольный остаток простого клиринга "..tostring(acc_bal.planbal));-- NUMBER Равен входящему остатку минус плановая позиция на продажу, включенная в простой клиринг message("Куплено "..tostring(acc_bal.usqtyb));-- NUMBER message("Продано "..tostring(acc_bal.usqtys));-- NUMBER message("Плановый остаток "..tostring(acc_bal.planned));-- NUMBER Равен текущему остатку минус плановая позиция на продажу message("Плановая позиция после проведения расчетов "..tostring(acc_bal.settlebal));-- NUMBER message("Идентификатор расчетного счета/кода в клиринговой организации "..tostring(acc_bal.bank_acc_id));-- STRING message("Признак счета обеспечения "..tostring(acc_bal.firmuse));-- NUMBER Возможные значения: "0" – для обычных счетов,"1" – для счета обеспечения end;
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».
Функция вызывается терминалом QUIK при изменении денежной позиции по счету (ТОЛЬКО ДЛЯ БРОКЕРА).
function OnAccountPosition(acc_pos) message("Идентификатор фирмы "..tostring(acc_pos.firmid));-- STRING message("Код валюты "..tostring(acc_pos.currcode));-- STRING message("Тэг расчетов "..tostring(acc_pos.tag));-- STRING message("Описание "..tostring(acc_pos.description));-- STRING message("Входящий остаток "..tostring(acc_pos.openbal));-- NUMBER message("Текущий остаток "..tostring(acc_pos.currentpos));-- NUMBER message("Плановый остаток "..tostring(acc_pos.plannedpos));-- NUMBER message("Внешнее ограничение по деньгам "..tostring(acc_pos.limit1));-- NUMBER message("Внутреннее (собственное) ограничение по деньгам "..tostring(acc_pos.limit2));-- NUMBER message("В заявках на продажу "..tostring(acc_pos.orderbuy));-- NUMBER message("В заявках на покупку "..tostring(acc_pos.ordersell));-- NUMBER message("Нетто-позиция "..tostring(acc_pos.netto));-- NUMBER message("Плановая позиция "..tostring(acc_pos.plannedbal));-- NUMBER message("Дебит "..tostring(acc_pos.debit));-- NUMBER message("Кредит "..tostring(acc_pos.credit));-- NUMBER message("Идентификатор счета "..tostring(acc_pos.bank_acc_id));-- STRING message("Маржинальное требование на начало торгов "..tostring(acc_pos.margincall));-- NUMBER message("Плановая позиция после проведения расчетов "..tostring(acc_pos.settlebal));-- NUMBER end; |
function OnAccountPosition(acc_pos) message("Идентификатор фирмы "..tostring(acc_pos.firmid));-- STRING message("Код валюты "..tostring(acc_pos.currcode));-- STRING message("Тэг расчетов "..tostring(acc_pos.tag));-- STRING message("Описание "..tostring(acc_pos.description));-- STRING message("Входящий остаток "..tostring(acc_pos.openbal));-- NUMBER message("Текущий остаток "..tostring(acc_pos.currentpos));-- NUMBER message("Плановый остаток "..tostring(acc_pos.plannedpos));-- NUMBER message("Внешнее ограничение по деньгам "..tostring(acc_pos.limit1));-- NUMBER message("Внутреннее (собственное) ограничение по деньгам "..tostring(acc_pos.limit2));-- NUMBER message("В заявках на продажу "..tostring(acc_pos.orderbuy));-- NUMBER message("В заявках на покупку "..tostring(acc_pos.ordersell));-- NUMBER message("Нетто-позиция "..tostring(acc_pos.netto));-- NUMBER message("Плановая позиция "..tostring(acc_pos.plannedbal));-- NUMBER message("Дебит "..tostring(acc_pos.debit));-- NUMBER message("Кредит "..tostring(acc_pos.credit));-- NUMBER message("Идентификатор счета "..tostring(acc_pos.bank_acc_id));-- STRING message("Маржинальное требование на начало торгов "..tostring(acc_pos.margincall));-- NUMBER message("Плановая позиция после проведения расчетов "..tostring(acc_pos.settlebal));-- NUMBER end;
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».
Функция вызывается терминалом QUIK при получении обезличенной сделки (Таблица всех сделок).
function OnAllTrade(alltrade) message("Номер сделки в торговой системе "..tostring(alltrade.trade_num));-- NUMBER message("Набор битовых флагов "..tostring(alltrade.flags));-- NUMBER message("Цена "..tostring(alltrade.price));-- NUMBER message("Количество бумаг в последней сделке в лотах "..tostring(alltrade.qty));-- NUMBER message("Объем в денежных средствах "..tostring(alltrade.value));-- NUMBER message("Накопленный купонный доход "..tostring(alltrade.accruedint));-- NUMBER message("Доходность "..tostring(alltrade.yield));-- NUMBER message("Код расчетов "..tostring(alltrade.settlecode));-- STRING message("Ставка РЕПО (%) "..tostring(alltrade.reporate));-- NUMBER message("Сумма РЕПО "..tostring(alltrade.repovalue));-- NUMBER message("Объем выкупа РЕПО "..tostring(alltrade.repo2value));-- NUMBER message("Срок РЕПО в днях "..tostring(alltrade.repoterm));-- NUMBER message("Код бумаги заявки "..tostring(alltrade.sec_code));-- STRING message("Код класса "..tostring(alltrade.class_code));-- STRING message("Дата и время "..tostring(alltrade.datetime));-- TABLE message("Период торговой сессии "..tostring(alltrade.period));-- NUMBER Возможные значения: "0" – Открытие;"1" – Нормальный;"2" – Закрытие end; |
function OnAllTrade(alltrade) message("Номер сделки в торговой системе "..tostring(alltrade.trade_num));-- NUMBER message("Набор битовых флагов "..tostring(alltrade.flags));-- NUMBER message("Цена "..tostring(alltrade.price));-- NUMBER message("Количество бумаг в последней сделке в лотах "..tostring(alltrade.qty));-- NUMBER message("Объем в денежных средствах "..tostring(alltrade.value));-- NUMBER message("Накопленный купонный доход "..tostring(alltrade.accruedint));-- NUMBER message("Доходность "..tostring(alltrade.yield));-- NUMBER message("Код расчетов "..tostring(alltrade.settlecode));-- STRING message("Ставка РЕПО (%) "..tostring(alltrade.reporate));-- NUMBER message("Сумма РЕПО "..tostring(alltrade.repovalue));-- NUMBER message("Объем выкупа РЕПО "..tostring(alltrade.repo2value));-- NUMBER message("Срок РЕПО в днях "..tostring(alltrade.repoterm));-- NUMBER message("Код бумаги заявки "..tostring(alltrade.sec_code));-- STRING message("Код класса "..tostring(alltrade.class_code));-- STRING message("Дата и время "..tostring(alltrade.datetime));-- TABLE message("Период торговой сессии "..tostring(alltrade.period));-- NUMBER Возможные значения: "0" – Открытие;"1" – Нормальный;"2" – Закрытие end;
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».
Пример практического применения данной функции можно посмотреть в данной статье.
Функция вызывается терминалом QUIK при смене сессии и при выгрузке файла qlua.dll
Функция вызывается перед закрытием терминала QUIK.
function OnClose() -- Здесь можно выполнить какие-то действия перед закрытием end; |
function OnClose() -- Здесь можно выполнить какие-то действия перед закрытием end;
Функция вызывается терминалом QUIK при установлении связи с сервером QUIK.
function OnConnected() -- Здесь можно выполнить какие-то действия end; |
function OnConnected() -- Здесь можно выполнить какие-то действия end;
Функция вызывается терминалом QUIK при получении изменений лимита по бумагам.
-- Флаг поддержания работы скрипта IsRun = true; function main() -- Цикл будет выполнятся, пока IsRun == true while IsRun do sleep(1000); end; end; -- Функция вызывается терминалом QUIK при получении изменений лимита по бумагам function OnDepoLimit(dlimit) message("Код бумаги "..tostring(dlimit.sec_code));-- STRING message("Счет депо "..tostring(dlimit.trdaccid));-- STRING message("Идентификатор фирмы "..tostring(dlimit.firmid));-- STRING message("Код клиента "..tostring(dlimit.client_code));-- STRING message("Входящий остаток по бумагам "..tostring(dlimit.openbal));-- NUMBER message("Входящий лимит по бумагам "..tostring(dlimit.openlimit));-- NUMBER message("Текущий остаток по бумагам "..tostring(dlimit.currentbal));-- NUMBER message("Текущий лимит по бумагам "..tostring(dlimit.currentlimit));-- NUMBER message("Заблокировано на продажу количества лотов "..tostring(dlimit.locked_sell));-- NUMBER message("Заблокированного на покупку количества лотов "..tostring(dlimit.locked_buy));-- NUMBER message("Стоимость ценных бумаг, заблокированных под покупку "..tostring(dlimit.locked_buy_value));-- NUMBER message("Стоимость ценных бумаг, заблокированных под продажу "..tostring(dlimit.locked_sell_value));-- NUMBER message("Цена приобретения "..tostring(dlimit.awg_position_price));-- NUMBER message("Тип лимита "..tostring(dlimit.limit_kind));-- NUMBER Возможные значения: "0" – обычные лимиты, значение не равное "0" – технологические лимиты message("__________"); end; -- Функция вызывается терминалом QUIK при остановке скрипта из диалога управления и при закрытии терминала QUIK function OnStop() -- Останавливает цикл в функции main IsRun = false; end; |
-- Флаг поддержания работы скрипта IsRun = true; function main() -- Цикл будет выполнятся, пока IsRun == true while IsRun do sleep(1000); end; end; -- Функция вызывается терминалом QUIK при получении изменений лимита по бумагам function OnDepoLimit(dlimit) message("Код бумаги "..tostring(dlimit.sec_code));-- STRING message("Счет депо "..tostring(dlimit.trdaccid));-- STRING message("Идентификатор фирмы "..tostring(dlimit.firmid));-- STRING message("Код клиента "..tostring(dlimit.client_code));-- STRING message("Входящий остаток по бумагам "..tostring(dlimit.openbal));-- NUMBER message("Входящий лимит по бумагам "..tostring(dlimit.openlimit));-- NUMBER message("Текущий остаток по бумагам "..tostring(dlimit.currentbal));-- NUMBER message("Текущий лимит по бумагам "..tostring(dlimit.currentlimit));-- NUMBER message("Заблокировано на продажу количества лотов "..tostring(dlimit.locked_sell));-- NUMBER message("Заблокированного на покупку количества лотов "..tostring(dlimit.locked_buy));-- NUMBER message("Стоимость ценных бумаг, заблокированных под покупку "..tostring(dlimit.locked_buy_value));-- NUMBER message("Стоимость ценных бумаг, заблокированных под продажу "..tostring(dlimit.locked_sell_value));-- NUMBER message("Цена приобретения "..tostring(dlimit.awg_position_price));-- NUMBER message("Тип лимита "..tostring(dlimit.limit_kind));-- NUMBER Возможные значения: "0" – обычные лимиты, значение не равное "0" – технологические лимиты message("__________"); end; -- Функция вызывается терминалом QUIK при остановке скрипта из диалога управления и при закрытии терминала QUIK function OnStop() -- Останавливает цикл в функции main IsRun = false; end;
Код бумаги SBER
Счет депо NL0011100043
Идентификатор фирмы NC0011100000
Код клиента 89676
Входящий остаток по бумагам 0
Входящий лимит по бумагам 0
Текущий остаток по бумагам 0
Текущий лимит по бумагам 0
Заблокировано на продажу количества лотов 0
Заблокированного на покупку количества лотов 1
Стоимость ценных бумаг, заблокированных под покупку 83590
Стоимость ценных бумаг, заблокированных под продажу 0
Цена приобретения 0
Тип лимита 0
__________
Код бумаги SBER
Счет депо NL0011100043
Идентификатор фирмы NC0011100000
Код клиента 89676
Входящий остаток по бумагам 0
Входящий лимит по бумагам 0
Текущий остаток по бумагам 0
Текущий лимит по бумагам 0
Заблокировано на продажу количества лотов 0
Заблокированного на покупку количества лотов 0
Стоимость ценных бумаг, заблокированных под покупку 8359
Стоимость ценных бумаг, заблокированных под продажу -1e+050
Цена приобретения 0
Тип лимита -3
__________
Код бумаги SBER
Счет депо NL0011100043
Идентификатор фирмы NC0011100000
Код клиента 89676
Входящий остаток по бумагам 0
Входящий лимит по бумагам 0
Текущий остаток по бумагам 1
Текущий лимит по бумагам 0
Заблокировано на продажу количества лотов 0
Заблокированного на покупку количества лотов 0
Стоимость ценных бумаг, заблокированных под покупку 0
Стоимость ценных бумаг, заблокированных под продажу 0
Цена приобретения 76.68
Тип лимита 0
__________
Код бумаги SBER
Счет депо NL0011100043
Идентификатор фирмы NC0011100000
Код клиента 89676
Входящий остаток по бумагам 0
Входящий лимит по бумагам 0
Текущий остаток по бумагам 0
Текущий лимит по бумагам 0
Заблокировано на продажу количества лотов 0
Заблокированного на покупку количества лотов 0
Стоимость ценных бумаг, заблокированных под покупку 1e+050
Стоимость ценных бумаг, заблокированных под продажу -1e+050
Цена приобретения 0
Тип лимита -3
__________
Код бумаги SBER
Счет депо NL0011100043
Идентификатор фирмы NC0011100000
Код клиента 89676
Входящий остаток по бумагам 0
Входящий лимит по бумагам 0
Текущий остаток по бумагам 1
Текущий лимит по бумагам 0
Заблокировано на продажу количества лотов 0
Заблокированного на покупку количества лотов 0
Стоимость ценных бумаг, заблокированных под покупку 0
Стоимость ценных бумаг, заблокированных под продажу 0
Цена приобретения 76.68
Тип лимита 0
__________
Код бумаги SBER
Счет депо NL0011100043
Идентификатор фирмы NC0011100000
Код клиента 89676
Входящий остаток по бумагам 0
Входящий лимит по бумагам 0
Текущий остаток по бумагам 1
Текущий лимит по бумагам 0
Заблокировано на продажу количества лотов 0
Заблокированного на покупку количества лотов 0
Стоимость ценных бумаг, заблокированных под покупку 0
Стоимость ценных бумаг, заблокированных под продажу 0
Цена приобретения 76.68
Тип лимита 0
[_/su_spoiler]
Код бумаги SBER
Счет депо NL0011100043
Идентификатор фирмы NC0011100000
Код клиента 89676
Входящий остаток по бумагам 0
Входящий лимит по бумагам 0
Текущий остаток по бумагам 1
Текущий лимит по бумагам 0
Заблокировано на продажу количества лотов 1
Заблокированного на покупку количества лотов 0
Стоимость ценных бумаг, заблокированных под покупку 0
Стоимость ценных бумаг, заблокированных под продажу 76450
Цена приобретения 76.68
Тип лимита 0
__________
Код бумаги SBER
Счет депо NL0011100043
Идентификатор фирмы NC0011100000
Код клиента 89676
Входящий остаток по бумагам 0
Входящий лимит по бумагам 0
Текущий остаток по бумагам 0
Текущий лимит по бумагам 0
Заблокировано на продажу количества лотов 0
Заблокированного на покупку количества лотов 0
Стоимость ценных бумаг, заблокированных под покупку 1e+050
Стоимость ценных бумаг, заблокированных под продажу 7645
Цена приобретения 0
Тип лимита -3
__________
Код бумаги SBER
Счет депо NL0011100043
Идентификатор фирмы NC0011100000
Код клиента 89676
Входящий остаток по бумагам 0
Входящий лимит по бумагам 0
Текущий остаток по бумагам 0
Текущий лимит по бумагам 0
Заблокировано на продажу количества лотов 0
Заблокированного на покупку количества лотов 0
Стоимость ценных бумаг, заблокированных под покупку 0
Стоимость ценных бумаг, заблокированных под продажу 0
Цена приобретения 0
Тип лимита 0
__________
Код бумаги SBER
Счет депо NL0011100043
Идентификатор фирмы NC0011100000
Код клиента 89676
Входящий остаток по бумагам 0
Входящий лимит по бумагам 0
Текущий остаток по бумагам 0
Текущий лимит по бумагам 0
Заблокировано на продажу количества лотов 0
Заблокированного на покупку количества лотов 0
Стоимость ценных бумаг, заблокированных под покупку 1e+050
Стоимость ценных бумаг, заблокированных под продажу -1e+050
Цена приобретения 0
Тип лимита -3
__________
Код бумаги SBER
Счет депо NL0011100043
Идентификатор фирмы NC0011100000
Код клиента 89676
Входящий остаток по бумагам 0
Входящий лимит по бумагам 0
Текущий остаток по бумагам 0
Текущий лимит по бумагам 0
Заблокировано на продажу количества лотов 0
Заблокированного на покупку количества лотов 0
Стоимость ценных бумаг, заблокированных под покупку 0
Стоимость ценных бумаг, заблокированных под продажу 0
Цена приобретения 0
Тип лимита 0
__________
Код бумаги SBER
Счет депо NL0011100043
Идентификатор фирмы NC0011100000
Код клиента 89676
Входящий остаток по бумагам 0
Входящий лимит по бумагам 0
Текущий остаток по бумагам 0
Текущий лимит по бумагам 0
Заблокировано на продажу количества лотов 0
Заблокированного на покупку количества лотов 0
Стоимость ценных бумаг, заблокированных под покупку 0
Стоимость ценных бумаг, заблокированных под продажу 0
Цена приобретения 0
Тип лимита 0
[_/su_spoiler]
Из результатов видно, что терминал QUIK при выполнении операций покупки и продажи вызвал данную функцию по 6 раз!!!
При помощи данной функции удобно отслеживать объем и среднюю цену текущей позиции по бумагам. Пример использования данной функции в скрипте:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | -- Флаг поддержания работы скрипта IsRun = true; CurrentPosBalance_SBER = 0; -- Баланс текущей позиции по SBER CurrentPosAveragePrice_SBER = 0; -- Средняя цена текущей позиции по SBER function main() -- Цикл будет выполнятся, пока IsRun == true while IsRun do sleep(1000); end; end; -- Функция вызывается терминалом QUIK при получении изменений лимита по бумагам function OnDepoLimit(dlimit) -- Если изменилась информация по обычному лимиту по SBER if dlimit.limit_kind == 0 and dlimit.sec_code == "SBER" then -- Если изменился баланс текущей позиции по SBER if dlimit.currentbal ~= CurrentPosBalance_SBER then message("Баланс позиции SBER изменился с "..tostring(CurrentPosBalance_SBER).." на "..tostring(dlimit.currentbal)); -- Запоминает новый баланс CurrentPosBalance_SBER = dlimit.currentbal; -- Следовательно изменилась и средняя цена message("Средняя цена позиции SBER изменилась с "..tostring(CurrentPosAveragePrice_SBER).." на "..tostring(dlimit.awg_position_price)); -- Запоминает среднюю цену CurrentPosAveragePrice_SBER = dlimit.awg_position_price; end; end; end; -- Функция вызывается терминалом QUIK при остановке скрипта из диалога управления и при закрытии терминала QUIK function OnStop() -- Останавливает цикл в функции main IsRun = false; end; |
-- Флаг поддержания работы скрипта IsRun = true; CurrentPosBalance_SBER = 0; -- Баланс текущей позиции по SBER CurrentPosAveragePrice_SBER = 0; -- Средняя цена текущей позиции по SBER function main() -- Цикл будет выполнятся, пока IsRun == true while IsRun do sleep(1000); end; end; -- Функция вызывается терминалом QUIK при получении изменений лимита по бумагам function OnDepoLimit(dlimit) -- Если изменилась информация по обычному лимиту по SBER if dlimit.limit_kind == 0 and dlimit.sec_code == "SBER" then -- Если изменился баланс текущей позиции по SBER if dlimit.currentbal ~= CurrentPosBalance_SBER then message("Баланс позиции SBER изменился с "..tostring(CurrentPosBalance_SBER).." на "..tostring(dlimit.currentbal)); -- Запоминает новый баланс CurrentPosBalance_SBER = dlimit.currentbal; -- Следовательно изменилась и средняя цена message("Средняя цена позиции SBER изменилась с "..tostring(CurrentPosAveragePrice_SBER).." на "..tostring(dlimit.awg_position_price)); -- Запоминает среднюю цену CurrentPosAveragePrice_SBER = dlimit.awg_position_price; end; end; end; -- Функция вызывается терминалом QUIK при остановке скрипта из диалога управления и при закрытии терминала QUIK function OnStop() -- Останавливает цикл в функции main IsRun = false; end;
В местах вывода сообщений данного скрипта можно использовать какую-то обработку изменения позиции.
Прим.: при открытии короткой позиции баланс стает со знаком "минус".
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: "Сообщения"->"Системные сообщения"->"Таблица сообщений..."). А также, снимите флажок "Показывать окно сообщений" в меню: "Настройки"->"Основные..."->"Сообщения".
Функция вызывается терминалом QUIK при удалении клиентского лимита по бумагам.
function OnDepoLimitDelete(dlimit_del) message("Код инструмента "..tostring(dlimit_del.sec_code));-- STRING message("Код торгового счета "..tostring(dlimit_del.trdaccid));-- STRING message("Идентификатор фирмы "..tostring(dlimit_del.firmid));-- STRING message("Код клиента "..tostring(dlimit_del.client_code));-- STRING message("Тип лимита "..tostring(dlimit_del.limit_kind));-- NUMBER Возможные значения: "0" – обычные лимиты, значение не равное "0" – технологические лимиты end; |
function OnDepoLimitDelete(dlimit_del) message("Код инструмента "..tostring(dlimit_del.sec_code));-- STRING message("Код торгового счета "..tostring(dlimit_del.trdaccid));-- STRING message("Идентификатор фирмы "..tostring(dlimit_del.firmid));-- STRING message("Код клиента "..tostring(dlimit_del.client_code));-- STRING message("Тип лимита "..tostring(dlimit_del.limit_kind));-- NUMBER Возможные значения: "0" – обычные лимиты, значение не равное "0" – технологические лимиты end;
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».
Функция вызывается терминалом QUIK при отключении от сервера QUIK.
function OnDisconnected() -- Здесь можно выполнить какие-то действия end; |
function OnDisconnected() -- Здесь можно выполнить какие-то действия end;
Функция вызывается терминалом QUIK при получении описания новой фирмы от сервера.
function OnFirm(firm) message("Идентификатор фирмы "..tostring(firm.firmid));-- STRING message("Название класса "..tostring(firm.firm_name));-- STRING message("Статус "..tostring(firm.status));-- NUMBER message("Торговая площадка "..tostring(firm.exchange));-- STRING end; |
function OnFirm(firm) message("Идентификатор фирмы "..tostring(firm.firmid));-- STRING message("Название класса "..tostring(firm.firm_name));-- STRING message("Статус "..tostring(firm.status));-- NUMBER message("Торговая площадка "..tostring(firm.exchange));-- STRING end;
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».
Функция вызывается терминалом QUIK при изменении позиции по срочному рынку (Позиции по клиентским счетам (фьючерсы)).
-- Флаг поддержания работы скрипта IsRun = true; function main() -- Цикл будет выполнятся, пока IsRun == true while IsRun do sleep(1000); end; end; -- Функция вызывается терминалом QUIK при изменении позиции по срочному рынку function OnFuturesClientHolding(fut_pos) message("Идентификатор фирмы "..tostring(fut_pos.firmid));-- STRING message("Торговый счет "..tostring(fut_pos.trdaccid));-- STRING message("Код фьючерсного контракта "..tostring(fut_pos.sec_code));-- STRING message("Тип лимита "..tostring(fut_pos.type));-- STRING Возможные значения: "Основной счет";"Клиентские и дополнительные счета";"Все счета торг. членов";<пусто> message("Входящие длинные позиции "..tostring(fut_pos.startbuy));-- NUMBER message("Входящие короткие позиции "..tostring(fut_pos.startsell));-- NUMBER message("Входящие чистые позиции "..tostring(fut_pos.startnet));-- NUMBER message("Текущие длинные позиции "..tostring(fut_pos.todaybuy));-- NUMBER message("Текущие короткие позиции "..tostring(fut_pos.todaysell));-- NUMBER message("Текущие чистые позиции "..tostring(fut_pos.totalnet));-- NUMBER message("Активные на покупку "..tostring(fut_pos.openbuys));-- NUMBER message("Активные на продажу "..tostring(fut_pos.opensells));-- NUMBER message("Оценка текущих чистых позиций "..tostring(fut_pos.cbplused));-- NUMBER message("Плановые чистые позиции "..tostring(fut_pos.cbplplanned));-- NUMBER message("Вариационная маржа "..tostring(fut_pos.varmargin));-- NUMBER message("Эффективная цена позиций "..tostring(fut_pos.avrposnprice));-- NUMBER message("Стоимость позиций "..tostring(fut_pos.positionvalue));-- NUMBER message("Реально начисленная в ходе клиринга вариационная маржа "..tostring(fut_pos.real_varmargin));-- NUMBER Отображается с точностью до 2 двух знаков. При этом, в поле "varmargin" транслируется вариационная маржа, рассчитанная с учетом установленных границ изменения цены message("Суммарная вариационная маржа по итогам основного клиринга начисленная по всем позициям "..tostring(fut_pos.total_varmargin));-- NUMBER Отображается с точностью до 2 двух знаков message("__________"); end; -- Функция вызывается терминалом QUIK при остановке скрипта из диалога управления и при закрытии терминала QUIK function OnStop() -- Останавливает цикл в функции main IsRun = false; end; |
-- Флаг поддержания работы скрипта IsRun = true; function main() -- Цикл будет выполнятся, пока IsRun == true while IsRun do sleep(1000); end; end; -- Функция вызывается терминалом QUIK при изменении позиции по срочному рынку function OnFuturesClientHolding(fut_pos) message("Идентификатор фирмы "..tostring(fut_pos.firmid));-- STRING message("Торговый счет "..tostring(fut_pos.trdaccid));-- STRING message("Код фьючерсного контракта "..tostring(fut_pos.sec_code));-- STRING message("Тип лимита "..tostring(fut_pos.type));-- STRING Возможные значения: "Основной счет";"Клиентские и дополнительные счета";"Все счета торг. членов";<пусто> message("Входящие длинные позиции "..tostring(fut_pos.startbuy));-- NUMBER message("Входящие короткие позиции "..tostring(fut_pos.startsell));-- NUMBER message("Входящие чистые позиции "..tostring(fut_pos.startnet));-- NUMBER message("Текущие длинные позиции "..tostring(fut_pos.todaybuy));-- NUMBER message("Текущие короткие позиции "..tostring(fut_pos.todaysell));-- NUMBER message("Текущие чистые позиции "..tostring(fut_pos.totalnet));-- NUMBER message("Активные на покупку "..tostring(fut_pos.openbuys));-- NUMBER message("Активные на продажу "..tostring(fut_pos.opensells));-- NUMBER message("Оценка текущих чистых позиций "..tostring(fut_pos.cbplused));-- NUMBER message("Плановые чистые позиции "..tostring(fut_pos.cbplplanned));-- NUMBER message("Вариационная маржа "..tostring(fut_pos.varmargin));-- NUMBER message("Эффективная цена позиций "..tostring(fut_pos.avrposnprice));-- NUMBER message("Стоимость позиций "..tostring(fut_pos.positionvalue));-- NUMBER message("Реально начисленная в ходе клиринга вариационная маржа "..tostring(fut_pos.real_varmargin));-- NUMBER Отображается с точностью до 2 двух знаков. При этом, в поле "varmargin" транслируется вариационная маржа, рассчитанная с учетом установленных границ изменения цены message("Суммарная вариационная маржа по итогам основного клиринга начисленная по всем позициям "..tostring(fut_pos.total_varmargin));-- NUMBER Отображается с точностью до 2 двух знаков message("__________"); end; -- Функция вызывается терминалом QUIK при остановке скрипта из диалога управления и при закрытии терминала QUIK function OnStop() -- Останавливает цикл в функции main IsRun = false; end;
15:19:41 Идентификатор фирмы SPBFUT000000
15:19:41 Торговый счет SPBFUT00136
15:19:41 Код фьючерсного контракта RIM5
15:19:41 Тип лимита 0
15:19:41 Входящие длинные позиции 0
15:19:41 Входящие короткие позиции 0
15:19:41 Входящие чистые позиции 0
15:19:41 Текущие длинные позиции 9
15:19:41 Текущие короткие позиции 8
15:19:41 Текущие чистые позиции 1
15:19:41 Активные на покупку 0
15:19:41 Активные на продажу 0
15:19:41 Оценка текущих чистых позиций 0
15:19:41 Плановые чистые позиции 0
15:19:41 Вариационная маржа -311.71
15:19:41 Эффективная цена позиций 106240
15:19:41 Стоимость позиций -510.32
15:19:41 Реально начисленная в ходе клиринга вариационная маржа -311.71
15:19:41 Суммарная вариационная маржа по итогам основного клиринга начисленная по всем позициям 0
15:19:41 __________
15:20:08 Идентификатор фирмы SPBFUT000000
15:20:08 Торговый счет SPBFUT00136
15:20:08 Код фьючерсного контракта RIM5
15:20:08 Тип лимита 0
15:20:08 Входящие длинные позиции 0
15:20:08 Входящие короткие позиции 0
15:20:08 Входящие чистые позиции 0
15:20:08 Текущие длинные позиции 9
15:20:08 Текущие короткие позиции 8
15:20:08 Текущие чистые позиции 1
15:20:08 Активные на покупку 0
15:20:08 Активные на продажу 0
15:20:08 Оценка текущих чистых позиций 0
15:20:08 Плановые чистые позиции 0
15:20:08 Вариационная маржа -271.32
15:20:08 Эффективная цена позиций 106240
15:20:08 Стоимость позиций -510.32
15:20:08 Реально начисленная в ходе клиринга вариационная маржа -271.32
15:20:08 Суммарная вариационная маржа по итогам основного клиринга начисленная по всем позициям 0
15:20:08 __________
15:21:08 Идентификатор фирмы SPBFUT000000
15:21:08 Торговый счет SPBFUT00136
15:21:08 Код фьючерсного контракта RIM5
15:21:08 Тип лимита 0
15:21:08 Входящие длинные позиции 0
15:21:08 Входящие короткие позиции 0
15:21:08 Входящие чистые позиции 0
15:21:08 Текущие длинные позиции 9
15:21:08 Текущие короткие позиции 8
15:21:08 Текущие чистые позиции 1
15:21:08 Активные на покупку 0
15:21:08 Активные на продажу 0
15:21:08 Оценка текущих чистых позиций 0
15:21:08 Плановые чистые позиции 0
15:21:08 Вариационная маржа -321.27
15:21:08 Эффективная цена позиций 106240
15:21:08 Стоимость позиций -510.32
15:21:08 Реально начисленная в ходе клиринга вариационная маржа -321.27
15:21:08 Суммарная вариационная маржа по итогам основного клиринга начисленная по всем позициям 0
15:21:08 __________
...
...
...
[_/su_spoiler]
15:35:39 Идентификатор фирмы SPBFUT000000
15:35:39 Торговый счет SPBFUT00136
15:35:39 Код фьючерсного контракта RIM5
15:35:39 Тип лимита 0
15:35:39 Входящие длинные позиции 0
15:35:39 Входящие короткие позиции 0
15:35:39 Входящие чистые позиции 0
15:35:39 Текущие длинные позиции 9
15:35:39 Текущие короткие позиции 9
15:35:39 Текущие чистые позиции 0
15:35:39 Активные на покупку 0
15:35:39 Активные на продажу 0
15:35:39 Оценка текущих чистых позиций 0
15:35:39 Плановые чистые позиции 0
15:35:39 Вариационная маржа -150.86
15:35:39 Эффективная цена позиций 106240
15:35:39 Стоимость позиций -510.32
15:35:39 Реально начисленная в ходе клиринга вариационная маржа -150.86
15:35:39 Суммарная вариационная маржа по итогам основного клиринга начисленная по всем позициям 0
15:35:39 __________
15:36:08 Идентификатор фирмы SPBFUT000000
15:36:08 Торговый счет SPBFUT00136
15:36:08 Код фьючерсного контракта RIM5
15:36:08 Тип лимита 0
15:36:08 Входящие длинные позиции 0
15:36:08 Входящие короткие позиции 0
15:36:08 Входящие чистые позиции 0
15:36:08 Текущие длинные позиции 9
15:36:08 Текущие короткие позиции 9
15:36:08 Текущие чистые позиции 0
15:36:08 Активные на покупку 0
15:36:08 Активные на продажу 0
15:36:08 Оценка текущих чистых позиций 0
15:36:08 Плановые чистые позиции 0
15:36:08 Вариационная маржа -80.91
15:36:08 Эффективная цена позиций 106240
15:36:08 Стоимость позиций -510.32
15:36:08 Реально начисленная в ходе клиринга вариационная маржа -80.91
15:36:08 Суммарная вариационная маржа по итогам основного клиринга начисленная по всем позициям 0
15:36:08 __________
15:37:08 Идентификатор фирмы SPBFUT000000
15:37:08 Торговый счет SPBFUT00136
15:37:08 Код фьючерсного контракта RIM5
15:37:08 Тип лимита 0
15:37:08 Входящие длинные позиции 0
15:37:08 Входящие короткие позиции 0
15:37:08 Входящие чистые позиции 0
15:37:08 Текущие длинные позиции 9
15:37:08 Текущие короткие позиции 9
15:37:08 Текущие чистые позиции 0
15:37:08 Активные на покупку 0
15:37:08 Активные на продажу 0
15:37:08 Оценка текущих чистых позиций 0
15:37:08 Плановые чистые позиции 0
15:37:08 Вариационная маржа -81.27
15:37:08 Эффективная цена позиций 106240
15:37:08 Стоимость позиций -510.32
15:37:08 Реально начисленная в ходе клиринга вариационная маржа -81.27
15:37:08 Суммарная вариационная маржа по итогам основного клиринга начисленная по всем позициям 0
15:37:08 __________
...
...
...
[_/su_spoiler]
Из результатов видно, что функция вызывается терминалом QUIK по результату выполнения торговой операции на срочном рынке и раз в минуту, показывая изменения вариационной маржи.
При помощи данной функции удобно отслеживать объем и среднюю цену текущей позиции по бумагам. Пример использования данной функции в скрипте:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | -- Флаг поддержания работы скрипта IsRun = true; CurrentPosBalance_RIM5 = 0; -- Баланс текущей позиции по RIM5 CurrentPosAveragePrice_RIM5 = 0; -- Средняя цена текущей позиции по RIM5 function main() -- Цикл будет выполнятся, пока IsRun == true while IsRun do sleep(1000); end; end; -- Функция вызывается терминалом QUIK при изменении позиции по срочному рынку function OnFuturesClientHolding(fut_pos) -- Если изменилась информация по RIM5 if fut_pos.sec_code == "RIM5" then -- Если изменился баланс текущей позиции по RIM5 if fut_pos.totalnet ~= CurrentPosBalance_RIM5 then message("Баланс позиции RIM5 изменился с "..tostring(CurrentPosBalance_RIM5).." на "..tostring(fut_pos.totalnet)); -- Запоминает новый баланс CurrentPosBalance_RIM5 = fut_pos.totalnet; -- Следовательно изменилась и средняя цена message("Средняя цена позиции RIM5 изменилась с "..tostring(CurrentPosAveragePrice_RIM5).." на "..tostring(fut_pos.avrposnprice)); -- Запоминает среднюю цену CurrentPosAveragePrice_RIM5 = fut_pos.avrposnprice; end; end; end; -- Функция вызывается терминалом QUIK при остановке скрипта из диалога управления и при закрытии терминала QUIK function OnStop() -- Останавливает цикл в функции main IsRun = false; end; |
-- Флаг поддержания работы скрипта IsRun = true; CurrentPosBalance_RIM5 = 0; -- Баланс текущей позиции по RIM5 CurrentPosAveragePrice_RIM5 = 0; -- Средняя цена текущей позиции по RIM5 function main() -- Цикл будет выполнятся, пока IsRun == true while IsRun do sleep(1000); end; end; -- Функция вызывается терминалом QUIK при изменении позиции по срочному рынку function OnFuturesClientHolding(fut_pos) -- Если изменилась информация по RIM5 if fut_pos.sec_code == "RIM5" then -- Если изменился баланс текущей позиции по RIM5 if fut_pos.totalnet ~= CurrentPosBalance_RIM5 then message("Баланс позиции RIM5 изменился с "..tostring(CurrentPosBalance_RIM5).." на "..tostring(fut_pos.totalnet)); -- Запоминает новый баланс CurrentPosBalance_RIM5 = fut_pos.totalnet; -- Следовательно изменилась и средняя цена message("Средняя цена позиции RIM5 изменилась с "..tostring(CurrentPosAveragePrice_RIM5).." на "..tostring(fut_pos.avrposnprice)); -- Запоминает среднюю цену CurrentPosAveragePrice_RIM5 = fut_pos.avrposnprice; end; end; end; -- Функция вызывается терминалом QUIK при остановке скрипта из диалога управления и при закрытии терминала QUIK function OnStop() -- Останавливает цикл в функции main IsRun = false; end;
В местах вывода сообщений данного скрипта можно использовать какую-то обработку изменения позиции.
Прим.: при открытии короткой позиции баланс стает со знаком «минус».
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: "Сообщения"->"Системные сообщения"->"Таблица сообщений..."). А также, снимите флажок "Показывать окно сообщений" в меню: "Настройки"->"Основные..."->"Сообщения".
Функция вызывается терминалом QUIK при получении изменений ограничений по срочному рынку (Ограничения по клиентским счетам).
function OnFuturesLimitChange(fut_limit) message("Идентификатор фирмы "..tostring(fut_limit.firmid));-- STRING message("Торговый счет "..tostring(fut_limit.trdaccid));-- STRING message("Тип лимита "..tostring(fut_limit.limit_type));-- NUMBER Возможные значения: -- "0" – «Денежные средства», -- "1" – «Залоговые денежные средства», -- "2" – «Всего», -- "3" – «Клиринговые рубли», -- "4" – «Клиринговые залоговые рубли», -- "5" – «Лимит открытых позиций на спот-рынке» message("Коэффициент ликвидности "..tostring(fut_limit.liquidity_coef));-- NUMBER message("Предыдущий лимит открытых позиций на спот-рынке "..tostring(fut_limit.cbp_prev_limit));-- NUMBER message("Лимит открытых позиций "..tostring(fut_limit.cbplimit));-- NUMBER message("Текущие чистые позиции "..tostring(fut_limit.cbplused));-- NUMBER message("Плановые чистые позиции "..tostring(fut_limit.cbplplanned));-- NUMBER message("Вариационная маржа "..tostring(fut_limit.varmargin));-- NUMBER message("Накопленный купонный доход "..tostring(fut_limit.accruedint));-- NUMBER message("Текущие чистые позиции (под заявки) "..tostring(fut_limit.cbplused_for_orders));-- NUMBER message("Текущие чистые позиции (под открытые позиции) "..tostring(fut_limit.cbplused_for_positions));-- NUMBER message("Премия по опционам "..tostring(fut_limit.options_premium));-- NUMBER message("Биржевые сборы "..tostring(fut_limit.ts_comission));-- NUMBER message("Коэффициент клиентского гарантийного обеспечения "..tostring(fut_limit.kgo));-- NUMBER message("Валюта, в которой транслируется ограничение "..tostring(fut_limit.currcode));-- STRING message("Реально начисленная в ходе клиринга вариационная маржа "..tostring(fut_limit.real_varmargin));-- NUMBER Отображается с точностью до 2 двух знаков. При этом, в поле «varmargin» транслируется вариационная маржа, рассчитанная с учетом установленных границ изменения цены end; |
function OnFuturesLimitChange(fut_limit) message("Идентификатор фирмы "..tostring(fut_limit.firmid));-- STRING message("Торговый счет "..tostring(fut_limit.trdaccid));-- STRING message("Тип лимита "..tostring(fut_limit.limit_type));-- NUMBER Возможные значения: -- "0" – «Денежные средства», -- "1" – «Залоговые денежные средства», -- "2" – «Всего», -- "3" – «Клиринговые рубли», -- "4" – «Клиринговые залоговые рубли», -- "5" – «Лимит открытых позиций на спот-рынке» message("Коэффициент ликвидности "..tostring(fut_limit.liquidity_coef));-- NUMBER message("Предыдущий лимит открытых позиций на спот-рынке "..tostring(fut_limit.cbp_prev_limit));-- NUMBER message("Лимит открытых позиций "..tostring(fut_limit.cbplimit));-- NUMBER message("Текущие чистые позиции "..tostring(fut_limit.cbplused));-- NUMBER message("Плановые чистые позиции "..tostring(fut_limit.cbplplanned));-- NUMBER message("Вариационная маржа "..tostring(fut_limit.varmargin));-- NUMBER message("Накопленный купонный доход "..tostring(fut_limit.accruedint));-- NUMBER message("Текущие чистые позиции (под заявки) "..tostring(fut_limit.cbplused_for_orders));-- NUMBER message("Текущие чистые позиции (под открытые позиции) "..tostring(fut_limit.cbplused_for_positions));-- NUMBER message("Премия по опционам "..tostring(fut_limit.options_premium));-- NUMBER message("Биржевые сборы "..tostring(fut_limit.ts_comission));-- NUMBER message("Коэффициент клиентского гарантийного обеспечения "..tostring(fut_limit.kgo));-- NUMBER message("Валюта, в которой транслируется ограничение "..tostring(fut_limit.currcode));-- STRING message("Реально начисленная в ходе клиринга вариационная маржа "..tostring(fut_limit.real_varmargin));-- NUMBER Отображается с точностью до 2 двух знаков. При этом, в поле «varmargin» транслируется вариационная маржа, рассчитанная с учетом установленных границ изменения цены end;
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».
Функция вызывается терминалом QUIK при удалении лимита по срочному рынку.
function OnFuturesLimitDelete(lim_del) message("Код торгового счета "..tostring(lim_del.trdaccid));-- STRING message("Тип лимита "..tostring(fut_limit.limit_type));-- STRING end; |
function OnFuturesLimitDelete(lim_del) message("Код торгового счета "..tostring(lim_del.trdaccid));-- STRING message("Тип лимита "..tostring(fut_limit.limit_type));-- STRING end;
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».
Функция вызывается терминалом QUIK при получении изменений по денежному лимиту клиента (Таблица лимитов по денежным средствам).
function OnMoneyLimit(mlimit) message("Код валюты "..tostring(mlimit.currcode));-- STRING message("Тэг расчетов "..tostring(mlimit.tag));-- STRING message("Идентификатор фирмы "..tostring(mlimit.firmid));-- STRING message("Код клиента "..tostring(mlimit.client_code));-- STRING message("Входящий остаток по деньгам "..tostring(mlimit.openbal));-- NUMBER message("Входящий лимит по деньгам "..tostring(mlimit.openlimit));-- NUMBER message("Текущий остаток по деньгам "..tostring(mlimit.currentbal));-- NUMBER message("Текущий лимит по деньгам "..tostring(mlimit.currentlimit));-- NUMBER message("Заблокированное количество "..tostring(mlimit.locked));-- NUMBER message("Стоимость активов в заявках на покупку немаржинальных бумаг "..tostring(mlimit.locked_value_coef));-- NUMBER message("Стоимость активов в заявках на покупку маржинальных бумаг "..tostring(mlimit.locked_margin_value));-- NUMBER message("Плечо "..tostring(mlimit.leverage));-- NUMBER message("Тип лимита "..tostring(mlimit.limit_kind));-- NUMBER Возможные значения: -- "0" – обычные лимиты, -- иначе – технологические лимиты end; |
function OnMoneyLimit(mlimit) message("Код валюты "..tostring(mlimit.currcode));-- STRING message("Тэг расчетов "..tostring(mlimit.tag));-- STRING message("Идентификатор фирмы "..tostring(mlimit.firmid));-- STRING message("Код клиента "..tostring(mlimit.client_code));-- STRING message("Входящий остаток по деньгам "..tostring(mlimit.openbal));-- NUMBER message("Входящий лимит по деньгам "..tostring(mlimit.openlimit));-- NUMBER message("Текущий остаток по деньгам "..tostring(mlimit.currentbal));-- NUMBER message("Текущий лимит по деньгам "..tostring(mlimit.currentlimit));-- NUMBER message("Заблокированное количество "..tostring(mlimit.locked));-- NUMBER message("Стоимость активов в заявках на покупку немаржинальных бумаг "..tostring(mlimit.locked_value_coef));-- NUMBER message("Стоимость активов в заявках на покупку маржинальных бумаг "..tostring(mlimit.locked_margin_value));-- NUMBER message("Плечо "..tostring(mlimit.leverage));-- NUMBER message("Тип лимита "..tostring(mlimit.limit_kind));-- NUMBER Возможные значения: -- "0" – обычные лимиты, -- иначе – технологические лимиты end;
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».
Функция вызывается терминалом QUIK при удалении денежного лимита.
function OnMoneyLimitDelete(mlimit_del) message("Код валюты "..tostring(mlimit_del.currcode));-- STRING message("Тэг расчетов "..tostring(mlimit_del.tag));-- STRING message("Код клиента "..tostring(mlimit_del.client_code));-- STRING message("Идентификатор фирмы "..tostring(mlimit_del.firmid));-- STRING message("Тип лимита "..tostring(mlimit_del.limit_kind));-- NUMBER Возможные значения: -- "0" – обычные лимиты, -- иначе – технологические лимиты end; |
function OnMoneyLimitDelete(mlimit_del) message("Код валюты "..tostring(mlimit_del.currcode));-- STRING message("Тэг расчетов "..tostring(mlimit_del.tag));-- STRING message("Код клиента "..tostring(mlimit_del.client_code));-- STRING message("Идентификатор фирмы "..tostring(mlimit_del.firmid));-- STRING message("Тип лимита "..tostring(mlimit_del.limit_kind));-- NUMBER Возможные значения: -- "0" – обычные лимиты, -- иначе – технологические лимиты end;
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».
Функция вызывается терминалом QUIK при получении внебиржевой заявки (Таблица заявок на внебиржевые сделки).
function OnNegDeal(neg_deals) message("Номер "..tostring(neg_deals.neg_deal_num));-- NUMBER message("Время выставления заявки "..tostring(neg_deals.neg_deal_time));-- NUMBER message("Набор битовых флагов "..tostring(neg_deals.flags));-- NUMBER -- бит 0 (0x1) Заявка активна, иначе – не активна -- бит 1 (0x2) Заявка снята. Если флаг не установлен и значение бита «0» равно «0», то заявка исполнена -- бит 2 (0x4) Заявка на продажу, иначе – на покупку. Данный флаг для сделок и сделок для исполнения определяет направление сделки (BUY/SELL) -- бит 3 (0x8) Заявка лимитированная, иначе – рыночная -- бит 4 (0x10) Разрешить / запретить сделки по разным ценам -- бит 5 (0x20) Исполнить заявку немедленно или снять (FILL OR KILL) -- бит 6 (0x40) Заявка маркет-мейкера. Для адресных заявок – заявка отправлена контрагенту -- бит 7 (0x80) Для адресных заявок – заявка получена от контрагента -- бит 8 (0x100) Снять остаток -- бит 9 (0x200) Айсберг-заявка message("Комментарий "..tostring(neg_deals.brokerref));-- STRING обычно: <код клиента>/<номер поручения> message("Трейдер "..tostring(neg_deals.userid));-- STRING message("Идентификатор дилера "..tostring(neg_deals.firmid));-- STRING message("Трейдер партнера "..tostring(neg_deals.cpuserid));-- STRING message("Код фирмы партнера "..tostring(neg_deals.cpfirmid));-- STRING message("Счет "..tostring(neg_deals.account));-- STRING message("Цена "..tostring(neg_deals.price));-- NUMBER message("Количество "..tostring(neg_deals.qty));-- NUMBER message("Ссылка "..tostring(neg_deals.matchref));-- STRING message("Код расчетов "..tostring(neg_deals.settlecode));-- STRING message("Доходность "..tostring(neg_deals.yield));-- NUMBER message("Купонный процент "..tostring(neg_deals.accruedint));-- NUMBER message("Объем "..tostring(neg_deals.value));-- NUMBER message("Цена выкупа "..tostring(neg_deals.price2));-- NUMBER message("Ставка РЕПО (%) "..tostring(neg_deals.reporate));-- NUMBER message("Ставка возмещения (%) "..tostring(neg_deals.refundrate));-- NUMBER message("ID транзакции "..tostring(neg_deals.trans_id));-- NUMBER message("Код клиента "..tostring(neg_deals.client_code));-- STRING message("Тип ввода заявки РЕПО "..tostring(neg_deals.repoentry));-- NUMBER Возможные значения: -- "Цена1+Ставка"; -- "Ставка+Цена2"; -- "Цена1+Цена2" message("Сумма РЕПО "..tostring(neg_deals.repovalue));-- NUMBER message("Объем выкупа РЕПО "..tostring(neg_deals.repo2value));-- NUMBER message("Срок РЕПО "..tostring(neg_deals.repoterm));-- NUMBER message("Начальный дисконт (%) "..tostring(neg_deals.start_discount));-- NUMBER message("Нижний дисконт (%) "..tostring(neg_deals.lower_discount));-- NUMBER message("Верхний дисконт (%) "..tostring(neg_deals.upper_discount));-- NUMBER message("Блокировка обеспечения "..tostring(neg_deals.block_securities));-- NUMBER («Да»/«Нет») message("Идентификатор пользователя "..tostring(neg_deals.uid));-- NUMBER message("Время снятия заявки "..tostring(neg_deals.withdraw_time));-- NUMBER message("Дата выставления заявки "..tostring(neg_deals.neg_deal_date));-- NUMBER message("Остаток "..tostring(neg_deals.balance));-- NUMBER message("Сумма РЕПО первоначальная "..tostring(neg_deals.origin_repovalue));-- NUMBER message("Количество первоначальное "..tostring(neg_deals.origin_qty));-- NUMBER message("Процент дисконта первоначальный "..tostring(neg_deals.origin_discount));-- NUMBER message("Дата активации заявки "..tostring(neg_deals.neg_deal_activation_date));-- NUMBER message("Время активации заявки "..tostring(neg_deals.neg_deal_activation_time));-- NUMBER message("Встречная безадресная заявка "..tostring(neg_deals.quoteno));-- NUMBER message("Валюта расчетов "..tostring(neg_deals.settle_currency));-- NUMBER message("Код бумаги "..tostring(neg_deals.sec_code));-- STRING message("Код класса "..tostring(neg_deals.class_code));-- STRING message("Идентификатор расчетного счета/кода в клиринговой организации "..tostring(neg_deals.bank_acc_id));-- STRING message("Дата снятия адресной заявки в формате «ГГГГММДД» "..tostring(neg_deals.withdraw_date));-- NUMBER message("Номер предыдущей заявки "..tostring(neg_deals.linkedorder));-- NUMBER Отображается с точностью «0» end; |
function OnNegDeal(neg_deals) message("Номер "..tostring(neg_deals.neg_deal_num));-- NUMBER message("Время выставления заявки "..tostring(neg_deals.neg_deal_time));-- NUMBER message("Набор битовых флагов "..tostring(neg_deals.flags));-- NUMBER -- бит 0 (0x1) Заявка активна, иначе – не активна -- бит 1 (0x2) Заявка снята. Если флаг не установлен и значение бита «0» равно «0», то заявка исполнена -- бит 2 (0x4) Заявка на продажу, иначе – на покупку. Данный флаг для сделок и сделок для исполнения определяет направление сделки (BUY/SELL) -- бит 3 (0x8) Заявка лимитированная, иначе – рыночная -- бит 4 (0x10) Разрешить / запретить сделки по разным ценам -- бит 5 (0x20) Исполнить заявку немедленно или снять (FILL OR KILL) -- бит 6 (0x40) Заявка маркет-мейкера. Для адресных заявок – заявка отправлена контрагенту -- бит 7 (0x80) Для адресных заявок – заявка получена от контрагента -- бит 8 (0x100) Снять остаток -- бит 9 (0x200) Айсберг-заявка message("Комментарий "..tostring(neg_deals.brokerref));-- STRING обычно: <код клиента>/<номер поручения> message("Трейдер "..tostring(neg_deals.userid));-- STRING message("Идентификатор дилера "..tostring(neg_deals.firmid));-- STRING message("Трейдер партнера "..tostring(neg_deals.cpuserid));-- STRING message("Код фирмы партнера "..tostring(neg_deals.cpfirmid));-- STRING message("Счет "..tostring(neg_deals.account));-- STRING message("Цена "..tostring(neg_deals.price));-- NUMBER message("Количество "..tostring(neg_deals.qty));-- NUMBER message("Ссылка "..tostring(neg_deals.matchref));-- STRING message("Код расчетов "..tostring(neg_deals.settlecode));-- STRING message("Доходность "..tostring(neg_deals.yield));-- NUMBER message("Купонный процент "..tostring(neg_deals.accruedint));-- NUMBER message("Объем "..tostring(neg_deals.value));-- NUMBER message("Цена выкупа "..tostring(neg_deals.price2));-- NUMBER message("Ставка РЕПО (%) "..tostring(neg_deals.reporate));-- NUMBER message("Ставка возмещения (%) "..tostring(neg_deals.refundrate));-- NUMBER message("ID транзакции "..tostring(neg_deals.trans_id));-- NUMBER message("Код клиента "..tostring(neg_deals.client_code));-- STRING message("Тип ввода заявки РЕПО "..tostring(neg_deals.repoentry));-- NUMBER Возможные значения: -- "Цена1+Ставка"; -- "Ставка+Цена2"; -- "Цена1+Цена2" message("Сумма РЕПО "..tostring(neg_deals.repovalue));-- NUMBER message("Объем выкупа РЕПО "..tostring(neg_deals.repo2value));-- NUMBER message("Срок РЕПО "..tostring(neg_deals.repoterm));-- NUMBER message("Начальный дисконт (%) "..tostring(neg_deals.start_discount));-- NUMBER message("Нижний дисконт (%) "..tostring(neg_deals.lower_discount));-- NUMBER message("Верхний дисконт (%) "..tostring(neg_deals.upper_discount));-- NUMBER message("Блокировка обеспечения "..tostring(neg_deals.block_securities));-- NUMBER («Да»/«Нет») message("Идентификатор пользователя "..tostring(neg_deals.uid));-- NUMBER message("Время снятия заявки "..tostring(neg_deals.withdraw_time));-- NUMBER message("Дата выставления заявки "..tostring(neg_deals.neg_deal_date));-- NUMBER message("Остаток "..tostring(neg_deals.balance));-- NUMBER message("Сумма РЕПО первоначальная "..tostring(neg_deals.origin_repovalue));-- NUMBER message("Количество первоначальное "..tostring(neg_deals.origin_qty));-- NUMBER message("Процент дисконта первоначальный "..tostring(neg_deals.origin_discount));-- NUMBER message("Дата активации заявки "..tostring(neg_deals.neg_deal_activation_date));-- NUMBER message("Время активации заявки "..tostring(neg_deals.neg_deal_activation_time));-- NUMBER message("Встречная безадресная заявка "..tostring(neg_deals.quoteno));-- NUMBER message("Валюта расчетов "..tostring(neg_deals.settle_currency));-- NUMBER message("Код бумаги "..tostring(neg_deals.sec_code));-- STRING message("Код класса "..tostring(neg_deals.class_code));-- STRING message("Идентификатор расчетного счета/кода в клиринговой организации "..tostring(neg_deals.bank_acc_id));-- STRING message("Дата снятия адресной заявки в формате «ГГГГММДД» "..tostring(neg_deals.withdraw_date));-- NUMBER message("Номер предыдущей заявки "..tostring(neg_deals.linkedorder));-- NUMBER Отображается с точностью «0» end;
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».
Функция вызывается терминалом QUIK при получении внебиржевой сделки для исполнения (Таблица сделок для исполнения).
function OnNegTrade(neg_trade) message("Номер сделки "..tostring(neg_trade.trade_num));-- NUMBER message("Дата торгов "..tostring(neg_trade.trade_date));-- NUMBER message("Дата расчетов "..tostring(neg_trade.settle_date));-- NUMBER message("Набор битовых флагов "..tostring(neg_trade.flags));-- NUMBER -- бит 0 (0x1) Заявка активна, иначе – не активна -- бит 1 (0x2) Заявка снята. Если флаг не установлен и значение бита «0» равно «0», то заявка исполнена -- бит 2 (0x4) Заявка на продажу, иначе – на покупку. Данный флаг для сделок и сделок для исполнения определяет направление сделки (BUY/SELL) -- бит 3 (0x8) Заявка лимитированная, иначе – рыночная -- бит 4 (0x10) Разрешить / запретить сделки по разным ценам -- бит 5 (0x20) Исполнить заявку немедленно или снять (FILL OR KILL) -- бит 6 (0x40) Заявка маркет-мейкера. Для адресных заявок – заявка отправлена контрагенту -- бит 7 (0x80) Для адресных заявок – заявка получена от контрагента -- бит 8 (0x100) Снять остаток -- бит 9 (0x200) Айсберг-заявка message("Комментарий "..tostring(neg_trade.brokerref));-- STRING обычно: <код клиента>/<номер поручения> message("Идентификатор дилера "..tostring(neg_trade.firmid));-- STRING message("Счет депо "..tostring(neg_trade.account));-- STRING message("Код фирмы партнера "..tostring(neg_trade.cpfirmid));-- STRING message("Счет депо партнера "..tostring(neg_trade.cpaccount));-- STRING message("Цена "..tostring(neg_trade.price));-- NUMBER message("Количество "..tostring(neg_trade.qty));-- NUMBER message("Объем "..tostring(neg_trade.value));-- NUMBER message("Код расчетов "..tostring(neg_trade.settlecode));-- STRING message("Отчет "..tostring(neg_trade.report_num));-- NUMBER message("Отчет партнера "..tostring(neg_trade.cpreport_num));-- NUMBER message("Купонный процент "..tostring(neg_trade.accruedint));-- NUMBER message("Номер сделки 1-ой части РЕПО "..tostring(neg_trade.repotradeno));-- NUMBER message("Цена 1-ой части РЕПО "..tostring(neg_trade.price1));-- NUMBER message("Ставка РЕПО (%) "..tostring(neg_trade.reporate));-- NUMBER message("Цена выкупа "..tostring(neg_trade.price2));-- NUMBER message("Код клиента "..tostring(neg_trade.client_code));-- STRING message("Комиссия торговой системы "..tostring(neg_trade.ts_comission));-- NUMBER message("Остаток "..tostring(neg_trade.balance));-- NUMBER message("Время исполнения "..tostring(neg_trade.settle_time));-- NUMBER message("Сумма обязательства "..tostring(neg_trade.amount));-- NUMBER message("Сумма РЕПО "..tostring(neg_trade.repovalue));-- NUMBER message("Срок РЕПО "..tostring(neg_trade.repoterm));-- NUMBER message("Объем выкупа РЕПО "..tostring(neg_trade.repo2value));-- NUMBER message("Сумма возврата РЕПО "..tostring(neg_trade.return_value));-- NUMBER message("Дисконт (%) "..tostring(neg_trade.discount));-- NUMBER message("Нижний дисконт (%) "..tostring(neg_trade.lower_discount));-- NUMBER message("Верхний дисконт (%) "..tostring(neg_trade.upper_discount));-- NUMBER message("Блокировать обеспечение "..tostring(neg_trade.block_securities));-- NUMBER («Да»/«Нет») message("Исполнить "..tostring(neg_trade.urgency_flag));-- NUMBER («Да»/«Нет») message("Тип "..tostring(neg_trade.type));-- NUMBER Возможные значения: -- "0" – «Внесистемная сделка», -- "1" – «Первая часть сделки РЕПО», -- "2" – «Вторая часть сделки РЕПО», -- "3" – «Компенсационный взнос», -- "4" – «Дефолтер: отложенные обязательства и требования», -- "5" – «Пострадавший: отложенные обязательства и требования». message("Направленность "..tostring(neg_trade.operation_type));-- NUMBER Возможные значения: -- "1" – «Зачислить», -- "2" – «Списать». message("Дисконт после взноса (%) "..tostring(neg_trade.expected_discount));-- NUMBER message("Количество после взноса "..tostring(neg_trade.expected_quantity));-- NUMBER message("Сумма РЕПО после взноса "..tostring(neg_trade.expected_repovalue));-- NUMBER message("Стоимость выкупа после взноса "..tostring(neg_trade.expected_repo2value));-- NUMBER message("Сумма возврата после взноса "..tostring(neg_trade.expected_return_value));-- NUMBER message("Номер заявки "..tostring(neg_trade.order_num));-- NUMBER message("Дата заключения "..tostring(neg_trade.report_trade_date));-- NUMBER message("Состояние расчетов по сделке "..tostring(neg_trade.settled));-- NUMBER Возможные значения: -- "1" – «Processed», -- "2" – «Not processed», -- "3" – «Is processing». message("Тип клиринга "..tostring(neg_trade.clearing_type));-- NUMBER Возможные значения: -- "1" – «Not set», -- "2" – «Simple», -- "3" – «Multilateral». message("Комиссия за отчет "..tostring(neg_trade.report_comission));-- NUMBER message("Купонная выплата "..tostring(neg_trade.coupon_payment));-- NUMBER message("Выплата по основному долгу "..tostring(neg_trade.principal_payment));-- NUMBER message("Дата выплаты по основному долгу "..tostring(neg_trade.principal_payment_date));-- NUMBER message("Дата следующего дня расчетов "..tostring(neg_trade.nextdaysettle));-- NUMBER message("Валюта расчетов "..tostring(neg_trade.settle_currency));-- STRING message("Код бумаги "..tostring(neg_trade.sec_code));-- STRING message("Код класса "..tostring(neg_trade.class_code));-- STRING end; |
function OnNegTrade(neg_trade) message("Номер сделки "..tostring(neg_trade.trade_num));-- NUMBER message("Дата торгов "..tostring(neg_trade.trade_date));-- NUMBER message("Дата расчетов "..tostring(neg_trade.settle_date));-- NUMBER message("Набор битовых флагов "..tostring(neg_trade.flags));-- NUMBER -- бит 0 (0x1) Заявка активна, иначе – не активна -- бит 1 (0x2) Заявка снята. Если флаг не установлен и значение бита «0» равно «0», то заявка исполнена -- бит 2 (0x4) Заявка на продажу, иначе – на покупку. Данный флаг для сделок и сделок для исполнения определяет направление сделки (BUY/SELL) -- бит 3 (0x8) Заявка лимитированная, иначе – рыночная -- бит 4 (0x10) Разрешить / запретить сделки по разным ценам -- бит 5 (0x20) Исполнить заявку немедленно или снять (FILL OR KILL) -- бит 6 (0x40) Заявка маркет-мейкера. Для адресных заявок – заявка отправлена контрагенту -- бит 7 (0x80) Для адресных заявок – заявка получена от контрагента -- бит 8 (0x100) Снять остаток -- бит 9 (0x200) Айсберг-заявка message("Комментарий "..tostring(neg_trade.brokerref));-- STRING обычно: <код клиента>/<номер поручения> message("Идентификатор дилера "..tostring(neg_trade.firmid));-- STRING message("Счет депо "..tostring(neg_trade.account));-- STRING message("Код фирмы партнера "..tostring(neg_trade.cpfirmid));-- STRING message("Счет депо партнера "..tostring(neg_trade.cpaccount));-- STRING message("Цена "..tostring(neg_trade.price));-- NUMBER message("Количество "..tostring(neg_trade.qty));-- NUMBER message("Объем "..tostring(neg_trade.value));-- NUMBER message("Код расчетов "..tostring(neg_trade.settlecode));-- STRING message("Отчет "..tostring(neg_trade.report_num));-- NUMBER message("Отчет партнера "..tostring(neg_trade.cpreport_num));-- NUMBER message("Купонный процент "..tostring(neg_trade.accruedint));-- NUMBER message("Номер сделки 1-ой части РЕПО "..tostring(neg_trade.repotradeno));-- NUMBER message("Цена 1-ой части РЕПО "..tostring(neg_trade.price1));-- NUMBER message("Ставка РЕПО (%) "..tostring(neg_trade.reporate));-- NUMBER message("Цена выкупа "..tostring(neg_trade.price2));-- NUMBER message("Код клиента "..tostring(neg_trade.client_code));-- STRING message("Комиссия торговой системы "..tostring(neg_trade.ts_comission));-- NUMBER message("Остаток "..tostring(neg_trade.balance));-- NUMBER message("Время исполнения "..tostring(neg_trade.settle_time));-- NUMBER message("Сумма обязательства "..tostring(neg_trade.amount));-- NUMBER message("Сумма РЕПО "..tostring(neg_trade.repovalue));-- NUMBER message("Срок РЕПО "..tostring(neg_trade.repoterm));-- NUMBER message("Объем выкупа РЕПО "..tostring(neg_trade.repo2value));-- NUMBER message("Сумма возврата РЕПО "..tostring(neg_trade.return_value));-- NUMBER message("Дисконт (%) "..tostring(neg_trade.discount));-- NUMBER message("Нижний дисконт (%) "..tostring(neg_trade.lower_discount));-- NUMBER message("Верхний дисконт (%) "..tostring(neg_trade.upper_discount));-- NUMBER message("Блокировать обеспечение "..tostring(neg_trade.block_securities));-- NUMBER («Да»/«Нет») message("Исполнить "..tostring(neg_trade.urgency_flag));-- NUMBER («Да»/«Нет») message("Тип "..tostring(neg_trade.type));-- NUMBER Возможные значения: -- "0" – «Внесистемная сделка», -- "1" – «Первая часть сделки РЕПО», -- "2" – «Вторая часть сделки РЕПО», -- "3" – «Компенсационный взнос», -- "4" – «Дефолтер: отложенные обязательства и требования», -- "5" – «Пострадавший: отложенные обязательства и требования». message("Направленность "..tostring(neg_trade.operation_type));-- NUMBER Возможные значения: -- "1" – «Зачислить», -- "2" – «Списать». message("Дисконт после взноса (%) "..tostring(neg_trade.expected_discount));-- NUMBER message("Количество после взноса "..tostring(neg_trade.expected_quantity));-- NUMBER message("Сумма РЕПО после взноса "..tostring(neg_trade.expected_repovalue));-- NUMBER message("Стоимость выкупа после взноса "..tostring(neg_trade.expected_repo2value));-- NUMBER message("Сумма возврата после взноса "..tostring(neg_trade.expected_return_value));-- NUMBER message("Номер заявки "..tostring(neg_trade.order_num));-- NUMBER message("Дата заключения "..tostring(neg_trade.report_trade_date));-- NUMBER message("Состояние расчетов по сделке "..tostring(neg_trade.settled));-- NUMBER Возможные значения: -- "1" – «Processed», -- "2" – «Not processed», -- "3" – «Is processing». message("Тип клиринга "..tostring(neg_trade.clearing_type));-- NUMBER Возможные значения: -- "1" – «Not set», -- "2" – «Simple», -- "3" – «Multilateral». message("Комиссия за отчет "..tostring(neg_trade.report_comission));-- NUMBER message("Купонная выплата "..tostring(neg_trade.coupon_payment));-- NUMBER message("Выплата по основному долгу "..tostring(neg_trade.principal_payment));-- NUMBER message("Дата выплаты по основному долгу "..tostring(neg_trade.principal_payment_date));-- NUMBER message("Дата следующего дня расчетов "..tostring(neg_trade.nextdaysettle));-- NUMBER message("Валюта расчетов "..tostring(neg_trade.settle_currency));-- STRING message("Код бумаги "..tostring(neg_trade.sec_code));-- STRING message("Код класса "..tostring(neg_trade.class_code));-- STRING end;
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».
Функция вызывается терминалом QUIK при получении новой заявки или при изменении параметров существующей заявки (Таблица заявок).
function OnOrder(order) message("Номер заявки в торговой системе "..tostring(order.order_num));-- NUMBER message("Набор битовых флагов "..tostring(order.flags));-- NUMBER -- бит 0 (0x1) Заявка активна, иначе – не активна -- бит 1 (0x2) Заявка снята. Если флаг не установлен и значение бита «0» равно «0», то заявка исполнена -- бит 2 (0x4) Заявка на продажу, иначе – на покупку. Данный флаг для сделок и сделок для исполнения определяет направление сделки (BUY/SELL) -- бит 3 (0x8) Заявка лимитированная, иначе – рыночная -- бит 4 (0x10) Разрешить / запретить сделки по разным ценам -- бит 5 (0x20) Исполнить заявку немедленно или снять (FILL OR KILL) -- бит 6 (0x40) Заявка маркет-мейкера. Для адресных заявок – заявка отправлена контрагенту -- бит 7 (0x80) Для адресных заявок – заявка получена от контрагента -- бит 8 (0x100) Снять остаток -- бит 9 (0x200) Айсберг-заявка message("Комментарий "..tostring(order.brokerref));-- STRING обычно: <код клиента>/<номер поручения> message("Идентификатор трейдера "..tostring(order.userid));-- STRING message("Идентификатор фирмы "..tostring(order.firmid));-- STRING message("Торговый счет "..tostring(order.account));-- STRING message("Цена "..tostring(order.price));-- NUMBER message("Количество в лотах "..tostring(order.qty));-- NUMBER message("Остаток "..tostring(order.balance));-- NUMBER message("Объем в денежных средствах "..tostring(order.value));-- NUMBER message("Накопленный купонный доход "..tostring(order.accruedint));-- NUMBER message("Доходность "..tostring(order.yield));-- NUMBER message("Идентификатор транзакции "..tostring(order.trans_id));-- NUMBER message("Код клиента "..tostring(order.client_code));-- STRING message("Цена выкупа "..tostring(order.price2));-- NUMBER message("Код расчетов "..tostring(order.settlecode));-- STRING message("Идентификатор пользователя "..tostring(order.uid));-- NUMBER message("Код биржи в торговой системе "..tostring(order.exchange_code));-- STRING message("Время активации "..tostring(order.activation_time));-- NUMBER message("Номер заявки в торговой системе "..tostring(order.linkedorder));-- NUMBER message("Дата окончания срока действия заявки "..tostring(order.expiry));-- NUMBER message("Код бумаги заявки "..tostring(order.sec_code));-- STRING message("Код класса заявки "..tostring(order.class_code));-- STRING message("Дата и время "..tostring(order.datetime));-- TABLE message("Дата и время снятия заявки "..tostring(order.withdraw_datetime));-- TABLE message("Идентификатор расчетного счета/кода в клиринговой организации "..tostring(order.bank_acc_id));-- STRING message("Способ указания объема заявки "..tostring(order.value_entry_type));-- NUMBER Возможные значения: -- "0" – по количеству, -- "1" – по объему message("Срок РЕПО, в календарных днях "..tostring(order.repoterm));-- NUMBER message("Сумма РЕПО на текущую дату "..tostring(order.repovalue));-- NUMBER Отображается с точностью 2 знака message("Объём сделки выкупа РЕПО "..tostring(order.repo2value));-- NUMBER Отображается с точностью 2 знака message("Остаток суммы РЕПО "..tostring(order.repo_value_balance));-- NUMBER за вычетом суммы привлеченных или предоставленных по сделке РЕПО денежных средств в неисполненной части заявки, по состоянию на текущую дату. Отображается с точностью 2 знака message("Начальный дисконт, в % "..tostring(order.start_discount));-- NUMBER message("Причина отклонения заявки брокером "..tostring(order.reject_reason));-- STRING message("Битовое поле для получения специфических параметров с западных площадок "..tostring(order.ext_order_flags));-- NUMBER message("Минимально допустимое количество "..tostring(order.min_qty));-- NUMBER которое можно указать в заявке по данному инструменту. Если имеет значение «0», значит ограничение по количеству не задано message("Тип исполнения заявки "..tostring(order.exec_type));-- NUMBER Если имеет значение «0», значит значение не задано message("Поле для получения параметров по западным площадкам "..tostring(order.side_qualifier));-- NUMBER Если имеет значение «0», значит значение не задано message("Поле для получения параметров по западным площадкам "..tostring(order.acnt_type));-- NUMBER Если имеет значение «0», значит значение не задано message("Поле для получения параметров по западным площадкам "..tostring(order.capacity));-- NUMBER Если имеет значение «0», значит значение не задано message("Поле для получения параметров по западным площадкам "..tostring(order.passive_only_order));-- NUMBER Если имеет значение «0», значит значение не задано end; |
function OnOrder(order) message("Номер заявки в торговой системе "..tostring(order.order_num));-- NUMBER message("Набор битовых флагов "..tostring(order.flags));-- NUMBER -- бит 0 (0x1) Заявка активна, иначе – не активна -- бит 1 (0x2) Заявка снята. Если флаг не установлен и значение бита «0» равно «0», то заявка исполнена -- бит 2 (0x4) Заявка на продажу, иначе – на покупку. Данный флаг для сделок и сделок для исполнения определяет направление сделки (BUY/SELL) -- бит 3 (0x8) Заявка лимитированная, иначе – рыночная -- бит 4 (0x10) Разрешить / запретить сделки по разным ценам -- бит 5 (0x20) Исполнить заявку немедленно или снять (FILL OR KILL) -- бит 6 (0x40) Заявка маркет-мейкера. Для адресных заявок – заявка отправлена контрагенту -- бит 7 (0x80) Для адресных заявок – заявка получена от контрагента -- бит 8 (0x100) Снять остаток -- бит 9 (0x200) Айсберг-заявка message("Комментарий "..tostring(order.brokerref));-- STRING обычно: <код клиента>/<номер поручения> message("Идентификатор трейдера "..tostring(order.userid));-- STRING message("Идентификатор фирмы "..tostring(order.firmid));-- STRING message("Торговый счет "..tostring(order.account));-- STRING message("Цена "..tostring(order.price));-- NUMBER message("Количество в лотах "..tostring(order.qty));-- NUMBER message("Остаток "..tostring(order.balance));-- NUMBER message("Объем в денежных средствах "..tostring(order.value));-- NUMBER message("Накопленный купонный доход "..tostring(order.accruedint));-- NUMBER message("Доходность "..tostring(order.yield));-- NUMBER message("Идентификатор транзакции "..tostring(order.trans_id));-- NUMBER message("Код клиента "..tostring(order.client_code));-- STRING message("Цена выкупа "..tostring(order.price2));-- NUMBER message("Код расчетов "..tostring(order.settlecode));-- STRING message("Идентификатор пользователя "..tostring(order.uid));-- NUMBER message("Код биржи в торговой системе "..tostring(order.exchange_code));-- STRING message("Время активации "..tostring(order.activation_time));-- NUMBER message("Номер заявки в торговой системе "..tostring(order.linkedorder));-- NUMBER message("Дата окончания срока действия заявки "..tostring(order.expiry));-- NUMBER message("Код бумаги заявки "..tostring(order.sec_code));-- STRING message("Код класса заявки "..tostring(order.class_code));-- STRING message("Дата и время "..tostring(order.datetime));-- TABLE message("Дата и время снятия заявки "..tostring(order.withdraw_datetime));-- TABLE message("Идентификатор расчетного счета/кода в клиринговой организации "..tostring(order.bank_acc_id));-- STRING message("Способ указания объема заявки "..tostring(order.value_entry_type));-- NUMBER Возможные значения: -- "0" – по количеству, -- "1" – по объему message("Срок РЕПО, в календарных днях "..tostring(order.repoterm));-- NUMBER message("Сумма РЕПО на текущую дату "..tostring(order.repovalue));-- NUMBER Отображается с точностью 2 знака message("Объём сделки выкупа РЕПО "..tostring(order.repo2value));-- NUMBER Отображается с точностью 2 знака message("Остаток суммы РЕПО "..tostring(order.repo_value_balance));-- NUMBER за вычетом суммы привлеченных или предоставленных по сделке РЕПО денежных средств в неисполненной части заявки, по состоянию на текущую дату. Отображается с точностью 2 знака message("Начальный дисконт, в % "..tostring(order.start_discount));-- NUMBER message("Причина отклонения заявки брокером "..tostring(order.reject_reason));-- STRING message("Битовое поле для получения специфических параметров с западных площадок "..tostring(order.ext_order_flags));-- NUMBER message("Минимально допустимое количество "..tostring(order.min_qty));-- NUMBER которое можно указать в заявке по данному инструменту. Если имеет значение «0», значит ограничение по количеству не задано message("Тип исполнения заявки "..tostring(order.exec_type));-- NUMBER Если имеет значение «0», значит значение не задано message("Поле для получения параметров по западным площадкам "..tostring(order.side_qualifier));-- NUMBER Если имеет значение «0», значит значение не задано message("Поле для получения параметров по западным площадкам "..tostring(order.acnt_type));-- NUMBER Если имеет значение «0», значит значение не задано message("Поле для получения параметров по западным площадкам "..tostring(order.capacity));-- NUMBER Если имеет значение «0», значит значение не задано message("Поле для получения параметров по западным площадкам "..tostring(order.passive_only_order));-- NUMBER Если имеет значение «0», значит значение не задано end;
Пример использования:
-- Предварительно, при выставлении заявки Buy ее ID транзакции запоминается в переменной BuyUniqTransID -- Соответственно Sell в SellUniqTransID function OnOrder(order) -- Если выставлен Buy, запоминает номер заявки в торговой системе if order.trans_id == BuyUniqTransID and BuyOrderNum == 0 then BuyOrderNum = order.order_num; end; -- Если выставлен Sell, запоминает номер заявки в торговой системе if order.trans_id == SellUniqTransID and SellOrderNum == 0 then SellOrderNum = order.order_num; end; end; |
-- Предварительно, при выставлении заявки Buy ее ID транзакции запоминается в переменной BuyUniqTransID -- Соответственно Sell в SellUniqTransID function OnOrder(order) -- Если выставлен Buy, запоминает номер заявки в торговой системе if order.trans_id == BuyUniqTransID and BuyOrderNum == 0 then BuyOrderNum = order.order_num; end; -- Если выставлен Sell, запоминает номер заявки в торговой системе if order.trans_id == SellUniqTransID and SellOrderNum == 0 then SellOrderNum = order.order_num; end; end;
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».
Функция вызывается терминалом QUIK при изменении текущих параметров (Текущая таблица параметров).
Скрипт в примере отслеживает моменты начала и окончания торговых сессий по инструменту RIM5:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | -- Флаг поддержания работы скрипта IsRun = true; SEC_CODE = "RIM5"; -- Код бумаги CLASS_CODE = "SPBFUT"; -- Класс бумаги function main() -- Получает и запоминает в начале запуска скрипта статус состояния сессии по RIM5 OldStatus = tonumber(getParamEx(CLASS_CODE, SEC_CODE, "TRADINGSTATUS").param_value); -- Выводит сообщение о текущем состоянии if OldStatus == 1 then message("RIM5 торгуется"); else message("RIM5 не торгуется"); end; -- Цикл будет выполнятся, пока IsRun == true while IsRun do sleep(1000); end; end; -- Функция вызывается терминалом QUIK при при изменении текущих параметров function OnParam(class, sec) -- Если изменение пришло по RIM5 if class == CLASS_CODE and sec == SEC_CODE then -- Получает текущий статус сессии по RIM5 local Status = tonumber(getParamEx(CLASS_CODE, SEC_CODE, "TRADINGSTATUS").param_value); -- Если статус изменился if Status ~= OldStatus then -- Выводит сообщение и запоминает новый статус if Status == 1 then message("RIM5 торгуется"); else message("RIM5 не торгуется"); end; OldStatus = Status; end; end; end; -- Функция вызывается терминалом QUIK при остановке скрипта из диалога управления и при закрытии терминала QUIK function OnStop() -- Останавливает цикл в функции main IsRun = false; end; |
-- Флаг поддержания работы скрипта IsRun = true; SEC_CODE = "RIM5"; -- Код бумаги CLASS_CODE = "SPBFUT"; -- Класс бумаги function main() -- Получает и запоминает в начале запуска скрипта статус состояния сессии по RIM5 OldStatus = tonumber(getParamEx(CLASS_CODE, SEC_CODE, "TRADINGSTATUS").param_value); -- Выводит сообщение о текущем состоянии if OldStatus == 1 then message("RIM5 торгуется"); else message("RIM5 не торгуется"); end; -- Цикл будет выполнятся, пока IsRun == true while IsRun do sleep(1000); end; end; -- Функция вызывается терминалом QUIK при при изменении текущих параметров function OnParam(class, sec) -- Если изменение пришло по RIM5 if class == CLASS_CODE and sec == SEC_CODE then -- Получает текущий статус сессии по RIM5 local Status = tonumber(getParamEx(CLASS_CODE, SEC_CODE, "TRADINGSTATUS").param_value); -- Если статус изменился if Status ~= OldStatus then -- Выводит сообщение и запоминает новый статус if Status == 1 then message("RIM5 торгуется"); else message("RIM5 не торгуется"); end; OldStatus = Status; end; end; end; -- Функция вызывается терминалом QUIK при остановке скрипта из диалога управления и при закрытии терминала QUIK function OnStop() -- Останавливает цикл в функции main IsRun = false; end;
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».
Функция вызывается терминалом QUIK при получении изменения стакана котировок.
С примером использования данной функции можно ознакомиться в этой статье.
Функция вызывается терминалом QUIK при получении новой стоп-заявки или при изменении параметров существующей стоп-заявки (Таблица стоп-заявок).
function OnStopOrder(stop_order) message("Регистрационный номер стоп-заявки на сервере QUIK "..tostring(stop_order.order_num));-- NUMBER message("Время выставления "..tostring(stop_order.ordertime));-- NUMBER message("Набор битовых флагов "..tostring(stop_order.flags));-- NUMBER -- бит 0 (0x1) Заявка активна, иначе не активна -- бит 1 (0x2) Заявка снята. Если не установлен и значение бита 0 равно 0, то заявка исполнена -- бит 2 (0x4) Заявка на продажу, иначе – на покупку -- бит 3 (0x8) Лимитированная заявка -- бит 5 (0x20) Стоп-заявка ожидает активации -- бит 6 (0x40) Стоп-заявка с другого сервера -- бит 8 (0x100) Устанавливается в случае стоп-заявки типа тейк-профита по заявке, в случае когда исходная заявка частично исполнена и по выставленной тейк-профит заявке на исполненную часть заявки выполнилось условие активации -- бит 9 (0x200) Стоп-заявка активирована вручную -- бит 10 (0x400) Стоп-заявка сработала, но была отвергнута торговой системой -- бит 11 (0x800) Стоп-заявка сработала, но не прошла контроль лимитов -- бит 12 (0x1000) Стоп-заявка снята, так как снята связанная заявка -- бит 13 (0x2000) Стоп-заявка снята, так как связанная заявка исполнена -- бит 15 (0x8000) Идет расчет минимума-максимума message("Комментарий "..tostring(stop_order.brokerref));-- STRING обычно: <код клиента>/<номер поручения> message("Идентификатор дилера "..tostring(stop_order.firmid));-- STRING message("Торговый счет "..tostring(stop_order.account));-- STRING message("Направленность стоп-цены "..tostring(stop_order.condition));-- NUMBER Возможные значения: -- "4" – «<=», -- "5" – «>=» message("Стоп-цена "..tostring(stop_order.condition_price));-- NUMBER message("Цена "..tostring(stop_order.price));-- NUMBER message("Количество в лотах "..tostring(stop_order.qty));-- NUMBER message("Номер заявки в торговой системе, зарегистрированной по наступлению условия стоп-цены "..tostring(stop_order.linkedorder));-- NUMBER message("Дата окончания срока действия заявки "..tostring(stop_order.expiry));-- NUMBER message("Идентификатор транзакции "..tostring(stop_order.trans_id));-- NUMBER message("Код клиента "..tostring(stop_order.client_code));-- STRING message("Связанная заявка "..tostring(stop_order.co_order_num));-- NUMBER message("Цена связанной заявки "..tostring(stop_order.co_order_price));-- NUMBER message("Вид стоп заявки "..tostring(stop_order.stop_order_type));-- NUMBER Возможные значения: -- "1" – стоп-лимит, -- "2" – условие по другому инструменту, -- "3" – со связанной заявкой, -- "6" – тейк-профит, -- "7" – стоп-лимит по исполнению активной заявки, -- "8" – тейк-профит по исполнению активной заявки, -- "9" - тэйк-профит и стоп-лимит message("Дата выставления "..tostring(stop_order.orderdate));-- NUMBER message("Сделка условия "..tostring(stop_order.alltrade_num));-- NUMBER message("Набор битовых флагов "..tostring(stop_order.stopflags));-- NUMBER message("Отступ от min/max "..tostring(stop_order.offset));-- NUMBER message("Защитный спрэд "..tostring(stop_order.spread));-- NUMBER message("Активное количество "..tostring(stop_order.balance));-- NUMBER message("Идентификатор пользователя "..tostring(stop_order.uid));-- NUMBER message("Исполненное количество "..tostring(stop_order.filled_qty));-- NUMBER message("Время снятия заявки "..tostring(stop_order.withdraw_time));-- NUMBER message("Стоп-лимит цена "..tostring(stop_order.condition_price2));-- NUMBER (для заявок типа «Тэйк-профит и стоп-лимит») message("Время начала периода действия заявки "..tostring(stop_order.active_from_time));-- NUMBER типа «Тэйк-профит и стоп-лимит» message("Время окончания периода действия заявки "..tostring(stop_order.active_to_time));-- NUMBER типа «Тэйк-профит и стоп-лимит» message("Код бумаги заявки "..tostring(stop_order.sec_code));-- STRING message("Код класса заявки "..tostring(stop_order.class_code));-- STRING message("Код бумаги стоп-цены "..tostring(stop_order.condition_sec_code));-- STRING message("Код класса стоп-цены "..tostring(stop_order.condition_class_code));-- STRING end; |
function OnStopOrder(stop_order) message("Регистрационный номер стоп-заявки на сервере QUIK "..tostring(stop_order.order_num));-- NUMBER message("Время выставления "..tostring(stop_order.ordertime));-- NUMBER message("Набор битовых флагов "..tostring(stop_order.flags));-- NUMBER -- бит 0 (0x1) Заявка активна, иначе не активна -- бит 1 (0x2) Заявка снята. Если не установлен и значение бита 0 равно 0, то заявка исполнена -- бит 2 (0x4) Заявка на продажу, иначе – на покупку -- бит 3 (0x8) Лимитированная заявка -- бит 5 (0x20) Стоп-заявка ожидает активации -- бит 6 (0x40) Стоп-заявка с другого сервера -- бит 8 (0x100) Устанавливается в случае стоп-заявки типа тейк-профита по заявке, в случае когда исходная заявка частично исполнена и по выставленной тейк-профит заявке на исполненную часть заявки выполнилось условие активации -- бит 9 (0x200) Стоп-заявка активирована вручную -- бит 10 (0x400) Стоп-заявка сработала, но была отвергнута торговой системой -- бит 11 (0x800) Стоп-заявка сработала, но не прошла контроль лимитов -- бит 12 (0x1000) Стоп-заявка снята, так как снята связанная заявка -- бит 13 (0x2000) Стоп-заявка снята, так как связанная заявка исполнена -- бит 15 (0x8000) Идет расчет минимума-максимума message("Комментарий "..tostring(stop_order.brokerref));-- STRING обычно: <код клиента>/<номер поручения> message("Идентификатор дилера "..tostring(stop_order.firmid));-- STRING message("Торговый счет "..tostring(stop_order.account));-- STRING message("Направленность стоп-цены "..tostring(stop_order.condition));-- NUMBER Возможные значения: -- "4" – «<=», -- "5" – «>=» message("Стоп-цена "..tostring(stop_order.condition_price));-- NUMBER message("Цена "..tostring(stop_order.price));-- NUMBER message("Количество в лотах "..tostring(stop_order.qty));-- NUMBER message("Номер заявки в торговой системе, зарегистрированной по наступлению условия стоп-цены "..tostring(stop_order.linkedorder));-- NUMBER message("Дата окончания срока действия заявки "..tostring(stop_order.expiry));-- NUMBER message("Идентификатор транзакции "..tostring(stop_order.trans_id));-- NUMBER message("Код клиента "..tostring(stop_order.client_code));-- STRING message("Связанная заявка "..tostring(stop_order.co_order_num));-- NUMBER message("Цена связанной заявки "..tostring(stop_order.co_order_price));-- NUMBER message("Вид стоп заявки "..tostring(stop_order.stop_order_type));-- NUMBER Возможные значения: -- "1" – стоп-лимит, -- "2" – условие по другому инструменту, -- "3" – со связанной заявкой, -- "6" – тейк-профит, -- "7" – стоп-лимит по исполнению активной заявки, -- "8" – тейк-профит по исполнению активной заявки, -- "9" - тэйк-профит и стоп-лимит message("Дата выставления "..tostring(stop_order.orderdate));-- NUMBER message("Сделка условия "..tostring(stop_order.alltrade_num));-- NUMBER message("Набор битовых флагов "..tostring(stop_order.stopflags));-- NUMBER message("Отступ от min/max "..tostring(stop_order.offset));-- NUMBER message("Защитный спрэд "..tostring(stop_order.spread));-- NUMBER message("Активное количество "..tostring(stop_order.balance));-- NUMBER message("Идентификатор пользователя "..tostring(stop_order.uid));-- NUMBER message("Исполненное количество "..tostring(stop_order.filled_qty));-- NUMBER message("Время снятия заявки "..tostring(stop_order.withdraw_time));-- NUMBER message("Стоп-лимит цена "..tostring(stop_order.condition_price2));-- NUMBER (для заявок типа «Тэйк-профит и стоп-лимит») message("Время начала периода действия заявки "..tostring(stop_order.active_from_time));-- NUMBER типа «Тэйк-профит и стоп-лимит» message("Время окончания периода действия заявки "..tostring(stop_order.active_to_time));-- NUMBER типа «Тэйк-профит и стоп-лимит» message("Код бумаги заявки "..tostring(stop_order.sec_code));-- STRING message("Код класса заявки "..tostring(stop_order.class_code));-- STRING message("Код бумаги стоп-цены "..tostring(stop_order.condition_sec_code));-- STRING message("Код класса стоп-цены "..tostring(stop_order.condition_class_code));-- STRING end;
Пример использования:
function OnStopOrder(stop_order) -- Если зарегистрирована Стоп-лимит на покупку, то сохраняет ее номер if stop_order.trans_id == BuyUniqTransID then BuyOrderNum = stop_order.order_num; end; -- Если зарегистрирована Стоп-лимит на продажу, то сохраняет ее номер if stop_order.trans_id == SellUniqTransID then SellOrderNum = stop_order.order_num; end; -- Если зарегистрирована "Стоп-лосс и Тейк-профит", то сохраняет ее номер if stop_order.trans_id == SlTpUniqTransID then SlTpOrderNum = stop_order.linkedorder; end; end; |
function OnStopOrder(stop_order) -- Если зарегистрирована Стоп-лимит на покупку, то сохраняет ее номер if stop_order.trans_id == BuyUniqTransID then BuyOrderNum = stop_order.order_num; end; -- Если зарегистрирована Стоп-лимит на продажу, то сохраняет ее номер if stop_order.trans_id == SellUniqTransID then SellOrderNum = stop_order.order_num; end; -- Если зарегистрирована "Стоп-лосс и Тейк-профит", то сохраняет ее номер if stop_order.trans_id == SlTpUniqTransID then SlTpOrderNum = stop_order.linkedorder; end; end;
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».
Функция вызывается терминалом QUIK при получении сделки (Таблица сделок).
function OnTrade(trade) message("Идентификатор транзакции "..tostring(trade.trans_id));-- NUMBER message("Номер сделки в торговой системе "..tostring(trade.trade_num));-- NUMBER message("Номер заявки в торговой системе "..tostring(trade.order_num));-- NUMBER message("Комментарий "..tostring(trade.brokerref));-- STRING обычно: <код клиента>/<номер поручения> message("Идентификатор трейдера "..tostring(trade.userid));-- STRING message("Идентификатор дилера "..tostring(trade.firmid));-- STRING message("Торговый счет "..tostring(trade.account));-- STRING message("Цена "..tostring(trade.price));-- NUMBER message("Количество бумаг в последней сделке в лотах "..tostring(trade.qty));-- NUMBER message("Объем в денежных средствах "..tostring(trade.value));-- NUMBER message("Накопленный купонный доход "..tostring(trade.accruedint));-- NUMBER message("Доходность "..tostring(trade.yield));-- NUMBER message("Код расчетов "..tostring(trade.settlecode));-- STRING message("Код фирмы партнера "..tostring(trade.cpfirmid));-- STRING message("Набор битовых флагов "..tostring(trade.flags));-- NUMBER -- бит 0 (0x1) Заявка активна, иначе – не активна -- бит 1 (0x2) Заявка снята. Если флаг не установлен и значение бита «0» равно «0», то заявка исполнена -- бит 2 (0x4) Заявка на продажу, иначе – на покупку. Данный флаг для сделок и сделок для исполнения определяет направление сделки (BUY/SELL) -- бит 3 (0x8) Заявка лимитированная, иначе – рыночная -- бит 4 (0x10) Разрешить / запретить сделки по разным ценам -- бит 5 (0x20) Исполнить заявку немедленно или снять (FILL OR KILL) -- бит 6 (0x40) Заявка маркет-мейкера. Для адресных заявок – заявка отправлена контрагенту -- бит 7 (0x80) Для адресных заявок – заявка получена от контрагента -- бит 8 (0x100) Снять остаток -- бит 9 (0x200) Айсберг-заявка message("Цена выкупа "..tostring(trade.price2));-- NUMBER message("Ставка РЕПО (%) "..tostring(trade.reporate));-- NUMBER message("Код клиента "..tostring(trade.client_code));-- STRING message("Доход (%) на дату выкупа "..tostring(trade.accrued2));-- NUMBER message("Сумма РЕПО "..tostring(trade.repovalue));-- NUMBER message("Объем выкупа РЕПО "..tostring(trade.repo2value));-- NUMBER message("Начальный дисконт (%) "..tostring(trade.start_discount));-- NUMBER message("Нижний дисконт (%) "..tostring(trade.lower_discount));-- NUMBER message("Верхний дисконт (%) "..tostring(trade.upper_discount));-- NUMBER message("Блокировка обеспечения "..tostring(trade.block_securities));-- NUMBER («Да»/«Нет») message("Клиринговая комиссия (ММВБ) "..tostring(trade.clearing_comission));-- NUMBER message("Комиссия Фондовой биржи (ММВБ) "..tostring(trade.exchange_comission));-- NUMBER message("Комиссия Технического центра (ММВБ) "..tostring(trade.tech_center_comission));-- NUMBER message("Дата расчетов "..tostring(trade.settle_date));-- NUMBER message("Валюта расчетов "..tostring(trade.settle_currency));-- STRING message("Валюта "..tostring(trade.trade_currency));-- STRING message("Код биржи в торговой системе "..tostring(trade.exchange_code));-- STRING message("Идентификатор рабочей станции "..tostring(trade.station_id));-- STRING message("Код бумаги заявки "..tostring(trade.sec_code));-- STRING message("Код класса "..tostring(trade.class_code));-- STRING message("Дата и время "..tostring(trade.datetime));-- TABLE message("Идентификатор расчетного счета/кода в клиринговой организации "..tostring(trade.bank_acc_id));-- STRING message("Комиссия брокера "..tostring(trade.broker_comission));-- NUMBER Отображается с точностью до 2 двух знаков. Поле зарезервировано для будущего использования. message("Номер витринной сделки в Торговой Системе "..tostring(trade.linked_trade));-- NUMBER для сделок РЕПО с ЦК и SWAP message("Период торговой сессии "..tostring(trade.period));-- NUMBER Возможные значения: -- "0" – Открытие; -- "1" – Нормальный; -- "2" – Закрытие end; |
function OnTrade(trade) message("Идентификатор транзакции "..tostring(trade.trans_id));-- NUMBER message("Номер сделки в торговой системе "..tostring(trade.trade_num));-- NUMBER message("Номер заявки в торговой системе "..tostring(trade.order_num));-- NUMBER message("Комментарий "..tostring(trade.brokerref));-- STRING обычно: <код клиента>/<номер поручения> message("Идентификатор трейдера "..tostring(trade.userid));-- STRING message("Идентификатор дилера "..tostring(trade.firmid));-- STRING message("Торговый счет "..tostring(trade.account));-- STRING message("Цена "..tostring(trade.price));-- NUMBER message("Количество бумаг в последней сделке в лотах "..tostring(trade.qty));-- NUMBER message("Объем в денежных средствах "..tostring(trade.value));-- NUMBER message("Накопленный купонный доход "..tostring(trade.accruedint));-- NUMBER message("Доходность "..tostring(trade.yield));-- NUMBER message("Код расчетов "..tostring(trade.settlecode));-- STRING message("Код фирмы партнера "..tostring(trade.cpfirmid));-- STRING message("Набор битовых флагов "..tostring(trade.flags));-- NUMBER -- бит 0 (0x1) Заявка активна, иначе – не активна -- бит 1 (0x2) Заявка снята. Если флаг не установлен и значение бита «0» равно «0», то заявка исполнена -- бит 2 (0x4) Заявка на продажу, иначе – на покупку. Данный флаг для сделок и сделок для исполнения определяет направление сделки (BUY/SELL) -- бит 3 (0x8) Заявка лимитированная, иначе – рыночная -- бит 4 (0x10) Разрешить / запретить сделки по разным ценам -- бит 5 (0x20) Исполнить заявку немедленно или снять (FILL OR KILL) -- бит 6 (0x40) Заявка маркет-мейкера. Для адресных заявок – заявка отправлена контрагенту -- бит 7 (0x80) Для адресных заявок – заявка получена от контрагента -- бит 8 (0x100) Снять остаток -- бит 9 (0x200) Айсберг-заявка message("Цена выкупа "..tostring(trade.price2));-- NUMBER message("Ставка РЕПО (%) "..tostring(trade.reporate));-- NUMBER message("Код клиента "..tostring(trade.client_code));-- STRING message("Доход (%) на дату выкупа "..tostring(trade.accrued2));-- NUMBER message("Сумма РЕПО "..tostring(trade.repovalue));-- NUMBER message("Объем выкупа РЕПО "..tostring(trade.repo2value));-- NUMBER message("Начальный дисконт (%) "..tostring(trade.start_discount));-- NUMBER message("Нижний дисконт (%) "..tostring(trade.lower_discount));-- NUMBER message("Верхний дисконт (%) "..tostring(trade.upper_discount));-- NUMBER message("Блокировка обеспечения "..tostring(trade.block_securities));-- NUMBER («Да»/«Нет») message("Клиринговая комиссия (ММВБ) "..tostring(trade.clearing_comission));-- NUMBER message("Комиссия Фондовой биржи (ММВБ) "..tostring(trade.exchange_comission));-- NUMBER message("Комиссия Технического центра (ММВБ) "..tostring(trade.tech_center_comission));-- NUMBER message("Дата расчетов "..tostring(trade.settle_date));-- NUMBER message("Валюта расчетов "..tostring(trade.settle_currency));-- STRING message("Валюта "..tostring(trade.trade_currency));-- STRING message("Код биржи в торговой системе "..tostring(trade.exchange_code));-- STRING message("Идентификатор рабочей станции "..tostring(trade.station_id));-- STRING message("Код бумаги заявки "..tostring(trade.sec_code));-- STRING message("Код класса "..tostring(trade.class_code));-- STRING message("Дата и время "..tostring(trade.datetime));-- TABLE message("Идентификатор расчетного счета/кода в клиринговой организации "..tostring(trade.bank_acc_id));-- STRING message("Комиссия брокера "..tostring(trade.broker_comission));-- NUMBER Отображается с точностью до 2 двух знаков. Поле зарезервировано для будущего использования. message("Номер витринной сделки в Торговой Системе "..tostring(trade.linked_trade));-- NUMBER для сделок РЕПО с ЦК и SWAP message("Период торговой сессии "..tostring(trade.period));-- NUMBER Возможные значения: -- "0" – Открытие; -- "1" – Нормальный; -- "2" – Закрытие end;
Пример использования:
function OnTrade(trade) -- Если сработал "Стоп-лосс и Тейк-профит" if trade.order_num == SlTpOrderNum then SlTpTradeNum = trade.trade_num; SlTpTradePrice = trade.price; end; end; |
function OnTrade(trade) -- Если сработал "Стоп-лосс и Тейк-профит" if trade.order_num == SlTpOrderNum then SlTpTradeNum = trade.trade_num; SlTpTradePrice = trade.price; end; end;
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».
Функция вызывается терминалом QUIK при получении ответа на транзакцию пользователя (Таблица транзакций).
function OnTransReply(trans_reply) message("Пользовательский идентификатор транзакции "..tostring(trans_reply.trans_id));-- NUMBER message("Статус "..tostring(trans_reply.status));-- NUMBER message("Сообщение "..tostring(trans_reply.result_msg));-- STRING message("Время "..tostring(trans_reply.time));-- NUMBER message("Идентификатор "..tostring(trans_reply.uid));-- NUMBER message("Флаги транзакции "..tostring(trans_reply.flags));-- NUMBER (временно не используется) message("Идентификатор транзакции на сервере "..tostring(trans_reply.server_trans_id));-- NUMBER message("*Номер заявки "..tostring(trans_reply.order_num));-- NUMBER message("*Цена "..tostring(trans_reply.price));-- NUMBER message("*Количество "..tostring(trans_reply.quantity));-- NUMBER message("*Остаток "..tostring(trans_reply.balance));-- NUMBER message("*Идентификатор фирмы "..tostring(trans_reply.firm_id));-- STRING message("*Торговый счет "..tostring(trans_reply.account));-- STRING message("*Код клиента "..tostring(trans_reply.client_code));-- STRING message("*Поручение "..tostring(trans_reply.brokerref));-- STRING message("*Код класса "..tostring(trans_reply.class_code));-- STRING message("*Код бумаги "..tostring(trans_reply.sec_code));-- STRING -- * - параметр может иметь значение nil end; |
function OnTransReply(trans_reply) message("Пользовательский идентификатор транзакции "..tostring(trans_reply.trans_id));-- NUMBER message("Статус "..tostring(trans_reply.status));-- NUMBER message("Сообщение "..tostring(trans_reply.result_msg));-- STRING message("Время "..tostring(trans_reply.time));-- NUMBER message("Идентификатор "..tostring(trans_reply.uid));-- NUMBER message("Флаги транзакции "..tostring(trans_reply.flags));-- NUMBER (временно не используется) message("Идентификатор транзакции на сервере "..tostring(trans_reply.server_trans_id));-- NUMBER message("*Номер заявки "..tostring(trans_reply.order_num));-- NUMBER message("*Цена "..tostring(trans_reply.price));-- NUMBER message("*Количество "..tostring(trans_reply.quantity));-- NUMBER message("*Остаток "..tostring(trans_reply.balance));-- NUMBER message("*Идентификатор фирмы "..tostring(trans_reply.firm_id));-- STRING message("*Торговый счет "..tostring(trans_reply.account));-- STRING message("*Код клиента "..tostring(trans_reply.client_code));-- STRING message("*Поручение "..tostring(trans_reply.brokerref));-- STRING message("*Код класса "..tostring(trans_reply.class_code));-- STRING message("*Код бумаги "..tostring(trans_reply.sec_code));-- STRING -- * - параметр может иметь значение nil end;
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».
Ниже приведен скрипт, в котором есть все функции обратного вызова. При помощи него можно отследить в какой последовательности и с какими задержками срабатывают функции при выполнении Вами каких-либо операций. При вызове каждой функции выводится сообщение, в котором указано название функции, ее краткое описание и время с точностью до миллисекунд, прошедшее с момента запуска терминала QUIK.
В функциях OnAllTrade(), OnParam() и OnQuote() вывод сообщений намеренно закомментирован, т.к. они вызываются очень часто и независимо от Ваших действий, если Вам будет нужно отследить их вызовы, раскомментируйте строки вывода сообщений в данных функциях.
Можете запустить данный скрипт и посовершать разные торговые операции на демо-счете, чтобы лучше понять как работают данные функции.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | -- Флаг поддержания работы скрипта IsRun = true; function main() -- Цикл будет выполнятся, пока IsRun == true while IsRun do sleep(1000); end; end; function OnAccountBalance() message("OnAccountBalance - изменение позиции по счету "..tostring(os.clock())); end; function OnAccountPosition() message("OnAccountPosition - изменение позиции по счету "..tostring(os.clock())); end; function OnAllTrade() --message("OnAllTrade - новая обезличенная сделка "..tostring(os.clock())); end; function OnCleanUp() message("OnCleanUp - смена торговой сессии и при выгрузке файла qlua.dll "..tostring(os.clock())); end; function OnClose() message("OnClose - закрытие терминала QUIK "..tostring(os.clock())); end; function OnConnected() message("OnConnected - установление связи с сервером QUIK "..tostring(os.clock())); end; function OnDepoLimit() message("OnDepoLimit - изменение бумажного лимита "..tostring(os.clock())); end; function OnDepoLimitDelete() message("OnDepoLimitDelete - удаление бумажного лимита "..tostring(os.clock())); end; function OnDisconnected() message("OnDisconnected - отключение от сервера QUIK "..tostring(os.clock())); end; function OnFirm() message("OnFirm - описание новой фирмы "..tostring(os.clock())); end; function OnFuturesClientHolding() message("OnFuturesClientHolding - изменение позиции по срочному рынку "..tostring(os.clock())); end; function OnFuturesLimitChange() message("OnFuturesLimitChange - изменение ограничений по срочному рынку "..tostring(os.clock())); end; function OnFuturesLimitDelete() message("OnFuturesLimitDelete - удаление лимита по срочному рынку "..tostring(os.clock())); end; function OnInit() message("OnInit - инициализация функции main "..tostring(os.clock())); end; function OnMoneyLimit() message("OnMoneyLimit - изменение денежного лимита "..tostring(os.clock())); end; function OnMoneyLimitDelete() message("OnMoneyLimitDelete - удаление денежного лимита "..tostring(os.clock())); end; function OnNegDeal() message("OnNegDeal - новая заявка на внебиржевую сделку "..tostring(os.clock())); end; function OnNegTrade() message("OnNegTrade - новая сделка для исполнения "..tostring(os.clock())); end; function OnOrder() message("OnOrder - новая заявка или изменение параметров существующей заявки "..tostring(os.clock())); end; function OnParam() --message("OnParam - изменение текущих параметров "..tostring(os.clock())); end; function OnQuote() --message("OnQuote - изменение стакана котировок "..tostring(os.clock())); end; function OnStop() message("OnStop - остановка скрипта из диалога управления "..tostring(os.clock())); -- Останавливает цикл в функции main IsRun = false; end; function OnStopOrder() message("OnStopOrder - новая стоп-заявка или изменение параметров существующей стоп-заявки "..tostring(os.clock())); end; function OnTrade() message("OnTrade - новая сделка "..tostring(os.clock())); end; function OnTransReply() message("OnTransReply - ответ на транзакцию "..tostring(os.clock())); end; |
-- Флаг поддержания работы скрипта IsRun = true; function main() -- Цикл будет выполнятся, пока IsRun == true while IsRun do sleep(1000); end; end; function OnAccountBalance() message("OnAccountBalance - изменение позиции по счету "..tostring(os.clock())); end; function OnAccountPosition() message("OnAccountPosition - изменение позиции по счету "..tostring(os.clock())); end; function OnAllTrade() --message("OnAllTrade - новая обезличенная сделка "..tostring(os.clock())); end; function OnCleanUp() message("OnCleanUp - смена торговой сессии и при выгрузке файла qlua.dll "..tostring(os.clock())); end; function OnClose() message("OnClose - закрытие терминала QUIK "..tostring(os.clock())); end; function OnConnected() message("OnConnected - установление связи с сервером QUIK "..tostring(os.clock())); end; function OnDepoLimit() message("OnDepoLimit - изменение бумажного лимита "..tostring(os.clock())); end; function OnDepoLimitDelete() message("OnDepoLimitDelete - удаление бумажного лимита "..tostring(os.clock())); end; function OnDisconnected() message("OnDisconnected - отключение от сервера QUIK "..tostring(os.clock())); end; function OnFirm() message("OnFirm - описание новой фирмы "..tostring(os.clock())); end; function OnFuturesClientHolding() message("OnFuturesClientHolding - изменение позиции по срочному рынку "..tostring(os.clock())); end; function OnFuturesLimitChange() message("OnFuturesLimitChange - изменение ограничений по срочному рынку "..tostring(os.clock())); end; function OnFuturesLimitDelete() message("OnFuturesLimitDelete - удаление лимита по срочному рынку "..tostring(os.clock())); end; function OnInit() message("OnInit - инициализация функции main "..tostring(os.clock())); end; function OnMoneyLimit() message("OnMoneyLimit - изменение денежного лимита "..tostring(os.clock())); end; function OnMoneyLimitDelete() message("OnMoneyLimitDelete - удаление денежного лимита "..tostring(os.clock())); end; function OnNegDeal() message("OnNegDeal - новая заявка на внебиржевую сделку "..tostring(os.clock())); end; function OnNegTrade() message("OnNegTrade - новая сделка для исполнения "..tostring(os.clock())); end; function OnOrder() message("OnOrder - новая заявка или изменение параметров существующей заявки "..tostring(os.clock())); end; function OnParam() --message("OnParam - изменение текущих параметров "..tostring(os.clock())); end; function OnQuote() --message("OnQuote - изменение стакана котировок "..tostring(os.clock())); end; function OnStop() message("OnStop - остановка скрипта из диалога управления "..tostring(os.clock())); -- Останавливает цикл в функции main IsRun = false; end; function OnStopOrder() message("OnStopOrder - новая стоп-заявка или изменение параметров существующей стоп-заявки "..tostring(os.clock())); end; function OnTrade() message("OnTrade - новая сделка "..tostring(os.clock())); end; function OnTransReply() message("OnTransReply - ответ на транзакцию "..tostring(os.clock())); end;
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!