Вопрос по обработке сделок

Вопрос по обработке сделок


Ситуация такая, стратегия отправляет заявки на биржу метод RegisterOrder(Order) и по таймауту или исполнению некого условия снимает через метод Trader.CancelOrder(Order). Учет закрытых позиций и цены происходит при событии появлении новой сделки order.NewTrades() (нужно для работы робота), По событию снятия заявки .Order.Canceled() или её полного исполнения заявка считается закрытой.

В каждом событии стоит проверка - если статус заявки Done и количество учтенных роботом позиций равно ОбъемЗаявки - БалансЗаявки. То исключаем её из списка робота, и считаем что закрыта, т.е. робот считает что вся информация по заявке получена. Учитывается ситуация если сделки пришли позже, чем заявка была снята/исполнена, так же есть обработка события неудачной отмены заявки. Код основательно перерыт и перепроверен.

Но иногда примерно с одной-двумя из 500 заявок возникает ситуация когда условие проверки выполняется заявка исключается, но Робот учитывает не все сделки прошедшие по заявке. Как вариант может быть такое, что в какой-то момент статус заявки Done, а баланс по ней ещё может изменится? В чем может быть причина, может сталкивался кто-то? Уже просто не знаю что с этим делать. Сейчас все работает на тестовом сервере РТС, Forts Plaza - II.


Tags:


Thanks:


< 1 2 3  >
Александр (ПАА)

Avatar
Date: 4/27/2012
Reply


По моим наблюдениям только для снятой.

Thanks:

Alexander

Avatar
Date: 4/27/2012
Reply


Александр (ПАА): По моим наблюдениям только для снятой.

В ветке 4.1 точно сделано следующее:

  • если мы посылаем CancelOrder - то в ответ на эту транзакцию биржа присылает сколько осталось по балансу в заявке - мы это проставляем и заявка больше не может быть изменена
  • если посылаем CancelOrders - групповое снятие - то тут да, может возникнуть что после State = OrderState.Done изменится баланс - я это поправил, будет фикс выложен на codeplex
  • для перерегистрации - см. групповое снятие - тоже поправлено

Вообще после того как стал OrderState.Done баланс меняться не должен. Если у вас не так на 4.1 - пишите ещё раз, будем разбираться.

Сейчас просьба перейти на 4.1 и пока (до выкладывания последнего фикса на codeplex) - пользоваться CancelOrder, а не групповым снятием заявки.

Thanks:

westtrd

Avatar
Date: 4/28/2012
Reply


Александр (ПАА): Давайте попробуем. Суть в том что у меня есть много модулей, каждый из который торгует по некоему алгоритму, часто бывает так, что нужно отправить на биржу одновременно несколько заявок от разных модулей, чтобы сократить количество отправляемых заявок а так же исключить встречные заявки от модулей, я составляю одну - которая и отправляется на биржу через стратегию, но после исполнения или снятия этой объединенной заявки информацию по ней необходимо разобрать и вернуть каждому модулю сколько и как исполнилось по нему. Вообще то это клиринговая логика, с распределением проторгованного объема по компонентам Такое на западных рынках есть, и проблем тут достаточно.

Есть несколько основных сценариев:

  1. пропорционально
  2. FIFO
  3. нечто производное

Вообще, если размеры счетов позволяют, лучше тупо разводить по разным субсчетам

Thanks:

gazrvs_nur

Avatar
Date: 5/20/2012
Reply


Чтобы не плодить одинаковые темы, просьба помочь с простым вопросом по сделкам: в тестовом примере SmaStrategy создал правило на появление новых сделок: this .WhenNewMyTrades() .Do(writecsv) .Apply(this); в обработчике writecsv хочу получить данные по последней сделке: var trade = this.MyTrades. ???? ; но не могу получить не одно из свойств MyTrades, хотя отладчике они все есть в ((StockSharp.BusinessEntities.MyTrade[])(this.MyTrades))

Есть другой способ?

Thanks:

Alexander

Avatar
Date: 5/20/2012
Reply


gazrvs_nur: Чтобы не плодить одинаковые темы, просьба помочь с простым вопросом по сделкам: в тестовом примере SmaStrategy создал правило на появление новых сделок: this .WhenNewMyTrades() .Do(writecsv) .Apply(this); в обработчике writecsv хочу получить данные по последней сделке: var trade = this.MyTrades. ???? ; но не могу получить не одно из свойств MyTrades, хотя отладчике они все есть в ((StockSharp.BusinessEntities.MyTrade[])(this.MyTrades))

Есть другой способ?

this.WhenNewMyTrades().Do<IEnumerable<MyTrade>>(writecsv).Apply(this);

private void writecsv(IEnumerable<MyTrade> newMyTrades)
{
...
}

Таким образом в обработчик сразу передадутся новые сделки.

Thanks:

gazrvs_nur

Avatar
Date: 5/20/2012
Reply


Компилятор ругается на строку private void writecsv( IEnumerable<MyTrade> newMyTrades)

Ошибка 1 Вместе с аргументами-типами нельзя использовать не универсальный тип "System.Collections.IEnumerable" E:\WIN\Samples\Testing\SampleHistoryTestingParallel\SmaStrategy.cs 92 41 SampleHistoryTestingParallel

Thanks:

Alexander

Avatar
Date: 5/20/2012
Reply


gazrvs_nur: Компилятор ругается на строку private void writecsv( IEnumerable<MyTrade> newMyTrades)

Ошибка 1 Вместе с аргументами-типами нельзя использовать не универсальный тип "System.Collections.IEnumerable" E:\WIN\Samples\Testing\SampleHistoryTestingParallel\SmaStrategy.cs 92 41 SampleHistoryTestingParallel

Сейчас в 4.1 всё даже проще стало


...
this.WhenNewMyTrades().Do(writecsv);
...

private void writecsv(IEnumerable<MyTrade> newMyTrades)
{
...
}
Thanks:

gazrvs_nur

Avatar
Date: 5/20/2012
Reply


Александр, я аналогично уже пробывал ..

На конструкцию: ".Do(writecsv);" компилятор выдает ошибку: Ошибка 1 Наиболее подходящий перегруженный метод для "StockSharp.Algo.Strategies.StrategyRule<System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.MyTrade>>.Do(System.Action)" имеет несколько недопустимых аргументов Ошибка 2 Аргумент "1": преобразование типа из "группа методов" в "System.Action" невозможно

А на "private void writecsv(IEnumerable<MyTrade> newMyTrades)" по прежднему: Ошибка 3 Вместе с аргументами-типами нельзя использовать не универсальный тип "System.Collections.IEnumerable"

как бы вообще уйти от этого IEnumerable<MyTrade> в нормальный IEnumerable хотя бы.

Thanks:

Alexander

Avatar
Date: 5/20/2012
Reply


gazrvs_nur: Александр, я аналогично уже пробывал ..

На конструкцию: ".Do(writecsv);" компилятор выдает ошибку: Ошибка 1 Наиболее подходящий перегруженный метод для "StockSharp.Algo.Strategies.StrategyRule<System.Collections.Generic.IEnumerable<StockSharp.BusinessEntities.MyTrade>>.Do(System.Action)" имеет несколько недопустимых аргументов Ошибка 2 Аргумент "1": преобразование типа из "группа методов" в "System.Action" невозможно

А на "private void writecsv(IEnumerable<MyTrade> newMyTrades)" по прежднему: Ошибка 3 Вместе с аргументами-типами нельзя использовать не универсальный тип "System.Collections.IEnumerable"

как бы вообще уйти от этого IEnumerable<MyTrade> в нормальный IEnumerable хотя бы.

У вас точно последняя версия 4.1?

Thanks:

gazrvs_nur

Avatar
Date: 5/20/2012
Reply


у меня сборка stocksharp-16844 от 10.05.2012г. сейчас скачаю последнюю и проверю

Thanks:
< 1 2 3  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy