← Назад

newTrades

Парни подскажите а событие NewTrades синхронно или нет? может ли пока я обрабатываю одно событие прийти следующее и обработаться в другом потоке? Просто у меня возникают ситуация что следующая сделка открывается за 5 секунд до закрытия предыдущей или вообще открываются две сделки с перерывом в пару секунд хотя еще одного сигнала на вход не возникало... как вообще работает это событие? раньше немного уже спрашивал про событие обновления стакана, там тоже был ньюанс в том что в обработчик события передается не копия текущего состояния стакана а ссылака на живой стакан и пока я его обрабатываю в обрабочике данные в переданной мне в обрабочик стакане меняются что конечноже бред ну да лано победил клонированием и работой клоном.. Может тут тоже такая же мулька?

Комментарии (21)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

ra81
ra81

rminko: Парни подскажите а событие NewTrades синхронно или нет? может ли пока я обрабатываю одно событие прийти следующее и обработаться в другом потоке? Просто у меня возникают ситуация что следующая сделка открывается за 5 секунд до закрытия предыдущей или вообще открываются две сделки с перерывом в пару секунд хотя еще одного сигнала на вход не возникало... как вообще работает это событие? раньше немного уже спрашивал про событие обновления стакана, там тоже был ньюанс в том что в обработчик события передается не копия текущего состояния стакана а ссылака на живой стакан и пока я его обрабатываю в обрабочике данные в переданной мне в обрабочик стакане меняются что конечноже бред ну да лано победил клонированием и работой клоном.. Может тут тоже такая же мулька? Ну это событие должно передоваться последовательно. То есть завешав обработчик получить следующее будет невозможно.

rminko
rminko Автор

Это хорошо если синхронно. Вчера провел несколько опытов и тоже понял что синхронно. А проблема с различием времени открытия и закрытия позы видимо связанна с разницей времени сервера и моего. Только вот беру я его и там и там из сделки,ну это ладно победю... не понятно остается откуда еще могут быть сделки без сигнала

ra81
ra81

rminko: Это хорошо если синхронно. Вчера провел несколько опытов и тоже понял что синхронно. А проблема с различием времени открытия и закрытия позы видимо связанна с разницей времени сервера и моего. Только вот беру я его и там и там из сделки,ну это ладно победю... не понятно остается откуда еще могут быть сделки без сигнала

Такое может быть если время открытия сделки берется и с сервера и с локального времени. В коннекторах я замечал что время отмеряется локально а не берется с сервера самого. С ммоента старта коннектора время отмеряется локально после синхронизации стартовой. Это может быть причиной. Хотя не до конца понял в чем расхождение времени.

rminko
rminko Автор

с расхождением разобрался реально из-за разницы времени локального компа и квика. а вот сделки без причинные не понятны... но явно не из-за врени так как разница локального и квиковского времени всего 4-5 сек. а сигнала нет в радиусе как минимум 1-2 минут. могут ли сделки приходить не в прямом порядке например при тормозах?

ra81
ra81

rminko: с расхождением разобрался реально из-за разницы времени локального компа и квика. а вот сделки без причинные не понятны... но явно не из-за врени так как разница локального и квиковского времени всего 4-5 сек. а сигнала нет в радиусе как минимум 1-2 минут. могут ли сделки приходить не в прямом порядке например при тормозах?

На альфа директе замечено, что порой ответ о сделке и исполнении ордера может задерживаться на длительное время. Даже на час другой. Это явно связано с терминалом или сервером альфы. Как на квике, не скажу нужны спецы по квику.

rminko
rminko Автор

ra81:

rminko: с расхождением разобрался реально из-за разницы времени локального компа и квика. а вот сделки без причинные не понятны... но явно не из-за врени так как разница локального и квиковского времени всего 4-5 сек. а сигнала нет в радиусе как минимум 1-2 минут. могут ли сделки приходить не в прямом порядке например при тормозах?

На альфа директе замечено, что порой ответ о сделке и исполнении ордера может задерживаться на длительное время. Даже на час другой. Это явно связано с терминалом или сервером альфы. Как на квике, не скажу нужны спецы по квику.

Речь шла о таблице всех сделок, а не о моих сделок. Но вопрос о правильной обработки собственных сделок и заявок тоже актуален. Сейчас думаю над задачей управления позицией:

Как обычно это реализуется, может есть что почитать? Так как пока не могу придумать никакого толкового алгоритма открытия/закрытия позы что бы полностью исключить риск того что реальная поза окажется отличной от той что "подразумевает" робот

Хотел уточнить кстати по порядку возникновения событий, в описании что-то не понял.

Существует 3 возможных результата после отправки заявки на биржу.

  1. Заявка отклонена биржей (ГО не хватает, объем или цена неверные, биржа не работает, связь отрублена и т.д.) в этом случае я так понимаю прийдет OrdersRegisterFailed? для неработающей биржи или отсутствии связи с биржей это событие не придет?

  2. Заявка регистрируется в системе и появляется в стакане - ну тут придет NewOrders, с этим ясно

  3. Заявка исполняется сразу (по рынку кинули например). Вот тут не понятно, придет И NewOrders и OrdersChanged и NewPosition/ChangePosition и в каком порядке? я так понимаю в любом? или первое событие не возникнет?

ra81
ra81

rminko:

ra81:

rminko: с расхождением разобрался реально из-за разницы времени локального компа и квика. а вот сделки без причинные не понятны... но явно не из-за врени так как разница локального и квиковского времени всего 4-5 сек. а сигнала нет в радиусе как минимум 1-2 минут. могут ли сделки приходить не в прямом порядке например при тормозах?

На альфа директе замечено, что порой ответ о сделке и исполнении ордера может задерживаться на длительное время. Даже на час другой. Это явно связано с терминалом или сервером альфы. Как на квике, не скажу нужны спецы по квику.

Речь шла о таблице всех сделок, а не о моих сделок. Но вопрос о правильной обработки собственных сделок и заявок тоже актуален. Сейчас думаю над задачей управления позицией:

Как обычно это реализуется, может есть что почитать? Так как пока не могу придумать никакого толкового алгоритма открытия/закрытия позы что бы полностью исключить риск того что реальная поза окажется отличной от той что "подразумевает" робот

Хотел уточнить кстати по порядку возникновения событий, в описании что-то не понял.

Существует 3 возможных результата после отправки заявки на биржу.

  1. Заявка отклонена биржей (ГО не хватает, объем или цена неверные, биржа не работает, связь отрублена и т.д.) в этом случае я так понимаю прийдет OrdersRegisterFailed? для неработающей биржи или отсутствии связи с биржей это событие не придет?

  2. Заявка регистрируется в системе и появляется в стакане - ну тут придет NewOrders, с этим ясно

  3. Заявка исполняется сразу (по рынку кинули например). Вот тут не понятно, придет И NewOrders и OrdersChanged и NewPosition/ChangePosition и в каком порядке? я так понимаю в любом? или первое событие не возникнет?

Для квика если сервер не доступен, полагаю ничего не прийдет :). Но это лучше уточнить у квикеров :).

Порядок прихода событий по сделке не должен иметь значения ибо может идти с разных потоков. Я лично просто жду событие NewMyTrade и OrderMatched. Это однозначно показывает что ордер исполнился. Хотя по факту если ордер исполнился сделка уже явно совершилась на бирже.Размер позиции будет равен тому, сколько в ордере исполнилось. То есть объем исполненный в ордере. NewOrders - всегда есть для ордера. OrdersChanged - всегда есть для ордера который изменился. Если исполнился то событие есть. Смотреть исполнение ордера по ChangePosition думаю нецелесообразным.

rminko
rminko Автор

ra81: Хотя по факту если ордер исполнился сделка уже явно совершилась на бирже.Размер позиции будет равен тому, сколько в ордере исполнилось. То есть объем исполненный в ордере. Не совсем согласен. Разве не может быть ситуации в которой заявка исполнилась, а информация о позиции еще не обновилась... То-есть если я в обработчике orderchanged вижу что у заявки статус - done и баланс 0- значит весь объем съели, но если я тут же проверю состояние позиции по инструменту то вполне могу получить что позиция еще не изменилась... или нет?

ra81
ra81

rminko:

ra81: Хотя по факту если ордер исполнился сделка уже явно совершилась на бирже.Размер позиции будет равен тому, сколько в ордере исполнилось. То есть объем исполненный в ордере. Не совсем согласен. Разве не может быть ситуации в которой заявка исполнилась, а информация о позиции еще не обновилась... То-есть если я в обработчике orderchanged вижу что у заявки статус - done и баланс 0- значит весь объем съели, но если я тут же проверю состояние позиции по инструменту то вполне могу получить что позиция еще не изменилась... или нет?

Я такого и не утверждал. Я только сказал что если в ордере изменился исполненный объем, значит заявка была исполнена. Остальные параметры можно не проверять. А позиция по факту может и не измениться да, ее обычно брокер или просто сам терминал считает.

Еще сейчас подумал - и еще больше подводных камней нашел. Например совершенно непонятно как разрулить через NewMyOrders и OrderChanged ситуацию когда отправлена заявка на вход в позицию, но еще не пришли никакие события о регистрации этой заявки, а уже поступает сигнал на выход или на переворот. вообщем надо закрывать предыдущую сделку а еще не понятно она вообще есть или заявка в стакане висит или отклонена биржей..... Походу все-таки надо через PositionChanged отслеживать текущую позицию и реализовать какой-то класс синхронизатор который будет смотреть какую позу подразумевает робот а какая реально есть на бирже и синхронизирует их. Интересно как другие контролируют позу? Или так же на авось и периодически синхронизируют? Если у вас такое происходит, меняйте брокера итд. Нельзя посылать сигналы не получая ответа, этак теряется обратная связь. Следовательно вам просто нужен более быстрый канал до биржи.

rminko
rminko Автор

Еще сейчас подумал - и еще больше подводных камней нашел. Например совершенно непонятно как разрулить через NewMyOrders и OrderChanged ситуацию когда отправлена заявка на вход в позицию, но еще не пришли никакие события о регистрации этой заявки, а уже поступает сигнал на выход или на переворот. вообщем надо закрывать предыдущую сделку а еще не понятно она вообще есть или заявка в стакане висит или отклонена биржей..... Походу все-таки надо через PositionChanged отслеживать текущую позицию и реализовать какой-то класс синхронизатор который будет смотреть какую позу подразумевает робот а какая реально есть на бирже и синхронизирует их. Интересно как другие контролируют позу? Или так же на авось и периодически синхронизируют?

Kalikazandr
Kalikazandr

rminko: Еще сейчас подумал - и еще больше подводных камней нашел. Например совершенно непонятно как разрулить через NewMyOrders и OrderChanged ситуацию когда отправлена заявка на вход в позицию, но еще не пришли никакие события о регистрации этой заявки, а уже поступает сигнал на выход или на переворот. вообщем надо закрывать предыдущую сделку а еще не понятно она вообще есть или заявка в стакане висит или отклонена биржей..... Походу все-таки надо через PositionChanged отслеживать текущую позицию и реализовать какой-то класс синхронизатор который будет смотреть какую позу подразумевает робот а какая реально есть на бирже и синхронизирует их. Интересно как другие контролируют позу? Или так же на авось и периодически синхронизируют?

здрасте всем. чтото Вы тут огород огородите. тут нет никакой проблемы, если Вы внимательно почитаете встроенную справку по купайлу в квике, то там есть описания функций, с помощью которых оч легко осуществить такой контроль, а робота Вашего надо заставить не делать последующих выставлений ордеров без получения положительного ответа от биржи. по поводу разницы по времени: 1 сек серверного времени = 1000милисек, что означает 1000 ордеров/сек, если их пришло больше, то в табл всех сделок Вы увидете недалекое будущее, я замечал до 5 сек реального времени, как то так.

rminko
rminko Автор

Kalikazandr: здрасте всем. чтото Вы тут огород огородите. тут нет никакой проблемы, если Вы внимательно почитаете встроенную справку по купайлу в квике, то там есть описания функций, с помощью которых оч легко осуществить такой контроль, а робота Вашего надо заставить не делать последующих выставлений ордеров без получения положительного ответа от биржи. по поводу разницы по времени: 1 сек серверного времени = 1000милисек, что означает 1000 ордеров/сек, если их пришло больше, то в табл всех сделок Вы увидете недалекое будущее, я замечал до 5 сек реального времени, как то так.

Спасибо, за Ваш ответ, но помоймы Вы не допоняли суть вопроса. Не проблема заставить робота не посылать заявки пока не прояснится состояние отправленной. Проблема в том что когда робот отправляет заявку, он подразумевает что находится в определенной позиции на данных момент или что заявка отправленная ранее находится в определенном состоянии. Так вот это "подразумевание" может очень сильно отличаться от суровой реальности пример:

  1. робот без позиции.
  2. приходит сигнал на лонг
  3. отправляем заявку на покупку
  4. приходит событие что заявка встала в стакан и ее еще никто не кушал
  5. приходит сигнал на шорт
  6. робот снимает лонговую заявку и отправляет шортовую заявку
  7. приходит событие что снять лонговую заявку не удалось, так как в момент отмены она исполнилась (ну и все остальные события приходят с этим связанные)
  8. приходит событие что шортовая заявка исполнилась приведя позицию в нейтральное состояние (из-за исполнившейся лонговой), вместо того что бы создать шортовую позу....

Вот как-то так. Получается робот как в рекламе "все правильно сделал"? а поза неправильная и ее надо приводить к правильной. Вариант разделить 6 пункт еще на 2, в первом снимаем заявку, а во втором действуем на основе результата снятия, но это не подходит так как хоть робот и не HFT и имеет всего несколько сделок в час. но все-равно скорость реакции на сигнал у него критически важный показатель, поэтому ждать секунду пока придет ответ о снятии заявки непозволительная роскошь.

Но все равно спасибо за Ваш пост. Пока писал ответ уже кое-что надумал по этому поводу. Завтра буду тестировать.

Kalikazandr
Kalikazandr

привет! хз-хз HFT априори нельзя сделать на купайле в виду отсутствия функций перехода go to стр. 300, а так же не корректной работе функций break и return. Скальперские стратегии, думаю, равнозначно приносят прибыль и убытки, не знаю ни одного дейтрейдера, который похвастал историческими данными(за месяц) по скальперству, приносящее на круг хотя бы 1% в день. Играть в шорт вообще нельзя без четкой стратегии и логики. Необходимо научится торговать в лонг, а уж потом репу чесать как использовать заемные средства. И совет: не пользуйтесь встроенными индикаторами - они не работают корректно в начале торговой сессии. У меня робот делает 0-3 сделки по инструменту в день и времени с момента получения сигнала на вход, до самого входа занимает от 1 сек до 30 мин.(предостаточно) + предусмотрено ручное снятие/выставление заявок, робот подхватывает их на лету, А в Вашем случае поставьте ожидание ответа от биржи 300 милисек после отправки транзакции и будет счастье или воспользуйтесь встроенным отправщиком заявок из файла. Ниже код для проверки состояния заявки по текущему инструменту '=БЛОК ПРОВЕРКИ СТАТУСА ЗАЯВКИ!!!====== ' ЗАПРЕТ НА ПОКУПКУ ПРИ АКТИВНОЙ ЗАЯВКЕ F=GET_NUMBER_OF("ORDERS")-1'метод обратного просмотра FLAG=0'==========ФЛАГ АКТИВНОЙ ЗАЯВКИ НА ПОКУПКУ/ПРОДАЖУ CENA=0 NUMBER=0 IF F<0 ' ======================ЕСЛИ ТАМ ЧТО-ТО ЕСТЬ, ТО FOR O FROM F TO 0 O2=O-1 Strk = GET_ITEM ("ORDERS", O2) INSTRUMENT1 = GET_VALUE (Strk, "SECCODE") IF INSTRUMENT1=seccode IF GET_VALUE (GET_ITEM ("ORDERS", O2), "STATUS")="ACTIVE" FLAG=1 'ЕСТЬ АКТИВНЫЕ CENA=GET_VALUE (GET_ITEM ("ORDERS", O2), "PRICE") NUMBER=GET_VALUE (GET_ITEM ("ORDERS", O2), "NUMBER") ST = Set_Value(ST, "CENA",CENA) ST=set_value(ST,"FLAG",FLAG) BREAK ELSE FLAG=0 'АКТИВНЫХ НЕТ!!! BREAK END IF END IF END FOR END IF Засеките время расчета Вашего портфеля: PROGRAM DATATIME=GET_DATETIME() TIMEMILI1=SUBSTR(DATATIME,21,12) ТЕЛО ПРОГРАММЫ DATATIME=GET_DATETIME() TIMEMILI2=SUBSTR(DATATIME,21,12) END PROGRAM В общем, если интересно пишите в личку. И помните! изначально торговля придумана с одной логикой не убиенной: нае...би ближнего своего)) и биржа прямое тому доказательство.

rminko
rminko
rminko Автор

Всем спасибо. Пришел к компромиссному варианту действий...

Добавил: Только теперь появилась новая проблема. когда робот в позицию входит - все нормально, а когда через несколько минут отсылает заявку на выход, то получает исключение на ITrader.RegisterOrder(order) - точно не помню, но что-то там DLLNotConnected. кто сталкивался с таким?

Еще добавил. порыл форум и доки. То-есть получается что мне надо проверять isConnected и если нет то connect и заново запускать весь экспорт со всеми вытекающими?? это же бред. У меня сохранена заявка по которой я вошел в позу и при запуске экспорта все это добро придет заново.... причем заявки еще ладно их можно по статусу отфильтровать. а как же сделки? как я пойму что это сделку я уже учитывал в расчете позы и теперь она пришла повторно из-за дисcконнекта.... хранить список сделок которые учитывал? Бред ведь? почему бы не инкапсулировать как-то этот момент внутри S#? что-то загнал меня печаль этот "баг".

ra81
ra81

rminko: Всем спасибо. Пришел к компромиссному варианту действий...

Добавил: Только теперь появилась новая проблема. когда робот в позицию входит - все нормально, а когда через несколько минут отсылает заявку на выход, то получает исключение на ITrader.RegisterOrder(order) - точно не помню, но что-то там DLLNotConnected. кто сталкивался с таким?

Еще добавил. порыл форум и доки. То-есть получается что мне надо проверять isConnected и если нет то connect и заново запускать весь экспорт со всеми вытекающими?? это же бред. У меня сохранена заявка по которой я вошел в позу и при запуске экспорта все это добро придет заново.... причем заявки еще ладно их можно по статусу отфильтровать. а как же сделки? как я пойму что это сделку я уже учитывал в расчете позы и теперь она пришла повторно из-за дисcконнекта.... хранить список сделок которые учитывал? Бред ведь? почему бы не инкапсулировать как-то этот момент внутри S#? что-то загнал меня печаль этот "баг".

Насколько язнаю есть такая фича как ReconnectionSettings которая автоматом делает реконнект коннектора и рестарт экспорта если нужно. Те заявки которые уже есть в трейдере придут заново но не будут сгенерены события что это новые заявки и сделки. Так что ничего страшного не произойдет. Это вполне штатная ситуация когда рестарт экспорта происходит. Все сделки заявки итд что уже были в трейдере не вызовут события New так что все ок. Это легко проверить тестом. Во всяком случае в моем коннекторе так. Как сделано в квике не знаю, но должно быть так же.

rminko
rminko Автор

ra81: Насколько язнаю есть такая фича как ReconnectionSettings которая автоматом делает реконнект коннектора и рестарт экспорта если нужно. Те заявки которые уже есть в трейдере придут заново но не будут сгенерены события что это новые заявки и сделки. Так что ничего страшного не произойдет. Это вполне штатная ситуация когда рестарт экспорта происходит. Все сделки заявки итд что уже были в трейдере не вызовут события New так что все ок. Это легко проверить тестом. Во всяком случае в моем коннекторе так. Как сделано в квике не знаю, но должно быть так же.

Спасибо. Тоже уже проверил - действительнео если не делать ReStartExport то все ок. единственное до сих пор не понятно что будет если заявка будет отправлено между дисконнектом и реконектом. Я сейчас делаю так перед отпарвкой заявки проверяю isConnected и если все ок просто отправляю если НЕ ок то делаю Reconnect и отпарвляю... достаточно ли этого хз. надо тестить...

ra81
ra81

rminko:

ra81: Насколько язнаю есть такая фича как ReconnectionSettings которая автоматом делает реконнект коннектора и рестарт экспорта если нужно. Те заявки которые уже есть в трейдере придут заново но не будут сгенерены события что это новые заявки и сделки. Так что ничего страшного не произойдет. Это вполне штатная ситуация когда рестарт экспорта происходит. Все сделки заявки итд что уже были в трейдере не вызовут события New так что все ок. Это легко проверить тестом. Во всяком случае в моем коннекторе так. Как сделано в квике не знаю, но должно быть так же.

Спасибо. Тоже уже проверил - действительнео если не делать ReStartExport то все ок. единственное до сих пор не понятно что будет если заявка будет отправлено между дисконнектом и реконектом. Я сейчас делаю так перед отпарвкой заявки проверяю isConnected и если все ок просто отправляю если НЕ ок то делаю Reconnect и отпарвляю... достаточно ли этого хз. надо тестить...

ReStartExport не должен генерировать события new на существующие ордера и заявки. Если это происходит значит это есть баг и надо багрепортить. Максимум должны приходить события на изменение ордеров поскольку они перечитваются и обрабатываются и мы не знаем менялись ли они пока терминал был в отключке. А сделки в принципе не могут изменяться засим по ним вообще ничего не должно приходить если сделка уже есть в трейдере.

По поводу ордеров в отключке: Скорее всего должно прийти событие OrderRegisterFailed потому как терминал должен дать ответ о том что нет подключения к серверу. Во всяком случае Альфа директ дает сигнал об этом и событие приходит.

rminko
rminko Автор

ra81: По поводу ордеров в отключке: Скорее всего должно прийти событие OrderRegisterFailed потому как терминал должен дать ответ о том что нет подключения к серверу. Во всяком случае Альфа директ дает сигнал об этом и событие приходит.

Неее, реч идет не об отваливании связи терминала<->Биржа а об отваливании импорта транзакций Tran2Quik.dll от квика. Тестирую счас робота... что-то все сообщения приходят через раз... то прийдет OnNewTrades то нет.... и соответственно робот думает что не вошел в позу... жаль альтернативы нет...

ra81
ra81

rminko:

ra81: По поводу ордеров в отключке: Скорее всего должно прийти событие OrderRegisterFailed потому как терминал должен дать ответ о том что нет подключения к серверу. Во всяком случае Альфа директ дает сигнал об этом и событие приходит.

Неее, реч идет не об отваливании связи терминала<->Биржа а об отваливании импорта транзакций Tran2Quik.dll от квика. Тестирую счас робота... что-то все сообщения приходят через раз... то прийдет OnNewTrades то нет.... и соответственно робот думает что не вошел в позу... жаль альтернативы нет...

Ну это явно не нормально. Надо разобраться просто. Люди же работают как-то с квиком. А если отвалится импорт транзакций то думаю заявка может пропасть в никуда. Такое иногда вытворяет терминал альфы.

Kalikazandr
Kalikazandr

rminko:

ra81: По поводу ордеров в отключке: Скорее всего должно прийти событие OrderRegisterFailed потому как терминал должен дать ответ о том что нет подключения к серверу. Во всяком случае Альфа директ дает сигнал об этом и событие приходит.

Неее, реч идет не об отваливании связи терминала<->Биржа а об отваливании импорта транзакций Tran2Quik.dll от квика. Тестирую счас робота... что-то все сообщения приходят через раз... то прийдет OnNewTrades то нет.... и соответственно робот думает что не вошел в позу... жаль альтернативы нет...

добрый день. да забейте Вы на этот кривой Tran2Quik.dll. как я уже говорил выше пользоваться надо либо импортом транзакций из файла, либо напрямую посылать ордера и будет Вам щастье великое. и роботина Ваш работать будет шустрее без модуля Tran2Quik.dll.

rminko
rminko Автор

А что имеется ввиду под «посылать ордера напрямую?» я знаю только два способа 1 через TRAN2QUIK.DLL, второй. через файл.