Михаил, хорошая кстати задачка получилась - посчитать активную позицию
для стратегии. =)
Я пока пришёл к такому варинту, если не прав в рассуждениях -
исправьте, пожалуйста.
PositionManager для стратегии может работать только с заявками,
стопзаявки не учитываются. Поэтому активная позиция в стратегии равна
PositionManager.Position + <число контрактов, сработавших по стопу>.
Для этого при выставлении стоп заявки мы не регистрируем её в
стратегии (base.AddOrder) (обычные заявки регистрируются в стратегии
как раньше), а сохраняем её, для отслеживания что она сработала
(условие что DerivedOrder != null). Если сработала - прибавляем число
контрактов которое сработало по DerivedOrder.
У меня вышло вот что:
ActivePosition = PositionManager.Position + GetStopPosition();
(где GetStopPosition (stopOrders -
ThreadSafeObservableCollection<Order> из заявок, зарегистрированных в
стратегии):)
       private int GetStopPosition()
        {
            return (from stopOrder in stopOrders
                    where stopOrder.DerivedOrder != null
                    where stopOrder.DerivedOrder.State ==
OrderStates.Active || stopOrder.DerivedOrder.State ==
OrderStates.Matched
                    let stopVolume = stopOrder.DerivedOrder.Volume -
stopOrder.DerivedOrder.Balance
                    let mult = stopOrder.DerivedOrder.Direction ==
OrderDirections.Buy ? 1 : -1
                    select stopVolume*mult).Sum();
        }
(или не в LINQ варианте:
        private int GetStopPosition()
        {
            int resultStopPosition = 0;
           foreach (Order stopOrder in stopOrders)
            {
                if (stopOrder.DerivedOrder != null)
                {
                    if (stopOrder.DerivedOrder.State ==
OrderStates.Active || stopOrder.DerivedOrder.State ==
OrderStates.Matched)
                    {
                        int stopVolume = stopOrder.DerivedOrder.Volume
- stopOrder.DerivedOrder.Balance;
                        int mult = stopOrder.DerivedOrder.Direction ==
OrderDirections.Buy ? 1 : -1;
                        resultStopPosition += stopVolume*mult;
                    }
                }
            }
           return resultStopPosition;
        }
)
Всё верно? Таким образом, никаких MyNewTrades отслеживать не придётся
(там ведь ещё надо понимать, какие заявки сгенерированы стратегией, а
какие - нет. Всё это, конечно, обходится, но весь вопрос в затратах).
On 2 июл, 12:34, Mikhail Sukhov <msou
...@gmail.com> wrote: