• 02 февраля 2017, 10:56
    • |
    • Igr
  • Еще

QLua, подскажите, выставляю заявку она сразу срабатывает, совершается сделка и 3 раза срабатывает OnTrade, в чём их отличия? после какого OnTrade можно считать что сделка прошла и лимиты поменялись?

★2
ВНИМАНИЕ! КОММЕНТАРИИ ПЕРВОГО УРОВНЯ В ВОПРОСАХ УПОРЯДОЧИВАЮТСЯ ПО ЧИСЛУ ПЛЮСИКОВ, А НЕ ПО ВРЕМЕНИ ПУБЛИКАЦИИ.
«Обновляемая сделка — это значит, что некоторые поля сделки могут меняться, в частности на некоторых рынках сделки теперь можно отменять, а следовательно будет изменен статус сделки, заполнится поле UID пользователя отказавшегося от сделки и так далее, TRANS_ID теперь присутствует как в структуре заявки так и в структуре сделки. В связи с этими изменениями OnTrade() как и OnOrder() теперь может вызываться более одного раза, даже если визуально никакие поля не поменялись, т.к. не все поля структуры сделки видны через QLua.»
Цитата с форума QUIK: forum.quik.ru/forum10/topic2488/
avatar
1 заявка принята
2 заявка исполнена
и третье не знаю-надо кусок кода
avatar
Vladimir, 

02/02/17 13:03:23Выполняется функция OnTrade при получении сделки (Таблица сделок) время=2079.677
02/02/17 13:03:23Номер сделки в торговой системе 3052996
02/02/17 13:03:23Номер заявки в торговой системе 90341058
02/02/17 13:03:23Комментарий SPBFUT00361
02/02/17 13:03:23Идентификатор трейдера
02/02/17 13:03:23Идентификатор дилера SPBFUT11
02/02/17 13:03:23Торговый счет SPBFUT00361
02/02/17 13:03:23Цена 13179
02/02/17 13:03:23Количество бумаг в последней сделке в лотах 1
02/02/17 13:03:23Объем в денежных средствах 13179
02/02/17 13:03:23Накопленный купонный доход 0
02/02/17 13:03:23Доходность 0
02/02/17 13:03:23Код расчетов
02/02/17 13:03:23Код фирмы партнера
02/02/17 13:03:23Набор битовых флагов 68
02/02/17 13:03:23Сработал OnTrade Заявка не активна!!
02/02/17 13:03:23Сработал OnTrade Заявка исполнена!!
02/02/17 13:03:23Цена выкупа 0
02/02/17 13:03:23Ставка РЕПО (%) 0
02/02/17 13:03:23Код клиента SPBFUT00361
02/02/17 13:03:23Доход (%) на дату выкупа 0
02/02/17 13:03:23Сумма РЕПО 0
02/02/17 13:03:23Объем выкупа РЕПО 0
02/02/17 13:03:23Начальный дисконт (%) 0
02/02/17 13:03:23Нижний дисконт (%) 0
02/02/17 13:03:23Верхний дисконт (%) 0
02/02/17 13:03:23Блокировка обеспечения 0
02/02/17 13:03:23Клиринговая комиссия (ММВБ) 0
02/02/17 13:03:23Комиссия Фондовой биржи (ММВБ) 0.25
02/02/17 13:03:23Комиссия Технического центра (ММВБ) 0
02/02/17 13:03:23Дата расчетов 20170202
02/02/17 13:03:23Валюта расчетов
02/02/17 13:03:23Валюта SUR
02/02/17 13:03:23Код биржи в торговой системе
02/02/17 13:03:23Идентификатор рабочей станции
02/02/17 13:03:23Код бумаги заявки SPH7
02/02/17 13:03:23Код класса SPBFUT
02/02/17 13:03:23Дата и время table: 09CC6460
02/02/17 13:03:23Идентификатор расчетного счета/кода в клиринговой организации
02/02/17 13:03:23Комиссия брокера 0
02/02/17 13:03:23Номер витринной сделки в Торговой Системе 0
02/02/17 13:03:23Период торговой сессии 1
02/02/17 13:03:23 Сотояние робота стало=Сделка сработала сделка прошла №=3052996 по заявке №=90341058 время= 2079.677

02/02/17 13:03:23Выполняется функция OnTrade при получении сделки (Таблица сделок) время=2079.677
02/02/17 13:03:23Номер сделки в торговой системе 3052996
02/02/17 13:03:23Номер заявки в торговой системе 90341058
02/02/17 13:03:23Комментарий SPBFUT00361
02/02/17 13:03:23Идентификатор трейдера
02/02/17 13:03:23Идентификатор дилера SPBFUT11
02/02/17 13:03:23Торговый счет SPBFUT00361
02/02/17 13:03:23Цена 13179
02/02/17 13:03:23Количество бумаг в последней сделке в лотах 1
02/02/17 13:03:23Объем в денежных средствах 13179
02/02/17 13:03:23Накопленный купонный доход 0
02/02/17 13:03:23Доходность 0
02/02/17 13:03:23Код расчетов
02/02/17 13:03:23Код фирмы партнера
02/02/17 13:03:23Набор битовых флагов 68
02/02/17 13:03:23Сработал OnTrade Заявка не активна!!
02/02/17 13:03:23Сработал OnTrade Заявка исполнена!!
02/02/17 13:03:23Цена выкупа 0
02/02/17 13:03:23Ставка РЕПО (%) 0
02/02/17 13:03:23Код клиента SPBFUT00361
02/02/17 13:03:23Доход (%) на дату выкупа 0
02/02/17 13:03:23Сумма РЕПО 0
02/02/17 13:03:23Объем выкупа РЕПО 0
02/02/17 13:03:23Начальный дисконт (%) 0
02/02/17 13:03:23Нижний дисконт (%) 0
02/02/17 13:03:23Верхний дисконт (%) 0
02/02/17 13:03:23Блокировка обеспечения 0
02/02/17 13:03:23Клиринговая комиссия (ММВБ) 0
02/02/17 13:03:23Комиссия Фондовой биржи (ММВБ) 0.25
02/02/17 13:03:23Комиссия Технического центра (ММВБ) 0
02/02/17 13:03:23Дата расчетов 20170202
02/02/17 13:03:23Валюта расчетов
02/02/17 13:03:23Валюта SUR
02/02/17 13:03:23Код биржи в торговой системе
02/02/17 13:03:23Идентификатор рабочей станции
02/02/17 13:03:23Код бумаги заявки SPH7
02/02/17 13:03:23Код класса SPBFUT
02/02/17 13:03:23Дата и время table: 076D8F40
02/02/17 13:03:23Идентификатор расчетного счета/кода в клиринговой организации
02/02/17 13:03:23Комиссия брокера 0
02/02/17 13:03:23Номер витринной сделки в Торговой Системе 0
02/02/17 13:03:23Период торговой сессии 1
02/02/17 13:03:23 Сотояние робота стало=Сделка сработала сделка прошла №=3052996 по заявке №=90341058 время= 2079.677

02/02/17 13:03:23Выполняется функция OnTrade при получении сделки (Таблица сделок) время=2079.677
02/02/17 13:03:23Номер сделки в торговой системе 3052996
02/02/17 13:03:23Номер заявки в торговой системе 90341058
02/02/17 13:03:23Комментарий SPBFUT00361
02/02/17 13:03:23Идентификатор трейдера
02/02/17 13:03:23Идентификатор дилера SPBFUT11
02/02/17 13:03:23Торговый счет SPBFUT00361
02/02/17 13:03:23Цена 13179
02/02/17 13:03:23Количество бумаг в последней сделке в лотах 1
02/02/17 13:03:23Объем в денежных средствах 13179
02/02/17 13:03:23Накопленный купонный доход 0
02/02/17 13:03:23Доходность 0
02/02/17 13:03:23Код расчетов
02/02/17 13:03:23Код фирмы партнера
02/02/17 13:03:23Набор битовых флагов 68
02/02/17 13:03:23Сработал OnTrade Заявка не активна!!
02/02/17 13:03:23Сработал OnTrade Заявка исполнена!!
02/02/17 13:03:23Цена выкупа 0
02/02/17 13:03:23Ставка РЕПО (%) 0
02/02/17 13:03:23Код клиента SPBFUT00361
02/02/17 13:03:23Доход (%) на дату выкупа 0
02/02/17 13:03:23Сумма РЕПО 0
02/02/17 13:03:23Объем выкупа РЕПО 0
02/02/17 13:03:23Начальный дисконт (%) 0
02/02/17 13:03:23Нижний дисконт (%) 0
02/02/17 13:03:23Верхний дисконт (%) 0
02/02/17 13:03:23Блокировка обеспечения 0
02/02/17 13:03:23Клиринговая комиссия (ММВБ) 0
02/02/17 13:03:23Комиссия Фондовой биржи (ММВБ) 0.25
02/02/17 13:03:23Комиссия Технического центра (ММВБ) 0
02/02/17 13:03:23Дата расчетов 20170202
02/02/17 13:03:23Валюта расчетов
02/02/17 13:03:23Валюта SUR
02/02/17 13:03:23Код биржи в торговой системе
02/02/17 13:03:23Идентификатор рабочей станции
02/02/17 13:03:23Код бумаги заявки SPH7
02/02/17 13:03:23Код класса SPBFUT
02/02/17 13:03:23Дата и время table: 076D9058
02/02/17 13:03:23Идентификатор расчетного счета/кода в клиринговой организации
02/02/17 13:03:23Комиссия брокера 0
02/02/17 13:03:23Номер витринной сделки в Торговой Системе 0
02/02/17 13:03:23Период торговой сессии 1
02/02/17 13:03:23 Сотояние робота стало=Сделка сработала сделка прошла №=3052996 по заявке №=90341058 время= 2079.677

avatar
Igr

Vladimir, если заявку кинул по рынку, сразу исполнилась или если выставил заявку а исполнилась через некоторое время, OnTrade чем то отличаются у них?

 

avatar
Igr
это лог а хотелось бы код (спаленный грааль не нужен). просто условие, которое обрабатывает выставленную заявку срабатывает позднее. попробуй sleep вставить после отправки заявки
avatar

Vladimir, у меня так, выставляется заявка, пришёл OnTrade, там проверяю по моему ли фьючу, дальше проверяю флаги и не совпадает ли №сделки, если всё норм то состоянию робота присватваю «Сделка сработала», а в main  если «Сделка сработала» то проверяю наличие активных заявок и лимит, ну и дальше работаю

 

вообще все эти 3 OnTrade должны отличаться по флагам?

avatar
Igr
Igr, У вас 3 онтрейда?
avatar

Vladimir, да, 3 раза приходит сообщение 

вот OnOrder 2 раза приходит, но там понятно в 1 раз нет trans_id, во 2 раз он равен тому что поставил при выставлении заявки 

 

 

avatar
Igr
Igr, нужно наверно один обработчик ставить и в обязательно в колбэк, а не в мейн
avatar

Vladimir, не понял, OnOrder не в мейн стоит

 

avatar
Igr
Igr, в main обработчики вообще противопоказано ставить. тока функции вызывать
avatar

Vladimir, там только подсчёты и сравнения, и функции просмотра таблиц заявок и позиций 

все функции обратного вызова не в майн

avatar
Igr
Igr, 
и функции просмотра таблиц заявок и позиций 
колбэк не пришел и майн не видит позицию
avatar
Vladimir, а в каких случаях колбэк может не прийти на примере OnTrade, если сделка состоялась? 
avatar
Igr
Igr, она приходит. только
1. с запозданием (в это время в мейн делает какие- то телодвижения) 
2 в мейне перед обработкой рез-та выполняются какие-либо действия
Без кода — это разговор глухого со слепым)))
avatar

Vladimir, ну у меня при выставлении заявки статус меняется на «Выслали транзакцию-заявку», и мейн при таком статусе ничего не делает, приходит OnTrade и статус меняется на «Сделка сработала»… вот так пробую сделать

 

а может есть у вас или подскажите где посмотреть простой код на выставлении заявки, отслеживании её, контроль сделки, вся исполнилась заявка нет, отклонена, снята ну и так далее?

то есть без условий входа, выхода 

avatar
Igr
OnTrade всегда обрабатываю на третьем вызове, но с большой вероятностью механизм использования этого колбэка у нас с Вами отличается.
Что касается обработки сделки, то я всегда сначала смотрю на статус заявки, и только после того как она перестает быть активной (отменена или завершена), смотрю в журнал сделок и обрабатываю данные по заявке.
avatar

Prophetic, вы прошла сделка или нет отслеживаете через OnOrder?

а если заявка частично исполнена?

avatar
Igr
Prophetic, 

а может есть у вас или подскажите где посмотреть простой код на выставлении заявки, отслеживании её, контроль сделки, вся исполнилась заявка нет, отклонена, снята ну и так далее?

то есть без условий входа, выхода 

avatar
Igr
Igr, наверное стоит сразу отметить, что я уже достаточно длительное время не пишу на QLua (перешел на С#), поэтому помочь с конкретными примерами на QLua сейчас не смогу, но могу дать несколько рекомендаций:
1. На просторах интернета можно найти библиотеку QL.lua. В ней достаточно много различных полезных функций реализовано, в т.ч. работа с заявками.
2. Я не использую событийную модель работы, т.к. это в значительной степени «нагружало» терминал, при запуске большого количества роботов (возможно, мне просто недоставало знаний для правильной реализации), и поэтому я использую простую циклическую модель, где последовательность функций робота просто зациклена. В такой модели вообще нет необходимости реагировать на колбэки типа OnOrder и OnTrade.
3. Если идти по пути из 2-го пункта, то алгоритм получается несложный:
— При поступлении сигнала (например, на вход в позицию), выставляем заявку
— Если нет ошибки — значит заявка успешно выполнена и можно переходить к следующей части
— В работающем основном цикле отслеживаем статус заявки, и как только она перестала быть активной, проверяем были ли совершены сделки в рамках этой заявки.
— Если сделки были — смотрим в журнал сделок и анализируем все сделки с номером нашей заявки (получаем количество купленных/проданных контрактов, определяем среднюю цену сделки и т.п.)
— больше не следим за заявкой (до следующего раза) 
— фиксируем изменения по позиции, и продолжаем работу по алгоритму

Надеюсь это поможет…

З.Ы.: Да, совсем забыл. в C#, указанные колбэки я использую для обновления соответствующих таблиц (заявок и сделок), хранящихся в роботе, и т.к. у меня одновременно работает несколько десятков роботов, то мне удобнее, чтобы роботы обращались за данными не в терминал, каждый раз перезапрашивая всю таблицу, а смотрели во внутреннюю таблицу и брали данные оттуда.
Это я написал, чтобы Вы поняли почему я сначала пишу, что обрабатываю 3-й по счету колбэк, а потом говорю, что вообще не использую их в роботе.
avatar

Prophetic, 

"— Если нет ошибки — значит заявка успешно выполнена и можно переходить к следующей части" 

а как вы узнаёте есть ошибка или нет?  я вот как раз через ответ OnOrder

«проверяем были ли совершены сделки в рамках этой заявки.» — просматриваете таблицу сделок?

 

avatar
Igr
Igr, 
1. Если я правильно помню, то функция из QL.lua в случае ошибки возвращает текст ошибки, а в случае удачного выставления заявки — то ли ID, то ли номер заявки.
2. по поводу проверки сделок по OnOrder - 
Это хорошо, если вы заявку на 1 контракт выставляете. А если на 50?...
Вот пришел Вам колбэк. Вы залезли в таблицу сделок и увидели, что было совершено 2 сделки по 10 контрактов. И что дальше делать будете?

avatar
Prophetic, пока я использую  OnOrder чисто для информации что сделка прошла, сделка прошла смотрю лимиты как поменялись и если ли активные заявки, если есть активная заявка (частично исполнили 50 контрактов) то жду когда она исполнится дальше или снимется по условию скрипта 
avatar
Igr
Igr, Ну и в чем принципиальное отличие? В любом случае, Вы, также как и я, возвращаетесь к необходимости сначала проверить статус заявки, прежде, чем действовать дальше. Единственное, что можем Вам дать такая работа по колбэку — это более быстрая реакция (и то не всегда), но тут вопрос в том, что за стратегии Вы используете? Для меня, сверхвысокая скорость реакции на обработку сделки не является ключевым фактором.
avatar

Prophetic, мне важно что б скрипт не совершал лишние сделки, то есть проблема в том что б отследить когда сделка уже совершена и лимиты поменялись

как лучше это сделать

постоянно мониторить таблицу заявок? 

avatar
Igr
Igr, не понимаю что такое «лишняя сделка». Если Вы выставили заявку на какое-то количество контрактов — значит именно это количество Вы готовы купить(продать), и лишнего количества не получится никак. Может я неправильно понимаю вопрос? Тогда, попробуйте его перефразировать.
А таблицу заявок я мониторю только до тех пор пока заявка имеет статус «Активна». Если у нас нет активных заявок, то и мониторить нам в этой таблице нечего.
Пока писал ответ пришла одна мысль в голову, в связи с чем хочу сделать важное уточнение: Все действия по отслеживанию заявок и сделок я рассматриваю с точки зрения работы полноценного самодостаточного робота, когда все сделки по инструменту совершаются ТОЛЬКО роботом, без попыток войти в позицию руками, по желанию пользователя (у меня допускается ручное закрытие позиции, но только через отправку соответствующей команды роботу, а не выставлением ручной заявки).
avatar

Prophetic, по уточнению — то есть если вы вручную сделаете сделку измените лимит то робот этого не увидит, то есть изменение лимита он считает у себя внутри, не сверяясь с квиком?

а не легче/правильнее не постоянно мониторить таблицу, а ждать отклика от OnOrder, пока отклика нет соответственно там ничего и не поменялось, из-за постоянного мониторинга квик не виснет ?

 

я выставлял заявку, и мониторил таблицу заявок, но получалось так что заявка уже отправлена а таблица ещё не поменялась, и скрипт выставлял ещё заявки, сейчас выставляю заявку и жду отклик от OnOrder, сверяю №транзакции и только после этого дальнейшая работа 

avatar
Igr
Igr, 
1. скажем так: если количество контрактов на счету изменится без ведома робота, то робот это заметит и выдаст мне в дебаг-лог информацию об обнаруженном несовпадении. Но делать он ничего не будет, т.к. у робота нет никакого понимания происходящего. Пример: у меня было ноль контрактов. Робот об этом знает и ждет сигнала на вход. Тут вдруг появляется информация о том, что на счету появилось 10 контрактов. По какому сигналу они появились? С каким стопом учитывать эту позицию? С каким тейком учитывать эту позицию? Что вообще делать с этими количествами, если они не вписываются в алгоритм стратегии?
2. Бывают варианты, когда несколько роботов на одном и том же счету работают по разным стратегиям с одним и тем же инструментом, и например, когда по факту на счету 0 контрактов, согласно логике пары роботов у одного лонг на 10 контрактов, а у другого шорт на 10 контрактов. Как в этом случае оба робота должны трактовать изменение колчества контрактов на счету, если ни один из них не выдавал сигналы на такие изменения?
3. Мониторинг не постоянный, а только пока активна заявка. Об этом я уже писал.
4. также, я писал, что функция выставления заявки возвращает или ошибку или номер. Соответственно, если возвращена ошибка — можно пытаться заново выставить заявку, а если возвращен номер — значит заявка выставлена, и не важно появилась она уже в таблице заявок или нет. Мы просто начинаем ее там искать (в цикле). Если не нашли — продолжаем искать. Если нашли — проверяем статус.
avatar
Igr, Вот тут https://sourceforge.net/projects/qllib/ лежит QL.lua о котором я писал
avatar
Prophetic, спасибо буду смотреть
avatar
Igr

В БКС? При срабатывании стоп-заявки они одно из событий присылают без TransID. Только мне кажется не OnTrade 3 раза срабатывает, а OnQuote.

avatar

ch5oh, Открытие, ВТБ, думаю это без разницы 

выше ответили почему 3 раза 

OnQuote-Функция вызывается терминалом QUIK при получении изменения стакана котировок.

она вызывается кучу раз)

avatar
Igr
Igr, Да, конечно опечатался. Имел в виду OnOrder.
avatar
ch5oh, он 2 раза приходит
avatar
Igr

Только зарегистрированные и авторизованные пользователи могут оставлять ответы.

Залогиниться

Зарегистрироваться

теги блога Igr

....все тэги



UPDONW
Новый дизайн