Парни подскажите а событие NewTrades синхронно или нет? может ли пока я обрабатываю одно событие прийти следующее и обработаться в другом потоке? Просто у меня возникают ситуация что следующая сделка открывается за 5 секунд до закрытия предыдущей или вообще открываются две сделки с перерывом в пару секунд хотя еще одного сигнала на вход не возникало... как вообще работает это событие? раньше немного уже спрашивал про событие обновления стакана, там тоже был ньюанс в том что в обработчик события передается не копия текущего состояния стакана а ссылака на живой стакан и пока я его обрабатываю в обрабочике данные в переданной мне в обрабочик стакане меняются что конечноже бред ну да лано победил клонированием и работой клоном.. Может тут тоже такая же мулька?
Комментарии (21)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Это хорошо если синхронно. Вчера провел несколько опытов и тоже понял что синхронно. А проблема с различием времени открытия и закрытия позы видимо связанна с разницей времени сервера и моего. Только вот беру я его и там и там из сделки,ну это ладно победю... не понятно остается откуда еще могут быть сделки без сигнала
Такое может быть если время открытия сделки берется и с сервера и с локального времени. В коннекторах я замечал что время отмеряется локально а не берется с сервера самого. С ммоента старта коннектора время отмеряется локально после синхронизации стартовой. Это может быть причиной. Хотя не до конца понял в чем расхождение времени.
с расхождением разобрался реально из-за разницы времени локального компа и квика. а вот сделки без причинные не понятны... но явно не из-за врени так как разница локального и квиковского времени всего 4-5 сек. а сигнала нет в радиусе как минимум 1-2 минут. могут ли сделки приходить не в прямом порядке например при тормозах?
На альфа директе замечено, что порой ответ о сделке и исполнении ордера может задерживаться на длительное время. Даже на час другой. Это явно связано с терминалом или сервером альфы. Как на квике, не скажу нужны спецы по квику.
Речь шла о таблице всех сделок, а не о моих сделок. Но вопрос о правильной обработки собственных сделок и заявок тоже актуален. Сейчас думаю над задачей управления позицией:
Как обычно это реализуется, может есть что почитать? Так как пока не могу придумать никакого толкового алгоритма открытия/закрытия позы что бы полностью исключить риск того что реальная поза окажется отличной от той что "подразумевает" робот
Хотел уточнить кстати по порядку возникновения событий, в описании что-то не понял.
Существует 3 возможных результата после отправки заявки на биржу.
Заявка отклонена биржей (ГО не хватает, объем или цена неверные, биржа не работает, связь отрублена и т.д.) в этом случае я так понимаю прийдет OrdersRegisterFailed? для неработающей биржи или отсутствии связи с биржей это событие не придет?
Заявка регистрируется в системе и появляется в стакане - ну тут придет NewOrders, с этим ясно
Заявка исполняется сразу (по рынку кинули например). Вот тут не понятно, придет И NewOrders и OrdersChanged и NewPosition/ChangePosition и в каком порядке? я так понимаю в любом? или первое событие не возникнет?
Для квика если сервер не доступен, полагаю ничего не прийдет :). Но это лучше уточнить у квикеров :).
Порядок прихода событий по сделке не должен иметь значения ибо может идти с разных потоков. Я лично просто жду событие NewMyTrade и OrderMatched. Это однозначно показывает что ордер исполнился. Хотя по факту если ордер исполнился сделка уже явно совершилась на бирже.Размер позиции будет равен тому, сколько в ордере исполнилось. То есть объем исполненный в ордере. NewOrders - всегда есть для ордера. OrdersChanged - всегда есть для ордера который изменился. Если исполнился то событие есть. Смотреть исполнение ордера по ChangePosition думаю нецелесообразным.
Я такого и не утверждал. Я только сказал что если в ордере изменился исполненный объем, значит заявка была исполнена. Остальные параметры можно не проверять. А позиция по факту может и не измениться да, ее обычно брокер или просто сам терминал считает.
Еще сейчас подумал - и еще больше подводных камней нашел. Например совершенно непонятно как разрулить через NewMyOrders и OrderChanged ситуацию когда отправлена заявка на вход в позицию, но еще не пришли никакие события о регистрации этой заявки, а уже поступает сигнал на выход или на переворот. вообщем надо закрывать предыдущую сделку а еще не понятно она вообще есть или заявка в стакане висит или отклонена биржей..... Походу все-таки надо через PositionChanged отслеживать текущую позицию и реализовать какой-то класс синхронизатор который будет смотреть какую позу подразумевает робот а какая реально есть на бирже и синхронизирует их. Интересно как другие контролируют позу? Или так же на авось и периодически синхронизируют?
здрасте всем. чтото Вы тут огород огородите. тут нет никакой проблемы, если Вы внимательно почитаете встроенную справку по купайлу в квике, то там есть описания функций, с помощью которых оч легко осуществить такой контроль, а робота Вашего надо заставить не делать последующих выставлений ордеров без получения положительного ответа от биржи. по поводу разницы по времени: 1 сек серверного времени = 1000милисек, что означает 1000 ордеров/сек, если их пришло больше, то в табл всех сделок Вы увидете недалекое будущее, я замечал до 5 сек реального времени, как то так.
Спасибо, за Ваш ответ, но помоймы Вы не допоняли суть вопроса. Не проблема заставить робота не посылать заявки пока не прояснится состояние отправленной. Проблема в том что когда робот отправляет заявку, он подразумевает что находится в определенной позиции на данных момент или что заявка отправленная ранее находится в определенном состоянии. Так вот это "подразумевание" может очень сильно отличаться от суровой реальности пример:
Вот как-то так. Получается робот как в рекламе "все правильно сделал"? а поза неправильная и ее надо приводить к правильной. Вариант разделить 6 пункт еще на 2, в первом снимаем заявку, а во втором действуем на основе результата снятия, но это не подходит так как хоть робот и не HFT и имеет всего несколько сделок в час. но все-равно скорость реакции на сигнал у него критически важный показатель, поэтому ждать секунду пока придет ответ о снятии заявки непозволительная роскошь.
Но все равно спасибо за Ваш пост. Пока писал ответ уже кое-что надумал по этому поводу. Завтра буду тестировать.
привет! хз-хз 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 В общем, если интересно пишите в личку. И помните! изначально торговля придумана с одной логикой не убиенной: нае...би ближнего своего)) и биржа прямое тому доказательство.
Всем спасибо. Пришел к компромиссному варианту действий...
Добавил: Только теперь появилась новая проблема. когда робот в позицию входит - все нормально, а когда через несколько минут отсылает заявку на выход, то получает исключение на ITrader.RegisterOrder(order) - точно не помню, но что-то там DLLNotConnected. кто сталкивался с таким?
Еще добавил. порыл форум и доки. То-есть получается что мне надо проверять isConnected и если нет то connect и заново запускать весь экспорт со всеми вытекающими?? это же бред. У меня сохранена заявка по которой я вошел в позу и при запуске экспорта все это добро придет заново.... причем заявки еще ладно их можно по статусу отфильтровать. а как же сделки? как я пойму что это сделку я уже учитывал в расчете позы и теперь она пришла повторно из-за дисcконнекта.... хранить список сделок которые учитывал? Бред ведь? почему бы не инкапсулировать как-то этот момент внутри S#? что-то загнал меня печаль этот "баг".
Насколько язнаю есть такая фича как ReconnectionSettings которая автоматом делает реконнект коннектора и рестарт экспорта если нужно. Те заявки которые уже есть в трейдере придут заново но не будут сгенерены события что это новые заявки и сделки. Так что ничего страшного не произойдет. Это вполне штатная ситуация когда рестарт экспорта происходит. Все сделки заявки итд что уже были в трейдере не вызовут события New так что все ок. Это легко проверить тестом. Во всяком случае в моем коннекторе так. Как сделано в квике не знаю, но должно быть так же.
Спасибо. Тоже уже проверил - действительнео если не делать ReStartExport то все ок. единственное до сих пор не понятно что будет если заявка будет отправлено между дисконнектом и реконектом. Я сейчас делаю так перед отпарвкой заявки проверяю isConnected и если все ок просто отправляю если НЕ ок то делаю Reconnect и отпарвляю... достаточно ли этого хз. надо тестить...
ReStartExport не должен генерировать события new на существующие ордера и заявки. Если это происходит значит это есть баг и надо багрепортить. Максимум должны приходить события на изменение ордеров поскольку они перечитваются и обрабатываются и мы не знаем менялись ли они пока терминал был в отключке. А сделки в принципе не могут изменяться засим по ним вообще ничего не должно приходить если сделка уже есть в трейдере.
По поводу ордеров в отключке: Скорее всего должно прийти событие OrderRegisterFailed потому как терминал должен дать ответ о том что нет подключения к серверу. Во всяком случае Альфа директ дает сигнал об этом и событие приходит.
Неее, реч идет не об отваливании связи терминала<->Биржа а об отваливании импорта транзакций Tran2Quik.dll от квика. Тестирую счас робота... что-то все сообщения приходят через раз... то прийдет OnNewTrades то нет.... и соответственно робот думает что не вошел в позу... жаль альтернативы нет...
Ну это явно не нормально. Надо разобраться просто. Люди же работают как-то с квиком. А если отвалится импорт транзакций то думаю заявка может пропасть в никуда. Такое иногда вытворяет терминал альфы.
добрый день. да забейте Вы на этот кривой Tran2Quik.dll. как я уже говорил выше пользоваться надо либо импортом транзакций из файла, либо напрямую посылать ордера и будет Вам щастье великое. и роботина Ваш работать будет шустрее без модуля Tran2Quik.dll.
А что имеется ввиду под «посылать ордера напрямую?» я знаю только два способа 1 через TRAN2QUIK.DLL, второй. через файл.