← Atrás

Проблемы со сделками, позициями

Судя по всему у некоторых участников на 3.2.xxx появился сабж. Давайте сделаем следующее для поиска причины:

  1. Подпишемся на QuikTrader.ProcessDataError, QuikTrader.PreProcessDdeData, QuikTrader.NewOrders, QuikTrader.OrdersChanged, QuikTrader.OrdersFailed, QuikTrader.NewMyTrades, Strategy.NewOrder, Strategy.OrderChanged, Strategy.NewMyTrades.
  2. Из этих событий сделайте логирование.
  3. У стратегии сделайте логирование. В 3.2.6 стало больше логов, особенно в плане заявок и сделок.

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

¿Le resultó útil este tema?

Compartir tema

Comentarios (60)

Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario

President
President

для удобства логгирования пожелание переопределить ToString у Order, Trade и MyTrade - чтобы они выводили всю полезную для отладки информацию - а то самому приходится методом тыка выбирать что выводить Id, TransactionId, направление, цену, инструмент - и везде это пишеь а потом когда нужное событие возникло оказывается что забыл вывести еще чтото важное ;)

Mikhail Sukhov
Mikhail Sukhov Autor

President: для удобства логгирования пожелание переопределить ToString у Order, Trade и MyTrade - чтобы они выводили всю полезную для отладки информацию - а то самому приходится методом тыка выбирать что выводить Id, TransactionId, направление, цену, инструмент - и везде это пишеь а потом когда нужное событие возникло оказывается что забыл вывести еще чтото важное ;)

ToString сейчас используется для удобного чтения в Debug (например, для портфелей и инструментов). Хотелось бы и для Order + MyTrade это оставить на будущее.

vader
vader

Какую именно информацию выводить?

Mikhail Sukhov
Mikhail Sukhov Autor

vader: Какую именно информацию выводить?

А вот не знаю. Пришлите, посмотрим, хватает ли.

President
President

присоединяюсь к вопросу vader. пока решил выводить id, transactionid, security code, direction, volume, price, time для трейдов и Exception там где он приходит. было бы проще: получил параметр в евент и его и вывожу (он сам умеет выводить через ToString все что нужно для отладки. а если там коллекция то и она както вывелась)

также FYI QuikTrader.PreProcessDdeData событие отсутствует

hobo
hobo

Отправил Вам, Михаил, в личку.

Mikhail Sukhov
Mikhail Sukhov Autor

hobo: Отправил Вам, Михаил, в личку.

Да, получил, спасибо. Будем разбираться.

Mikhail Sukhov
Mikhail Sukhov Autor

Кое-что удалось накопать. Была одна ошибка. Приводила ли она ко всем проблемам найденным пока сложно сказать. В 3.2.11 будет доступен фикс.

Mikhail Sukhov
Mikhail Sukhov Autor

Mikhail Sukhov: Кое-что удалось накопать. Была одна ошибка. Приводила ли она ко всем проблемам найденным пока сложно сказать. В 3.2.11 будет доступен фикс.

Ложная победа. Фикс не поменял ничего, так как он был ошибочным.

Просьба ко всем протестировать с таким PositionManager-ом (устанавливать его через Strategy.PositionManager):

class TraceStrategyPositionManager : StrategyPositionManager
    {
        public TraceStrategyPositionManager(Strategy strategy, bool byOrders)
            : base(strategy, byOrders)
        {
        }
 
        protected override void OnOrderChanged(Order order)
        {
            Trace.WriteLine("SPM: OrderId {0} Volume {1} Balance {2} Pos {3}".Put(order.Id, order.Volume, order.Balance, order.GetPosition()));
            base.OnOrderChanged(order);
        }
    }
Alexander
Alexander

Уже никому не актуально? Проблема сама собой разрешилась?

hobo
hobo

Акутально, я все никак не могу добиться повтора своей "проблемы со сделками, позициями".

Serg
Serg

Подскажите, а что необходимо искать в логах или в чем собственно проблема?

Mikhail Sukhov
Mikhail Sukhov Autor

Serg: Подскажите, а что необходимо искать в логах или в чем собственно проблема?

У вас видимо проблемы нет. Значит вам ее искать не нужно. У других она есть. Нужно понять причину. Как одно из решений для понимания http://stocksharp.com/posts/m/10790/

freelancer
freelancer

Пока что-то вроде этого:

SPM: OrderId 4928838387 Volume 3 Balance 0 Pos -3 SPM: OrderId 4928838387 Volume 3 Balance 0 Pos -3 SPM: OrderId 4928838387 Volume 3 Balance 0 Pos -3 SPM: OrderId 4928838387 Volume 3 Balance 0 Pos -3 SPM: OrderId 4928838387 Volume 3 Balance 0 Pos -3

Mikhail Sukhov
Mikhail Sukhov Autor

freelancer: Пока что-то вроде этого:

SPM: OrderId 4928838387 Volume 3 Balance 0 Pos -3 SPM: OrderId 4928838387 Volume 3 Balance 0 Pos -3 SPM: OrderId 4928838387 Volume 3 Balance 0 Pos -3 SPM: OrderId 4928838387 Volume 3 Balance 0 Pos -3 SPM: OrderId 4928838387 Volume 3 Balance 0 Pos -3

Итоговая поза правильная получается?

freelancer
freelancer

Mikhail Sukhov:

freelancer: Пока что-то вроде этого:

SPM: OrderId 4928838387 Volume 3 Balance 0 Pos -3 SPM: OrderId 4928838387 Volume 3 Balance 0 Pos -3 SPM: OrderId 4928838387 Volume 3 Balance 0 Pos -3 SPM: OrderId 4928838387 Volume 3 Balance 0 Pos -3 SPM: OrderId 4928838387 Volume 3 Balance 0 Pos -3

Итоговая поза правильная получается? да

Mikhail Sukhov
Mikhail Sukhov Autor

freelancer: да

Тогда зачем логи? Интересны логи тогда, когда поза неправильная.

Alexander
Alexander

Прошло 10 дней со дня просьбы о сборе логов среди тех, у кого наблюдались проблемы... 0 ответов. Не ждите когда за вас соберут другие.

hobo
hobo

Сегодня, после долгих 10 дней, стокшарп услышал ваш "родительский" призыв в теме и сбился таки в подсчете позиции😀
Отправил в личку.

Mikhail Sukhov
Mikhail Sukhov Autor

hobo: Сегодня, после долгих 10 дней, стокшарп услышал ваш "родительский" призыв в теме и сбился таки в подсчете позиции😀 Отправил в личку.

Заявки посылаются через одну стратегию или используется дочерние для этого?

hobo
hobo

Mikhail Sukhov: Заявки посылаются через одну стратегию или используется дочерние для этого? Все через одну, Александру подробнее ответил.

Mikhail Sukhov
Mikhail Sukhov Autor

hobo:

Mikhail Sukhov: Заявки посылаются через одну стратегию или используется дочерние для этого? Все через одну, Александру подробнее ответил.

Залил на CodePlex файлы 3.2.12 с возможным фиксом (вероятность что это он очень высока).

Alexander
Alexander

Попутно вопрос ко всем - кто-нибудь наблюдал проблемы с позициями или иными событиями где-нибудь кроме QuikTrader?

freelancer
freelancer

Версия 3.2.11

Сработал стоп.

Лог: 23:17:10.869 | | SPM: OrderId 5098943951 Volume 2 Balance 0 Pos 2 23:17:10.885 | | SPM: OrderId 5098943951 Volume 2 Balance 0 Pos 2

Правило PositionChanged() не выполнилось

Alexander
Alexander

freelancer: Версия 3.2.11

Сработал стоп.

Лог: 23:17:10.869 | | SPM: OrderId 5098943951 Volume 2 Balance 0 Pos 2 23:17:10.885 | | SPM: OrderId 5098943951 Volume 2 Balance 0 Pos 2

Правило PositionChanged() не выполнилось

5098943951 - это стоп заявка или порождённая заявка (Derived order)?

freelancer
freelancer

Alexander:

freelancer: Версия 3.2.11

Сработал стоп.

Лог: 23:17:10.869 | | SPM: OrderId 5098943951 Volume 2 Balance 0 Pos 2 23:17:10.885 | | SPM: OrderId 5098943951 Volume 2 Balance 0 Pos 2

Правило PositionChanged() не выполнилось

5098943951 - это стоп заявка или порождённая заявка (Derived order)? Порождённая

Alexander
Alexander

freelancer:

Alexander:

freelancer: Версия 3.2.11

Сработал стоп.

Лог: 23:17:10.869 | | SPM: OrderId 5098943951 Volume 2 Balance 0 Pos 2 23:17:10.885 | | SPM: OrderId 5098943951 Volume 2 Balance 0 Pos 2

Правило PositionChanged() не выполнилось

5098943951 - это стоп заявка или порождённая заявка (Derived order)? Порождённая

Квик или другой ITrader? С фиксом с codeplex, что 1м постом выше Миша выкладывал, или без оного?

freelancer
freelancer

Alexander:

freelancer:

Alexander:

freelancer: Версия 3.2.11

Сработал стоп.

Лог: 23:17:10.869 | | SPM: OrderId 5098943951 Volume 2 Balance 0 Pos 2 23:17:10.885 | | SPM: OrderId 5098943951 Volume 2 Balance 0 Pos 2

Правило PositionChanged() не выполнилось

5098943951 - это стоп заявка или порождённая заявка (Derived order)? Порождённая

Квик или другой ITrader? С фиксом с codeplex, что 1м постом выше Миша выкладывал, или без оного? Квик. Без фикса. Как его там найти ?

Alexander
Alexander

freelancer:

Alexander:

freelancer:

Alexander:

freelancer: Версия 3.2.11

Сработал стоп.

Лог: 23:17:10.869 | | SPM: OrderId 5098943951 Volume 2 Balance 0 Pos 2 23:17:10.885 | | SPM: OrderId 5098943951 Volume 2 Balance 0 Pos 2

Правило PositionChanged() не выполнилось

5098943951 - это стоп заявка или порождённая заявка (Derived order)? Порождённая

Квик или другой ITrader? С фиксом с codeplex, что 1м постом выше Миша выкладывал, или без оного? Квик. Без фикса. Как его там найти ?

Скачать из папки References

Самунджян Артем
Самунджян Артем

использовал 3.2.11 и были иногда какие то глюки c PositionManager скачал 3.2.12 ,но так же остались проблемы( К сожелениею логи от стокшарпа не использую,но просто хочу сказать ,что помоему проблемы с positionmanager не решили(

С уважением!Спасибо за S#)

Alexander
Alexander

samujan: использовал 3.2.11 и были иногда какие то глюки c PositionManager скачал 3.2.12 ,но так же остались проблемы( К сожелениею логи от стокшарпа не использую,но просто хочу сказать ,что помоему проблемы с positionmanager не решили(

С уважением!Спасибо за S#)

Проблемы при работе с квиком? какую сборку 3.2.12 использовали?

Самунджян Артем
Самунджян Артем

Alexander:

samujan: использовал 3.2.11 и были иногда какие то глюки c PositionManager скачал 3.2.12 ,но так же остались проблемы( К сожелениею логи от стокшарпа не использую,но просто хочу сказать ,что помоему проблемы с positionmanager не решили(

С уважением!Спасибо за S#)

Проблемы при работе с квиком? какую сборку 3.2.12 использовали?

Использовал сборку 3.2.12 ,никаких проблем с квиком не было всё отлично работало.Раньше просто один робот работал на одном инструменте,затем решили использовать несколько роботов на одном инструменте и тут понадобился S# методы,чтобы использовать именно колиечство позиций со стратегии ,а не с одного инструмента.Запускал для теста всё нормально работало,пока местами начали проскальзывать глюки там допустим на счету 2 позиции,а он пишет 3. Затем поставил новую сборку и вот она тоже дала глюк.

Все заявки через стратегию реалицию через this.CreateOrder(......); this.RegisterOrder(order); this.ChildStrategies.Add(mqs);

Alexander
Alexander

samujan:

Alexander:

samujan: использовал 3.2.11 и были иногда какие то глюки c PositionManager скачал 3.2.12 ,но так же остались проблемы( К сожелениею логи от стокшарпа не использую,но просто хочу сказать ,что помоему проблемы с positionmanager не решили(

С уважением!Спасибо за S#)

Проблемы при работе с квиком? какую сборку 3.2.12 использовали?

Использовал сборку 3.2.12 ,никаких проблем с квиком не было всё отлично работало.Раньше просто один робот работал на одном инструменте,затем решили использовать несколько роботов на одном инструменте и тут понадобился S# методы,чтобы использовать именно колиечство позиций со стратегии ,а не с одного инструмента.Запускал для теста всё нормально работало,пока местами начали проскальзывать глюки там допустим на счету 2 позиции,а он пишет 3. Затем поставил новую сборку и вот она тоже дала глюк.

Все заявки через стратегию реалицию через this.CreateOrder(......); this.RegisterOrder(order); this.ChildStrategies.Add(mqs);

Последняя строчка тут не при чём я так понимаю. Попробуйте выше логгер для дебага, скиньте результат его выполнения.

Mikhail Sukhov
Mikhail Sukhov Autor

samujan: Все заявки через стратегию реалицию через this.CreateOrder(......); this.RegisterOrder(order); this.ChildStrategies.Add(mqs);

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

Самунджян Артем
Самунджян Артем

Mikhail Sukhov:

samujan: Все заявки через стратегию реалицию через this.CreateOrder(......); this.RegisterOrder(order); this.ChildStrategies.Add(mqs);

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

Даже если я захожу обычной лимитной заявкой он всё равно не всегда правильно распознаёт кол-во позиций.Причём если бы я что-то неправильно делал,то он скорее всего,всегда бы писал ноль количество позиций.🤨

hobo
hobo

Проблемы со сделками, позициями. Потестировать изменение позиции с помощью указанного PositionManager.

Тестирование с указанным PositionManager-ом уже выполняется, о результатах отпишусь позднее.

для скорейшего нахождения возможных ошибок эту задачу необходимо делать не одному человеку :) Интересно, какие результаты Вы, esper, получили. По моим наблюдениям ошибки в подсчете позиции бывают когда в стратегию не приходит столько же OnOrderChanged, сколько их появляется через QuikTrader.

esper
esper

hobo: Интересно, какие результаты Вы, esper, получили. По моим наблюдениям ошибки в подсчете позиции бывают когда в стратегию не приходит столько же OnOrderChanged, сколько их появляется через QuikTrader.

Все верно, в некоторых случаях, OrderChanged для стратегии не вызывается и PositionManager стратегии не пересчитывает свою позицию. Происходит это, скорее всего, из-за того, что:

  1. в шлюз приходит информация о новой заявке
  2. в шлюз приходит информация о сделке
  3. в шлюз приходит информация что заявка из п.1 изменена
  4. заявка добавляется в стратегию получается, что заявка не успевает добавиться в стратегию до п.3, когда приходит событие изменения заявки, а после того как заявка добавится в стратегию она больше не меняется => не меняется и позиция.

Примерный лог работы:> 14:37:54:8445 | Debug | Trader | Новая заявка id: 966412305 (49537765) state:Done Buy code:RIZ1 price:135280 volume:1

14:37:54:8635 | Debug | Trader | Новая сделка id: 37415401 order id: 966412305 Buy code:RIZ1 price:135255 volume:1 14:37:54:8695 | Debug | Trader | Заявка изменена id: 966412305 (49537765) state:Done Buy code:RIZ1 price:135280 volume:1 14:37:54:8755 | Debug | Trader | Заявка изменена id: 966412305 (49537765) state:Done Buy code:RIZ1 price:135280 volume:1 14:37:54:8775 | Info | RIZ | Новая заявка id: 966412305 (49537765) state:Done Buy code:RIZ1 price:135280 volume:1 14:37:54:9185 | Info | RIZ | Новая сделка id: 37415401 order id: 966412305 Buy code:RIZ1 price:135255 volume:1 14:37:54:9755 | Info | PS | Новая заявка id: 966412305 (49537765) state:Done Buy code:RIZ1 price:135280 volume:1 14:37:55:0305 | Info | PS | Новая сделка id: 37415401 order id: 966412305 Buy code:RIZ1 price:135255 volume:1

P.s. перенесите последние два сообщения в эту тему

sergun
sergun

Мда, грустно все как-то со S#.

4.03. Пользую QuikTrader

Эвент Strategy.OrderChanged действительно не появляется. От греха по-дальше перешел на ITrader.NewOrders и ITrader.OrdersChanged было уже спокойно выдохнул.

Ан нет, порой исполненные либо снятые заявки так и остаются в стейте Active, хоть ты тресни.

Mikhail Sukhov
Mikhail Sukhov Autor

sergun: Мда, грустно все как-то со S#.

4.03. Пользую QuikTrader

Эвент Strategy.OrderChanged действительно не появляется. От греха по-дальше перешел на ITrader.NewOrders и ITrader.OrdersChanged было уже спокойно выдохнул.

Ан нет, порой исполненные либо снятые заявки так и остаются в стейте Active, хоть ты тресни.

А с чего решили, что это S#? Ошибку с позами уже почти локализовали, проверим на этих выхах. Но она явно не связана с вашей ситуацией (вообще из другой оперы). С учетом того, что больше никто о проблеме с Active не писал, вывод напрашивается сам собой.😎

sergun
sergun

Mikhail Sukhov:

sergun: Мда, грустно все как-то со S#.

4.03. Пользую QuikTrader

Эвент Strategy.OrderChanged действительно не появляется. От греха по-дальше перешел на ITrader.NewOrders и ITrader.OrdersChanged было уже спокойно выдохнул.

Ан нет, порой исполненные либо снятые заявки так и остаются в стейте Active, хоть ты тресни.

А с чего решили, что это S#? Ошибку с позами уже почти локализовали, проверим на этих выхах. Но она явно не связана с вашей ситуацией (вообще из другой оперы). С учетом того, что больше никто о проблеме с Active не писал, вывод напрашивается сам собой.😎

Насчет "оперы" не буду судить. Увидел сообщение тов. esper.

Но вот заявочки остаются в Active. Смотрите, вот даже после всего вызываю CancelActiveOrders и в логе возникают сообщения "Вы не можете снять данную заявку". Предположу, что QuikTrader, как и мои обработчики изменения состояния заявок видят их как Active и соответственно CancelActiveOrders пытается их снять. Хотя в квике заявы давно исполнены либо сняты.

Mikhail Sukhov
Mikhail Sukhov Autor

sergun: и в логе возникают сообщения "Вы не можете снять данную заявку". Предположу, что QuikTrader, как и мои обработчики изменения состояния заявок видят их как Active и соответственно CancelActiveOrders пытается их снять.

Не факт. Заявка может быть исполнена на бирже но еще не обновила свой статус у вас на компьютере.

Насчет постоянно висит Active. Запускали пример Sample? Выставляли заявки? Снимали? Статус менялся?

Supervisor
Supervisor

Mikhail Sukhov: Но вот заявочки остаются в Active. Смотрите, вот даже после всего вызываю CancelActiveOrders и в логе возникают сообщения "Вы не можете снять данную заявку". Предположу, что QuikTrader, как и мои обработчики изменения состояния заявок видят их как Active и соответственно CancelActiveOrders пытается их снять. Хотя в квике заявы давно исполнены либо сняты. Подтвержу, у меня так же. За сессию исполненные active заявочки накапливаются, и при вызове CancelOrders на каждую такую выводится ошибка. Сегодня будет время - попробую sample и с фильтром Balance = 0 снимать что получится.

Mikhail Sukhov
Mikhail Sukhov Autor

Supervisor: Подтвержу, у меня так же.

Запускали пример Sample? Выставляли заявки? Снимали? Статус менялся?

Supervisor
Supervisor

Mikhail Sukhov:

Supervisor: Подтвержу, у меня так же. Запускали пример Sample? Выставляли заявки? Снимали? Статус менялся? Там все нормально, локализовал проблему:


foreach (var order in Trader.Orders)
{
	if (order.Portfolio == Portfolio && order.State == OrderStates.Active)
	{
		DebugMessage("ORDER ID " + order.Id + " STATE " + order.State + " BALANCE " + order.Balance);
		Trader.CancelOrder(order);
	}
}

Данный код помимо активных заявок выводит и сработавшие заявки со статусом Active. Why?

Mikhail Sukhov
Mikhail Sukhov Autor

Supervisor: Данный код помимо активных заявок выводит и сработавшие заявки со статусом Active. Why?

Потому что у вас почему то заявки не меняют свой статус на Done. В Sample раз все работает, значит ошибка у вас.

VirKato
VirKato

Mikhail Sukhov:

Supervisor: Данный код помимо активных заявок выводит и сработавшие заявки со статусом Active. Why?

Потому что у вас почему то заявки не меняют свой статус на Done. В Sample раз все работает, значит ошибка у вас.

Михаил. Sample запускал, работает. Мой код тоже работает и статусы меняются. Но, не всегда: заявки обновляются каждую секунду (reregister) и периодически некоторые заявки, которые по факту уже сняты (например сравнивая с таблицей в квике), так и остаются висеть активными. Процент этих заявок не большой (на вскидку <4%). Есть ли возможность принудительно поставить статус done для определенной заявки в Trader.Orders?

Supervisor
Supervisor

Долго ковырялся, нашел причину - не был запущен DDE экспорт по таблице заявок.

Mikhail Sukhov
Mikhail Sukhov Autor

На КодеПлексе лежит залеченная версия Algo. Она решает проблему с позициями. Просьба проверить ее.

sergun
sergun

Mikhail Sukhov: На КодеПлексе лежит залеченная версия Algo. Она решает проблему с позициями. Просьба проверить ее.

Отвлеку, а симптом типа: заявка из None сразу становится Done (без Active) и в такой ситуации заявка на появляется в Strategy.Orders случаем не "про этот фикс"? :-)

Alexander
Alexander

Версия 4.1.1? Покажите список таких заявок и скриншот квика, где видна описанная вами проблема.

longtrades
longtrades

Есть такое, если часто посылать заявки , причем на РТС случается редко, а на УБ полный завал , в трейдер ордерс висит полно оредров со статусом актив а в системе реально их нет , бывают и ордера со статусом ноне,а в системе они активны, видно какая то ошибка при обработке ордеров с УБ есть в стокшарпе.

Это через КвикТрейдер, через ПлазаТрейдер такого не замечал.

Alexander
Alexander
  1. Версия
  2. Лог
longtrades
longtrades

версия 4.1.1 лог не веду ибо тормозит робот , так как много заявок шлет.

Alexander
Alexander

longtrades: версия 4.1.1 лог не веду ибо тормозит робот , так как много заявок шлет.

Без лога с вашей стороны не может быть никакого фикса с нашей стороны. Вообще не понятно с чем связано у вас.

Раз тормозит робот - значит что-то не так с логикой. Даже на стареньком Pentium IV должно работать очень шустро. Да и запись в файл не ресурсоёмкая задача.

longtrades
longtrades

Таже логика через плазатрейдер работает без лишних ордеров... меня это не сильно напрягает, просто увидел что у человека , таже проблема вот и сказал что есть такое ... Просто гляньте, если будет свободная, минутка чем отличаеться работа с ордерами через квик на РТС и на УБ.

Alexander
Alexander

Проверил - ничем не отличается.

longtrades
longtrades

Заметил еще одну странность : Робот подключон через квик к РТС , тот же робот на другом компе подключен через квик к УБ. Посилаю зявку не с робота, а с Квика там и там -- в том роботе что подключен к РТС заявку видно , а в тот что к УБ никак не видит заявок посланых через квик.

Это конечно ничего не значит , может проблема у брокера, а может стокшарп работаес с УБ как то по другому .

Alexander
Alexander

Есть свойство у QuikTrader, для отображения заявок поданных руками. Читайте доку или новости.

longtrades
longtrades

Спасибо ,незнал, почитаю доку... но робот все равно один и тотже , скомпилирован в одном месте а потом перенесен на разные компы.

Alexander
Alexander

Это нормальная ситуация. См. в сторону свойств QuikTrader.