← Voltar

Plaza2

Говорят РТС перешел на плаза 2, и поменял что т отам в строке транзакции. И наш старый робот (написаный дано и не н стокшарпе) стал лажать на тех местах где надо двинуть заявку фортсовую. вы что то об этом знаете?

Este tópico foi útil?

Compartilhar tópico

Comentários (76)

Entrar ou Criar conta, Faça login ou cadastre-se para deixar um comentário

Mikhail Sukhov
Mikhail Sukhov

Я пока не работал с плазовым брокером. Но есть предчувствие, что плаза тут ни при чем.

ustas
ustas

Я работаю с плазовым. Всё нормально, возможно дело в том что было и у меня при переходе на 2.1 - надо использовать Cтратегии для перестановки заявок.

http://groups.google.ru/group/stocksharp/browse_thread/thread/5a31b6dff9d30e05#

Tauler
Tauler Autor

Да в том роботе вообще генерится транзакция и через trans2quik отправляется

и выскакивает ошибка на перемещении.

Tauler
Tauler Autor

вот что нарыл на форуме

http://quik.ru/forum/import/57225/57225/

Tauler
Tauler Autor
Tauler
Tauler Autor

Поступила информация, что сервера М-10 и Резервный у открытия - на Плаза2 и там есть траблы с пеермещением заявок (с транзакцией MOVE_ORDER), а основной - на старом протоколе.

Mikhail Sukhov
Mikhail Sukhov

Я так и не понял, как те сообщения связаны с Вашей ошибкой. Там вполне штатные ситуации, когда меняется формат сообщения от Квик (это надо же было додуматься, парсить текст =) чтобы узнать кол-во) и когда заявка уже не активна на попмент отправки транзакции. Надо писать код, устойчивый к ошибкам. Я по этому как раз и делаю в стратегии перехват ошибок в лог и не сразу останавливаю стратегию, а дают производному классу "одуматься", послав true.

Tauler
Tauler Autor

Это не моя софтина, просто в ней возникла такая ошибка. Причем ошибка такого рода - при попытке перемешщения фортс выдает - Не найдена заявка для перемещения., а сама заявка как висела активная, так и висит.

Mikhail Sukhov
Mikhail Sukhov

Так может это та самя ошибка, когда биржа приняла заявку, а Квик сервер ее еще не схавал?

Tauler
Tauler Autor

а почему тогда именно перемещение, и именно на серверах, кторые на плаза2?

Mikhail Sukhov
Mikhail Sukhov

Увеличение произволительности. Стакан чаще обновляется, заявки быстрее отсылаются, ошибок больше сыпется. Прогресс, что ни говори!

Tauler
Tauler Autor

Так ни одно перемещение не прокатывает. а вот через стокшарп прокатило. Там люди говорят - как-то ответ изменился. тот который через коллбек в trans2quik. вам об этом ничего не известно?

Mikhail Sukhov
Mikhail Sukhov

Нет, я пока на плазу не перешел. Даю шанс обкатать ее другим трейдерам.

Tauler
Tauler Autor

а как в стокшарпе реализован ReRegisterOrder? в общих чертах алшоритм можете обрисовать?

Tauler
Tauler Autor

Такое ощущение, что заявка генерится, но регистрируется

Tauler
Tauler Autor

Режим - асинхронный. версия стокшарпа 2.1, квика 5.17

Mikhail Sukhov
Mikhail Sukhov

ReRegisterOrder? Ды обычно. Вот код:

TransactionBuilder transactionBuilder = oldOrder.CreateMoveTransaction(newOrder); if (this.IsAsyncMode) { this.SendAsyncTransaction(transactionBuilder);

else { this.SendSyncTransaction(newOrder, transactionBuilder, true, true);

Mikhail Sukhov
Mikhail Sukhov

Так я не понял. У Вас где проблема? В S# приложении или не в S#? Если первое, то на каком действии?

Tauler
Tauler Autor

Да я в этом посте 2 проблемы смешал.

в стокшарпе вот трабл при перемещении возник.

Но походу он возникает, когда я пытаюсь переместить выполенную или снятую заявку. в логе Status = NotValidated пишет мне. как нить можно отловить неуспешное перемещение в асинзронном режиме? OrderFailed молчи ткак рыба об лед.

Mikhail Sukhov
Mikhail Sukhov

Так, а какие-нибудь ошибки получаете от Квика?

Tauler
Tauler Autor

Никаких. Единственная информация, по кторой можно хоть что то определитть - в OrderChaged смотреть Status новой заявки - если NotValidated - значит дело труба.

Mikhail Sukhov
Mikhail Sukhov

А новая заявка приходит в OrdersChanged?

Tauler
Tauler Autor

Ну да - только там и можно оперделить что перемещение не прокатило по NotValidated

Mikhail Sukhov
Mikhail Sukhov

А туда приходит oldOrder или newOrder?

Tauler
Tauler Autor

Судя по TransactionID - новая заявка. в NewOrders ее вообще нету.

Mikhail Sukhov
Mikhail Sukhov

А если проверить на ссылочную эквивалентность?

Tauler
Tauler Autor

Кого? при перемещении как я понял в квике физически генерится новая заявка.а старая снимается. и видимо если старую снять не удается - возникает статус NitValidated

Mikhail Sukhov
Mikhail Sukhov

физически генерица в самой бирже. в том числе и новый объект Order в S#. вот интересно, что приходит в OrderChanged - newOrder или oldOrder (те объекты, что передаются в ReRegisterOrder)

Tauler
Tauler Autor

я вызываю Order ReRegisterOrder( Order oldOrder, double price, int volume )

в OrderChanged приходит заявка .кторая возвращается этим методом. Видимо, в случае

void ReRegisterOrder( Order oldOrder, Order newOrder )

в OrderChanged придет newOrder

Mikhail Sukhov
Mikhail Sukhov

Ок, понятно. У этой заявки Id чему равен?

Tauler
Tauler Autor

Нулю конечно. она же NotValidated - биржа ее не приняла, ИД не присвоила.

Mikhail Sukhov
Mikhail Sukhov

Ок, понятно. В принципе ясно, где бага.

Tauler
Tauler Autor

То, что OrderFailed не возникает?

Mikhail Sukhov
Mikhail Sukhov

Да, такую заявку не в OrdersChanged нужно засовывать, а OrdersFailed

Tauler
Tauler Autor

А при успешном перемещении новой заявке TransID не присваивается. это нормально?

Tauler
Tauler Autor

Больше подробностей. ТрансИд = 0 у новой заявки, которая была создана биржей в результате перемещения. и у нее естественно уже есть ордерИд, но нулевой ТрансИд

Mikhail Sukhov
Mikhail Sukhov

Так не может быть, потому что Order.TransactionId генерируется ДО отправки транзакции в Квик. Может в другом проблема?

Tauler
Tauler Autor

Смотрите что происходит. вот кусок моего лога

18:03:51,140 - Orders new count = 1 выставляет мой робот заявку, трансИд ее - 67253

18:03:51,140 - TransID = 67253, Id = 1968290799, Vol = 1, Bal = 1, State = Active, Status = Done 18:03:51,796 - Orders cnanged count = 2 18:03:51,796 - TransID = 67254, Id = 0, Vol = 1, Bal = 0, State = Active, Status = Done 18:03:51,796 - TransID = 67253, Id = 1968290799, Vol = 1, Bal = 1, State = Done, Status = Done тут от отправил транзакцию на перемещение, ТрансИд у этой транзакции на перемещение - 67254

18:03:51,921 - Orders cnanged count = 1 18:03:51,921 - TransID = 67253, Id = 1968290799, Vol = 1, Bal = 1, State = Active, Status = Done 18:03:51,921 - Orders cnanged count = 1 18:03:51,921 - TransID = 67253, Id = 1968290799, Vol = 1, Bal = 1, State = Active, Status = Done 18:03:52,421 - Orders cnanged count = 1 18:03:52,421 - TransID = 67253, Id = 1968290799, Vol = 1, Bal = 1, State = Done, Status = Done 18:03:52,421 - Orders new count = 1 а вот тут БИРЖА прислала новую заявку, кторая была сформирована в результате транзакции 67254 и я думаю так - раз ее сгенерировала биржа, то и ТрансИд будет 0. 18:03:52,421 - TransID = 0, Id = 1968291046, Vol = 1, Bal = 1, State = Active, Status = SentToServer 18:04:04,187 - Orders cnanged count = 1 18:04:04,187 - TransID = 0, Id = 1968291046, Vol = 1, Bal = 0, State = Done, Status = SentToServer 18:05:37,109 - Orders new count = 1 18:05:37,109 - TransID = 0, Id = 1218218312, Vol = 100, Bal = 0, State = Done, Status = SentToServer

я пользуюсь методом в кторы не передаю новую заявку, а передаю стару, цену и объем

Tauler
Tauler Autor

Сейчас попробую метод , в кторы передаются новый и старый ордера

Mikhail Sukhov
Mikhail Sukhov

А в таблице в Квике у нее какой TransID?

Tauler
Tauler Autor

Пустой.

Mikhail Sukhov
Mikhail Sukhov

А это точно заявка, которая была выставлена в результате перемещения? Может это так, которая ручками выставлялась из Квика?

Tauler
Tauler Autor

А вы не таймстампы гляньте - я не успею так резко ручками :) Нет, не ручками. Но гонял я это добро на сервере .торый щас на плаза 2. завтра попробую на старом

Mikhail Sukhov
Mikhail Sukhov

Это явно ошибка Квика. Потому что сама транзакция отлывается с неким номером, но в результате в Квик приходит заявке без номера транзакции. Эта заявка появляется в таблице, и интерпретируется как параллельно созданная. Пора писать в Квик о баге.

Mikhail Sukhov
Mikhail Sukhov

Можете сделать простой тест? Регистрация заявки и ее перерегистрация. Я так думаю, сразу появится пустой TransID в таблице заявок. В качестве подтверждения можете подписаться на ProcessTransaction, чтобы увидеть текст транзакции - там она идет с неким номером. ДДЕ экспорт и прочее для такого примера можно не включать.

Tauler
Tauler Autor

нет такого события в QuikTrader

Tauler
Tauler Autor

Результаты

на основном сервере вот лог (новая заявка с пустым ТрансИД)

Set order Order Id = 0, TransID = 77962203, Status = None, State = SentToServer NewOrders Order Id = 1969350467, TransID = 77962203, Status = Active, State = Done Reregister order Order Id = 0, TransID = 77963500, Status = None, State = SentToServer OrdersChaged Order Id = 0, TransID = 77963500, Status = Active, State = Done Order Id = 1969350467, TransID = 77962203, Status = Done, State = Done

резервный (плаза2)

Set order Order Id = 0, TransID = 78155453, Status = None, State = SentToServer NewOrders Order Id = 1969355042, TransID = 78155453, Status = Active, State = Done Reregister order Order Id = 0, TransID = 78156500, Status = None, State = SentToServer OrdersChaged Order Id = 0, TransID = 78156500, Status = Active, State = Done Order Id = 1969355042, TransID = 78155453, Status = Done, State = Done

но! в новой заявке есть ТрансИД!

Tauler
Tauler Autor

основной сервер

Set order Order Id = 0, TransID = 78353328, Status = None, State = SentToServer NewOrders Order Id = 1969362384, TransID = 78353328, Status = Active, State = Done Reregister order Order Id = 0, TransID = 78354375, Status = None, State = SentToServer OrdersChaged Order Id = 0, TransID = 78354375, Status = Active, State = Done Order Id = 1969362384, TransID = 78353328, Status = Done, State = Done

Новая заявка без трансИД

резервный сервер (говорят плаза2) Set order Order Id = 0, TransID = 78653734, Status = None, State = SentToServer NewOrders Order Id = 1969374406, TransID = 78653734, Status = Active, State = Done Reregister order Order Id = 0, TransID = 78655015, Status = None, State = SentToServer OrdersChaged Order Id = 0, TransID = 78655015, Status = Active, State = Done Order Id = 1969374406, TransID = 78653734, Status = Done, State = Done

И вот тут новая заявка с ТрансИД! (может я ошибаюсь и у открытия резервный по старому, а основной плаза2)

вот такие пироги

Tauler
Tauler Autor

и вдогонку лог с М-10 - на нем тоже ТрансИД сгенерился

Set order Order Id = 0, TransID = 78765765, Status = None, State = SentToServer NewOrders Order Id = 1969380130, TransID = 78765765, Status = Active, State = Done Reregister order Order Id = 0, TransID = 78766796, Status = None, State = SentToServer OrdersChaged Order Id = 0, TransID = 78766796, Status = Active, State = Done Order Id = 1969380130, TransID = 78765765, Status = Done, State = Done

artemox
artemox

Можно уточнить - речь идет о Strategy.OnProcess? У меня часто при каких либо ошибках со стороны брокера стратегия автоматически перезапускается. А как это регулировать я не разобрался.

Tauler
Tauler Autor

Нет, речь совершенно о другом.

Насчет тестов - видите как получается? чудеса в решете - у меня ТрансИД генерится на резервном сервере и м-10 (те что вроде на плаза), но старый робот(не на стокшарпе) как раз на них и не работает, а работает на основном -там, где как раз старый протокол и робот работает

artemox
artemox

С переходом на плазу многие почертыхаются :)

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

Mikhail Sukhov
Mikhail Sukhov

Тоесть, на плазовом сервере как раз и работает S#? А что случилось с обычным?

Mikhail Sukhov
Mikhail Sukhov

Не совсем понял, что это значит - авто перезапуск и ошибки биржи? Какие именно?

Tauler
Tauler Autor

Без понятия. за что купил - за то и продаю. на основном сервере не генерится ид в перемещеной заявке, но робот старый работает, на резервном и м-10 - наоборот. Дать код тестера?

Mikhail Sukhov
Mikhail Sukhov
  1. Не "не генерится", а "не приходит" от сервера. Потому что идентификатор транзакциии генерируется на клиенте. Можете посмотреть, что отсылается в квик через событие

http://stocksharp.com/doc/help/html/E_Ecng_Trading_Quik_QuikTrader_FormatTransaction.htm

  1. Основной не на плазе?
  2. m-10 и резервный - на плазе? В чем их отличие?
Tauler
Tauler Autor

ну в общем нету айдишника :) именно так - основной на старом протоколе , резервный и м-10 на плазе (по крайне мере так саппорт открытия сказал) а как из TransactionBuilder выдрать текст транзакции я так и не понял :)

Mikhail Sukhov
Mikhail Sukhov

TransactionBuilder.GetInstruction(TransactionBuilder.TransactionId)

Tauler
Tauler Autor

На основном генерятся номера транзакций нормально. что то эти черти видимо с ответом намутили.

Mikhail Sukhov
Mikhail Sukhov

Тоесть, на том сервере (я уж запутался, и думаю не только я), где номера не приходили в таблицу заявок, теперь стали приходить?

Tauler
Tauler Autor

Да нет же . я потестил TransactionBuilder.GetInstruction(TransactionBuilder.TransactionId) - в программе номера генерятся , а в квике их как не было так и нет (на основном сервере)

Mikhail Sukhov
Mikhail Sukhov

Ок понятно... И такой вопрос. Это только при перемещении заявки? При регистрации заявки все приходит?

А Вы уже сказали Квику про это? Есть вероятность, что при переходе на плазу поломали старое.

Tauler
Tauler Autor

Только при перемещении. Квику задавал - но они отфутболили стандартным

  • давай журнал транзакций, ответов на транзакции и скрин. а где я им журнал фозьму -я же не через три и тро файлы работаю
Mikhail Sukhov
Mikhail Sukhov

Дык это, скопировать две строчки транзакции. Проверить, что они приводят к баге. Отослать им три и тро файлы со скрином.

Tauler
Tauler Autor

Их самому наклепать или можно откуда то перехватить? из события какого нибудь?

Mikhail Sukhov
Mikhail Sukhov

Вот из этого события можно попробовать вызвать через Reflection internal method для построения транзакции. Например с помощью Ecng.Reflection:

var mi = typeof(TransactionBuilder).GetMembers().where(m => m.ReturnType == typeof(string)); mi.invoke(builder);

artemox
artemox

Вот пример протокола с ошибкой со стороны брокера и последующим перезапуском стратегии

14:05:33.437 MS_RIU0 => Transaction: ACCOUNT=SPBFUT00129; CLIENT_CODE=XXX; TYPE=L; TRANS_ID=55198437; CLASSCODE=SPBFUT; SECCODE=RIU0; ACTION=NEW_ORDER; OPERATION=B; QUANTITY=1; PRICE=144960; 14:05:33.640 MS_RIU0 => System.ArgumentException: Транзакции 'ACCOUNT=SPBFUT00129; CLIENT_CODE=XXX; TYPE=L; TRANS_ID=55198437; CLASSCODE=SPBFUT; SECCODE=RIU0; ACTION=NEW_ORDER; OPERATION=B; QUANTITY=1; PRICE=144960; не была зарегистрирована. Причина '[FORTS] Нехватка средств по брокерской фирме.'. Parameter name: transactionTxt at . (String , OrderStatus& , UInt32& , Double& , String& ) at Ecng.Trading.Quik.QuikTrader. (Order , TransactionBuilder , Boolean , Boolean ) at Ecng.Trading.Quik.QuikTrader.RegisterOrder(Order order) at Ecng.Trading.Algo.Strategy.RegisterOrder(Order order) at My1.MyStrategy.OnProcess() in D:\My1\My1Strategy.cs:line 425 at Ecng.Trading.Algo.Strategy. () 14:05:33.640 MS_RIU0 => MS_RIU0 останавливается. 14:05:34.187 MS_RIU0 => MS_RIU0 остановлена. 14:06:07.296 MS_RIU0 => OnRunning() 14:06:07.296 MS_RIU0 => MS_RIU0 запущена.

Mikhail Sukhov
Mikhail Sukhov

А в чем смысле в перезапуске, если средств недостаточно (заблокированы)?

artemox
artemox

Так в том то и дело, что я умышленно её не перезапускаю (Stop() вызывается только по кнопке) Не понял это поведение библиотеки, поэтому и спрашиваю :(

Mikhail Sukhov
Mikhail Sukhov

Я понял. Стратегия останавливается и в случае ошибки. Отсюда и вопрос

  • зачем ее перезапускать автоматически, когда ошибка не устранена (денег то на счету нет)?
Mikhail Sukhov
Mikhail Sukhov

А понял. Сорри - сразу не догнал.

Mikhail Sukhov
Mikhail Sukhov

Думаю, у Вас где в основном коде (OnProcess Вашей стратегии) идет пересоздание стратегии.

artemox
artemox

Т.е. чтобы стратегия не останавливалась надо небезопасные функции обернуть в try catch (в том числе вызовы некоторых функций S#, RegisterOrder например)

Mikhail Sukhov
Mikhail Sukhov

Подождите, Вы меня запутали. Какой результат Вы ожидаете - чтобы стратегия останавливалась или не останавливалась?

Tauler
Tauler Autor

Вот что мне ответили квики

http://quik.ru/forum/import/58076/58076/

я теперь вообще перестал что либо понимать

получается что наш старый робот работает на основном сервере, который, как утверждает открытие остался на старом протоколе. Но тесты (кторые я написал на стокшарпе) показали, что как раз на основном сервере заявка формируется без трансИД, а на резервном - с ТрансИД. но старый робот на резервном сервре не работает - говорит не найдена заявка для передвижения. мистика какая то.

Mikhail Sukhov
Mikhail Sukhov

Насколько я вижу из ветки, квиковцы еще ничего не ответили. Если имеется ввиду "при перемещении пары заявок UID и TRANS_ID будет проставляться только на одной, во второй заявке эти параметры будут пустыми. " то это не особо важно. Вернее, это как раз правильное и ожидаемое поведением. Удивлен, что раньше было не так. Впрочем, перемещение пару заявок S# не предумсотрено вообще. Перемещается только одна заявка.

Смотрите, у Вас проблема то совсем тривиальна, и связана с плазой косвенно. Не работает основной сервер на старом протоколе? Значит брокер что-то у себя поломал при миграции. Позвоните ему - скажите о проблеме. Предоставьте текст tri и tro. Скрин. Напишите на форум квика. Или им на почту... Я бы действовал так. А та ветка - это результать объединения нескольких проблем в один топик. Думаю, Вас просто не поняли, что за проблема.