Инфа для пользователей сидящих на API 4.3.14.2. Настоятельно рекомендую обновится до новой версии API 4.3.15, которая вышла на этой неделе:
https://github.com/StockSharp/StockSharp/releasesВ версии API 4.3.14.2 есть баг в Менеджере Позиции, конкретно при расчёте позиции исходя из реализованного объёма заявки, т.е. когда мы создаём объект передавая его конструктору true, т.е. пишем "new PositionManager(true)". Тем самым мы устанавиваем свойство byOrders в значение true. И если у вас где-то в коде используется именно такая запись "new PositionManager(true)" то ждите беду, у вас будет неверно подсчитыватся позиция. Дело в том, что в версии API 4.3.13 было вообще два отдельных метода, один расчитывал позицию по заявкам, т.е. для объекта "new PositionManager(true)", другой же метод расчитывал позицию по сделкам, т.е. для объекта "new PositionManager(false)". В версии API 4.3.14.2 эти два метода свели в один ProcessMessage() в котором и допустили косяк. Причём косяк лишь для расчёта по заявкам, при расчёте по сделкам всё работает как надо. То есть, если вы создали объект "new PositionManager(false)", то всё работает хорошо, позиция подсчитывается верно. Но если вы создали объект "new PositionManager(true)" то позиция будет почти всегда меньше реальной. Я этот косяк заметил где-то с полмесяца назад, когда изучал видеоуроки, конкретно "Урок 3. Часть 2. Strategy Rule", где была элементарная стратегия, которая должна была набрать определённную лонговую позу единичными заявками. Так вот, стратегия почти всегда перебирала больше чем надо. К примеру, ставим набрать 10 лотов, так стратегия реально наберёт то 12, то 13, то 14, то 21. И вся проблема была именно в том, что в класс Strategy не умеет создавать объект "new PositionManager(false)", в исходниках жестко приписана строчка "private IPositionManager _positionManager = new PositionManager(true);". То есть, нет возможности вручную изменить способ расчёта позиции. Чтобы создать своего Менеджера Позиции со свойством byOrders= false, мне пришлось ещё и переопределять метод OnNewMyTrades(), брать коллекцию моих пришедших сделок, перебирать её, и для каждую сделку ковертировать в объект-сообщение, и передавать его методу ProcessMessage(). В обещем, косяк разработчики заметили и поправили в новом API 4.3.15. Плохо лишь одно, что я на решение проблемы убил неделю-полторы времени, и когда я хотел уже пожаловаться отдельным постом, то тут и вышел новый API ))). Я даже картинку заготовил и всё в пустую ))). Кому интересно, картинка тута:
http://i9.pixs.ru/storage/7/9/8/314h10jpg_2030394_22379798.jpg Просьба к разработчикам. В новом API ввести в класс Strategy свойство byOrders, чтобы пользователь при создании объекта стратегии мог бы сам выбирать метод расчёта позы: по заявкам/по сделкам. То есть, записать так: private IPositionManager _positionManager = new PositionManager(byOrders); Можете byOrders сразу установить true, чтобы ни у кого не полетели роботы. И кому надо, те при создании объекта стратегии сами сменят данное свойство на false. Тем более, текущие исходники даже менять не нужно, ибо уже текущий код в классе Strategy поддерживает это, он фактически сейчас даже избыточен. Исходники уже учитывают отправку методу обектов-сообщений на основе сделок "PositionManager.ProcessMessage(trade.ToMessage());". То есть все уже и так готово. Делать практически ничего не нужно - лишь добавить свойство byOrders.