Во время работы терминала 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; |
Для более удобного просмотра информации, выводимой при помощи функции 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; |
Для более удобного просмотра информации, выводимой при помощи функции 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; |
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: "Сообщения"->"Системные сообщения"->"Таблица сообщений..."). А также, снимите флажок "Показывать окно сообщений" в меню: "Настройки"->"Основные..."->"Сообщения".
Пример практического применения данной функции можно посмотреть в данной статье.
Функция вызывается терминалом QUIK при смене сессии и при выгрузке файла qlua.dll
Функция вызывается перед закрытием терминала QUIK.
function OnClose() -- Здесь можно выполнить какие-то действия перед закрытием end; |
Функция вызывается терминалом QUIK при установлении связи с сервером QUIK.
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; |
Код бумаги 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
Код бумаги 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
Из результатов видно, что терминал 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; |
В местах вывода сообщений данного скрипта можно использовать какую-то обработку изменения позиции.
Прим.: при открытии короткой позиции баланс стает со знаком "минус".
Для более удобного просмотра информации, выводимой при помощи функции 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; |
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: "Сообщения"->"Системные сообщения"->"Таблица сообщений..."). А также, снимите флажок "Показывать окно сообщений" в меню: "Настройки"->"Основные..."->"Сообщения".
Функция вызывается терминалом QUIK при отключении от сервера QUIK.
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; |
Для более удобного просмотра информации, выводимой при помощи функции 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; |
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 __________
...
...
...
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 __________
...
...
...
Из результатов видно, что функция вызывается терминалом 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; |
В местах вывода сообщений данного скрипта можно использовать какую-то обработку изменения позиции.
Прим.: при открытии короткой позиции баланс стает со знаком «минус».
Для более удобного просмотра информации, выводимой при помощи функции 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; |
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: "Сообщения"->"Системные сообщения"->"Таблица сообщений..."). А также, снимите флажок "Показывать окно сообщений" в меню: "Настройки"->"Основные..."->"Сообщения".
Функция вызывается терминалом QUIK при удалении лимита по срочному рынку.
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; |
Для более удобного просмотра информации, выводимой при помощи функции 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; |
Для более удобного просмотра информации, выводимой при помощи функции 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; |
Для более удобного просмотра информации, выводимой при помощи функции 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; |
Для более удобного просмотра информации, выводимой при помощи функции 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; |
Пример использования:
-- Предварительно, при выставлении заявки 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; |
Для более удобного просмотра информации, выводимой при помощи функции 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) -- Если зарегистрирована Стоп-лимит на покупку, то сохраняет ее номер 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) -- Если сработал "Стоп-лосс и Тейк-профит" 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; |
Для более удобного просмотра информации, выводимой при помощи функции 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; |
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!
Доброго дня.
Для выставления заявки тейк-профит использую вт такой код:
Несмотря на выставление параметра EXPIRE_DATE = 'GTC' (то есть хочется "до отмены") в систему уходит заявка со сроком действия "TODAY". Почему так происходит?
Здравствуйте!
Следующий код:
вешает терминал наглухо. Проверял на разных ПК, с подключением к серверу или без такового. Где я свернул не туда?
Здравствуйте.
main достаточно объявить, вызывать ее не нужно.
Итить! Спасибо!
бывает) не за что)
Здравствуйте. Подскажите пожалуйста, если уже обсудили, то ткните пожалуйста в материал, как передать в функцию обратного вызова переменные и как вернуть, что-либо оттуда. Вариант с глобальными переменными знаю, использую, но хочу уйти от него. Спасибо.
Здравствуйте. А что мешает объявить переменные локально в начале скрипта, выше всех функций?
kalikazandr, так и делаю, но периодически (пару раз за сессию) получаю искажённое, неверное значение переменной, соответственно реакция моей программы меняется. Квик от робота напрягается не сильно. Для устранения мыслю изменить способ обмена данными с функциями обратного вызова (если возможно) ну и компьютер почистить от софта который грузит систему, может какие - нибудь совпадения событий случаются, не знаю. Наблюдаю некоторую задержку в работе квика в момент получения ошибки. Отсюда и вопрос возник "Есть ли способ, передать конкретные данные в конкретную функцию обратного вызова и как вернуть, что-либо оттуда". Спасибо.
Скорее всего к одним и тем же переменным у вас идет обращение из 2-х потоков: функций обратного вызова, которые работают в основном потоке терминала и main. Если так, то посмотрите статьи:
TGB: "МОДУЛЬ РЕАЛИЗАЦИИ ИНТЕРФЕЙСА ОБРАБОТКИ СОБЫТИЙ..."
Тоха: "БИБЛИОТЕКА LUA_SHARE..."
Несинхронизированные обращения из двух потоков исключаю, на такие моменты обращаю внимание при написании кода. Получается, нет способа, "передать конкретные данные в конкретную функцию обратного вызова и вернуть, что-либо оттуда". Спасибо.
В таком случае не понятно, где у вас получаются "искаженные" значения переменных? Этого не может быть априори, если у вас в коде все правильно написано. Можно пример кода?
Да, занимаюсь проверкой кода. Поменяю внутреннюю логику работы робота. Спасибо.
как пожелаете, успехов!
Благодарен Вам, Спасибо.
Добрый день! Скажите в Lua есть:
1. Колбэк на событие закрытия таймфрейма (свечи) графика в заданном окне QUIK?
2. Доступ к значениям индикатора (из списка встроенных стандартных индикаторов), прикрепленного к графику в заданном окне QUIK?
Если ничего такого нет, то как лучше решить задачу:
Дано: в определенном окне заранее открыт график с нужным таймфреймом и прикрепленным индикатором.
Требуется: в момент закрытия каждой свечи на графике нужно вызывать функцию, которая должна получать значение индикатора на этот момент и на момент закрытия нескольких предыдущих свечей?
Добрый вечер!
1. Нет, но можно реализовать.
2. Файл справки QLUA.chm (где info.exe), вам нужна функция getCandlesByIndex, с помощью этой функции можно получить значения линии(ий) индикатора.
Делаете свой индикатор, который будет выполнять ваши требования п.2 не нужен вовсе.
Здравствуйте! Никак не могу понять, как правильно пользоваться флагами. Пытаюсь вытащить статус стоп-заявки из таблицы стоп-заявок, номер заявки и иные её параметры для идентификации он воспринимает, все показывает, но сам статус никак не могу понять, как вытащить. Код выглядит вот таким образом:
if Stopnumb==getItem("stop_orders",l).order_num and getItem("stop_orders",l).flags == 0x1 then
message("Status active",1)
message("status"..getItem("stop_orders",l).flags,1)
if getItem("stop_orders",l).flags==0x4 then
TP=(-LOT1)
else TP=(LOT1)
end
idx=1
elseif Stopnumb==getItem("stop_orders",l).order_num and (getItem("stop_orders",l).flags == 0x2 or getItem("stop_orders",l).flags == 0x2) then
TP=0
message("Status not active",1)
message("status"..getItem("stop_orders",l).flags,1)
Здравствуйте. Нужно побитовое сравнение
Не стоит использовать getItem для получения каждого параметра таблицы.
Спасибо! В этом все сложилось. Я правильно понимаю, что вытащить статус на покупку или на продажу можно вот таким скриптом?:
local function olr_type(flags)
if bit.band(flags, 0x8000) ~= 0 then
return "C" --"stop-calculate"
end
if bit.band(flags, 0x4) ~= 0 then
return "B" --sell
else
return "S" --buy
end
end
Все! Вроде бы нашла корректную формулировку:
local function olr_type(flags)
if bit.band(flags, 0x8000) ~= 0 then
return "C" --"stop-calculate"
end
if bit.band(flags,4) >0 then
return "S" --sell
else
return "B" --buy
end
end
А вообще с этими флагами ну очнеь тяжко все дается.
Привет! Поищите тут, на сайте, функции для работы с битовыми флагами.
Ваша olr_type, надеюсь решает ваши задачи, но разные по смыслу (направление и одно из состояний стоп-заявки).
Лучше сделать 4 функции определения:
1. состояния заявки/стоп-заявки (olr_status);
2. направление заявки/стоп-заявки;
3. направление сделки;
4. направление обезличенной сделки.
И забудьте про битовые флаги.
Здравствуйте!
Подскажите, пожалуйста, в какой момент вызывается функция OnTableEvent(), сразу при наступлении события, или если скрипт выполнял другую функцию, то по ее завершению? И после обработки события откуда продолжает выполнение, с места вызова?
Здравствуйте.
событие попадает в хранилище терминала, если в скрипте есть подписка на это событие, то будет вызвана функция OnTableEvent() в потоке терминала, main об этом ничего не знает и продолжает выполнять свой код в штатном режиме
Благодарю.
Значит нужно будет в main включать таблицу очереди событий, т.к. по событию происходит изменение таблицы qlua.
Да, только нужно использовать потокобезопасные table.sinsert /sremove