Михаил, хорошая кстати задачка получилась - посчитать активную позицию
для стратегии. =)
Я пока пришёл к такому варинту, если не прав в рассуждениях -
исправьте, пожалуйста.
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: