← 戻る

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

Судя по всему у некоторых участников на 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 стало больше логов, особенно в плане заявок и сделок.

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

このトピックは参考になりましたか?

トピックを共有

コメント (60)

ログイン または アカウントを作成, コメントを残すにはログインまたは新規登録してください

President
President

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

Mikhail Sukhov
Mikhail Sukhov 著者

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

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

vader
vader

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

Mikhail Sukhov
Mikhail Sukhov 著者

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

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

President
President

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

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

hobo
hobo

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

Mikhail Sukhov
Mikhail Sukhov 著者

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

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

Mikhail Sukhov
Mikhail Sukhov 著者

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

Mikhail Sukhov
Mikhail Sukhov 著者

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 著者

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 著者

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 著者

freelancer: да

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

Alexander
Alexander

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

hobo
hobo

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

Mikhail Sukhov
Mikhail Sukhov 著者

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

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

hobo
hobo

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

Mikhail Sukhov
Mikhail Sukhov 著者

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 著者

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 著者

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 著者

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

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

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

Supervisor
Supervisor

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

Mikhail Sukhov
Mikhail Sukhov 著者

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 著者

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 著者

На КодеПлексе лежит залеченная версия 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.