Ситуация такая, стратегия отправляет заявки на биржу метод RegisterOrder(Order) и по таймауту или исполнению некого условия снимает через метод Trader.CancelOrder(Order). Учет закрытых позиций и цены происходит при событии появлении новой сделки order.NewTrades() (нужно для работы робота), По событию снятия заявки .Order.Canceled() или её полного исполнения заявка считается закрытой.
В каждом событии стоит проверка - если статус заявки Done и количество учтенных роботом позиций равно ОбъемЗаявки - БалансЗаявки. То исключаем её из списка робота, и считаем что закрыта, т.е. робот считает что вся информация по заявке получена. Учитывается ситуация если сделки пришли позже, чем заявка была снята/исполнена, так же есть обработка события неудачной отмены заявки. Код основательно перерыт и перепроверен.
Но иногда примерно с одной-двумя из 500 заявок возникает ситуация когда условие проверки выполняется заявка исключается, но Робот учитывает не все сделки прошедшие по заявке. Как вариант может быть такое, что в какой-то момент статус заявки Done, а баланс по ней ещё может изменится? В чем может быть причина, может сталкивался кто-то? Уже просто не знаю что с этим делать. Сейчас все работает на тестовом сервере РТС, Forts Plaza - II.
Kommentare (28)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
Может. Мы можем done выставить как ответ на заявку по транзакционному потоку, а затем нам пришло изменение по таблице заявок.
В данном случае, как совершенно верно ответил Артём, лучше пользоваться правилами.
И просьба всегда указывать версию при описании проблем. В случае с плазой изменений в 4.1 было крайне много и если пользуетесь 4.0 - совет переходить на 4.1 как можно скорее.
Спасибо за ответы. В принципе я и так использую событийную модель. Может если кусок кода показать понятнее будет, о чем я. Происходит это так, в стратегии объявлена публичная функция RegisterOrder(JointRequest order), JointRequest - это собственный класс, в нем содержится Заявка Order и дополнительная информация. Стратегия занимается только тем что регистрирует/снимает заявки и обрабатывает соответствующие события, остальной частью занимается другой класс, который и вызывает Strategy.RegisterOrder или Strategy.CancelOrder.
аналогично и со снятием заявки. ClosedCount считается в order.ClosePositions(MyTrades) считается правильно.
Использую 4.0.23, а где можно скачать 4.1 чтобы перейти? по ссылке с сайта на скачивание вижу только 4.0 и более ранние версии.
NewTrades может быть раньше чем order.Matched, а может и нет.
4.1 брать с stocksharp.codeplex.com из sources, папка dev\references
Спасибо, Александр, а как тогда лучше организовать проверку все ли сделки по заявке учтены? С Matched() то понятно там Order.Balance = 0, а если событие Order.Canceled()?
давайте немного с другой стороны зайдём. расскажите для чего вам это нужно. мне кажется, подход немного не верный.
Давайте попробуем. Суть в том что у меня есть много модулей, каждый из который торгует по некоему алгоритму, часто бывает так, что нужно отправить на биржу одновременно несколько заявок от разных модулей, чтобы сократить количество отправляемых заявок а так же исключить встречные заявки от модулей, я составляю одну - которая и отправляется на биржу через стратегию, но после исполнения или снятия этой объединенной заявки информацию по ней необходимо разобрать и вернуть каждому модулю сколько и как исполнилось по нему.
Есть несколько основных сценариев:
Вообще, если размеры счетов позволяют, лучше тупо разводить по разным субсчетам
тогда не отслеживайте done, а отслеживайте только new trades. приходит новая сделка - сообщили модулую. когда у модуля исполненный объём станет равен посланному - считаем что заявка исполнилась полностью.
А как быть если заявка полностью не исполниться? Я же снимаю ее по таймауту, и она может либо быть частично исполнена, либо вообще не исполнена...
У вас баланс меняется после Done только для снятой заявки?
По моим наблюдениям только для снятой.
В ветке 4.1 точно сделано следующее:
Вообще после того как стал OrderState.Done баланс меняться не должен. Если у вас не так на 4.1 - пишите ещё раз, будем разбираться.
Сейчас просьба перейти на 4.1 и пока (до выкладывания последнего фикса на codeplex) - пользоваться CancelOrder, а не групповым снятием заявки.
Чтобы не плодить одинаковые темы, просьба помочь с простым вопросом по сделкам: в тестовом примере SmaStrategy создал правило на появление новых сделок: this .WhenNewMyTrades() .Do(writecsv) .Apply(this); в обработчике writecsv хочу получить данные по последней сделке: var trade = this.MyTrades. ???? ; но не могу получить не одно из свойств MyTrades, хотя отладчике они все есть в ((StockSharp.BusinessEntities.MyTrade[])(this.MyTrades))
Есть другой способ?
Таким образом в обработчик сразу передадутся новые сделки.
Компилятор ругается на строку private void writecsv( IEnumerable<MyTrade> newMyTrades)
Ошибка 1 Вместе с аргументами-типами нельзя использовать не универсальный тип "System.Collections.IEnumerable" E:\WIN\Samples\Testing\SampleHistoryTestingParallel\SmaStrategy.cs 92 41 SampleHistoryTestingParallel
Сейчас в 4.1 всё даже проще стало
Александр, я аналогично уже пробывал ..
На конструкцию: ".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?
у меня сборка stocksharp-16844 от 10.05.2012г. сейчас скачаю последнюю и проверю
Проблема в stocksharp-17079 (папка dev) та же
private void writecsv(IEnumerable<MyTrade> newMyTrades) Ошибка 3 Вместе с аргументами-типами нельзя использовать не универсальный тип "System.Collections.IEnumerable"
а не проще было бы сделать доступными свойства Strategy.MyTrades. ?
Они все доступны.
У вас проблема в том, что не подключены либо библиотеки нужные, либо using.
Следующий код без проблем компилируется у меня:
Собираю под .Net Framework 4.0
Спасибо Александр, вся проблема была в using System.Collections.Generic; я использовал using System.Collections; странно конечно .Generic должен входить в System.Collections по умолчанию, но видимо не обязан.
вот только проблема была не в вызове процедуры с передаче туда MyTrades, а в том, чтобы получить дату, время, цену и направление последней сделки из this.MyTrades.
пока вытащить из IEnumerable<MyTrade> это данные неполучается.
добавить что то вроде this.MyTrades.Last() тоже нельзя.
в цикле foreach (IEnumerable<MyTrade> value in newMyTrades) получить какое либо значение(дату, время) "value." также не идет.
К сожалению, лишь сейчас увидел это добавление к сообщению. На будущее просьба писать новые сообщения, а не редактировать предыдущие :) А то они через RSS не идут. Я уже вроде как прочитал, а потом оказывается что там половина нового была.
Так можно и без ответа остаться :)
Очень странно что не работает через MyTrades.Last()
MyTrades - это обычный IEnumerable<T> Идём в MSDN, ищем метод Last у интерфейса. Видим - необходимо объявить using System.Linq; и подключить reference System.Core.dll
Может кому понадобится. Извернулся в вышеуказанном случае следующим образом: private void writecsv(IEnumerable<MyTrade> newMyTrades) { var Tradeneed = new List<MyTrade>(newMyTrades); decimal ClosedVolumeneed = Tradeneed[0].ClosedVolume; decimal Volumeneed = Tradeneed[0].Trade.Volume; DateTime Timeneed = Tradeneed[0].Trade.Time; string Securityneed = Tradeneed[0].Trade.Security.ToString(); decimal Priceneed = Tradeneed[0].Trade.Price; string Directionneed = Tradeneed[0].Trade.OrderDirection.ToString(); long Idneed = Tradeneed[0].Trade.Id;
}
Да я уже понял, что что не так, System.Linq объявлял, но вот до reference System.Core.dll уже не дошел, будем нарабатывать опыт.
Добрый день, после перехода на 4.1 опять та же проблема (с изменением баланса после изменения статуса заявки на Done) возникает, правда намного реже...
приведите лог, укажите шлюз лучше в соответствующем подфоруме