Функции обратного вызова, встроенные в QLua

Автор записи: Дмитрий (Admin)

Qlua-основы
Во время работы терминала QUIK в нем происходят различные события, такие, как приход новой обезличенной сделки, выставление заявки, сработал стоп-ордер и т.п. Для того, чтобы своевременно и определенным образом реагировать на эти события, в скрипте QLua можно использовать функции обратного вызова, которые будут выполнять блок кода, расположенного внутри них, в тот момент, когда это событие произойдет.

Для каждого определенного события есть своя предопределенная разработчиками QLua функция!

Функции OnInit(), main() и OnStop() рассматриваются в статье "База скрипта в QLua(Lua)".

Для использования функций в терминале QUIK должны быть открыты соответствующие им таблицы!

OnAccountBalance()
Функция вызывается терминалом 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(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».

OnAccountPosition()
Функция вызывается терминалом 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(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».

OnAllTrade()
Функция вызывается терминалом 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(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».

Пример практического применения данной функции можно посмотреть в данной статье.

OnCleanUp()
Функция вызывается терминалом QUIK при смене сессии и при выгрузке файла qlua.dll

OnClose()
Функция вызывается перед закрытием терминала QUIK.
function OnClose()
 
   -- Здесь можно выполнить какие-то действия перед закрытием
 
end;
OnConnected()
Функция вызывается терминалом QUIK при установлении связи с сервером QUIK.
function OnConnected()
 
   -- Здесь можно выполнить какие-то действия
 
end;
OnDepoLimit()
Функция вызывается терминалом 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;
Результат выполнения данного скрипта при покупке 1 лота SBER:
(161) Заявка N 1592848104 зарегистрирована. Удовлетворено 1
Код бумаги 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]
Результат выполнения данного скрипта при последующей продаже 1 лота SBER:
(161) Заявка N 1592889809 зарегистрирована. Удовлетворено 1
Код бумаги 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;

В местах вывода сообщений данного скрипта можно использовать какую-то обработку изменения позиции.
Прим.: при открытии короткой позиции баланс стает со знаком "минус".

Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: "Сообщения"->"Системные сообщения"->"Таблица сообщений..."). А также, снимите флажок "Показывать окно сообщений" в меню: "Настройки"->"Основные..."->"Сообщения".

OnDepoLimitDelete()
Функция вызывается терминалом 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(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».

OnDisconnected()
Функция вызывается терминалом QUIK при отключении от сервера QUIK.
function OnDisconnected()
 
   -- Здесь можно выполнить какие-то действия
 
end;
OnFirm()
Функция вызывается терминалом 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(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».

OnFuturesClientHolding()
Функция вызывается терминалом 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;
Результат выполнения данного скрипта при покупке 1 контракта RIM5:
15:19:40 Заявка, с биржевым номером 2784694861, успешно зарегистрирована.
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]
Результат выполнения данного скрипта при последующей продаже 1 контракта RIM5:
15:35:39 Заявка, с биржевым номером 2784786164, успешно зарегистрирована.
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;

В местах вывода сообщений данного скрипта можно использовать какую-то обработку изменения позиции.
Прим.: при открытии короткой позиции баланс стает со знаком «минус».

Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: "Сообщения"->"Системные сообщения"->"Таблица сообщений..."). А также, снимите флажок "Показывать окно сообщений" в меню: "Настройки"->"Основные..."->"Сообщения".

OnFuturesLimitChange()
Функция вызывается терминалом 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(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».

OnFuturesLimitDelete()
Функция вызывается терминалом QUIK при удалении лимита по срочному рынку.
Функция возвращает таблицу, поля которой перечислены в примере:

function OnFuturesLimitDelete(lim_del)
 
   message("Код торгового счета "..tostring(lim_del.trdaccid));-- STRING
   message("Тип лимита "..tostring(fut_limit.limit_type));-- STRING
 
end;

Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».

OnMoneyLimit()
Функция вызывается терминалом 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(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».

OnMoneyLimitDelete()
Функция вызывается терминалом 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(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».

OnNegDeal()
Функция вызывается терминалом 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(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».

OnNegTrade()
Функция вызывается терминалом 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(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».

OnOrder()
Функция вызывается терминалом 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(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».

OnParam()
Функция вызывается терминалом 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(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».

OnQuote()
Функция вызывается терминалом QUIK при получении изменения стакана котировок.
С примером использования данной функции можно ознакомиться в этой статье.

OnStopOrder()
Функция вызывается терминалом 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(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».

OnTrade()
Функция вызывается терминалом 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(), используйте таблицу сообщений (меню: «Сообщения»->«Системные сообщения»->«Таблица сообщений…»). А также, снимите флажок «Показывать окно сообщений» в меню: «Настройки»->«Основные…»->«Сообщения».

OnTransReply()
Функция вызывается терминалом 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;
Для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: "Сообщения"->"Системные сообщения"->"Таблица сообщений..."). А также, снимите флажок "Показывать окно сообщений" в меню: "Настройки"->"Основные..."->"Сообщения".

Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!