← 返回

Помогите с PNL ьенеджером

Обьясните пожалуйста...у меня такая ситуация: нужно в PnL менеджер стратегии сообщить информация по имеющимся позам...то есть например я запускаю стратегию, и у меня имеется 50 контрактов в Long ...мне нужно что бы со стартом моя стратегия приняла эти позиции в PnL менеджер, и в будущем правильно расчитала реализованную прибыль или убыток...При старте стратегии, Pnl менеджер у меня пустой, но инфа о сделках при которых у меня была набранна данная поза у меня есть, я ее сохраняю,пытаюсь передать ее в Pnl менеджер через фабрику сущностей, создавая сделки по имеющейся информации и помещая их в Pnl менеджер, но все равно считает он потом не правильно...как сделать это правильно?подскажите пожалуйста...

本主题对您有帮助吗?

分享主题

评论 (3)

登录创建账户, 登录或注册以发表评论

yar1k0v
yar1k0v

PnL Manager отвечает за отображения суммарного дохода или убытка по вашим позициям. Вам нужен PositionManager. Скиньте пожалуйста ваш код по запуску и остановке стратегии, так будет проще вам помочь.

casper-ss
casper-ss 作者

else if (_LinePos != null) { decimal minElem; decimal maxElem;

                decimal dec = _LinePos.Select(l => l.Volume).Sum();

                if (_LinePos.Where(e => e.Volume > 0).Count() != 0)
                {
                    minElem = _LinePos.Where(e => e.Volume > 0).Min(p => { return p.Line; });
                    maxElem = _LinePos.Where(e => e.Volume > 0).Max(p => { return p.Line; });
                }
                else
                {
                    minElem = _LinePos.Max(p => { return p.Line; });
                    maxElem = _LinePos.Max(p => { return p.Line; });
                }

                if (flagSyncPnlMan == true)
                {
                    PnLManager.Reset();
                    for (decimal i = maxElem; i >= minElem;i=i-10 )
                    {
                        var e = _LinePos.Find(elem =>
                        {
                            if (elem.Line == i)
                            {
                                return true;
                            }
                            else return false;
                        });
                        if (e.Volume > 0)
                        {
                            ChangeManBuyPnL(e.Volume, e.Line);
                        }
                    }
                }


                if (dec - Position > 0)
                {
                    var _clearPos = dec - Position;
                    
                    for (decimal i = minElem; i <= maxElem; i = i + 10)
                    {
                        var elem = _LinePos.Find(e =>
                        {
                            if (e.Line == i)
                            {
                                return true;
                            }
                            else
                                return false;
                        });

                        if (elem.Volume >= _clearPos)
                        {
                            elem.Volume = elem.Volume - _clearPos;
                            if (flagSyncPnlMan == true)
                            {
                                ChangeManSellPnL(_clearPos, elem.PriceOrderProfit);
                            }
                            _clearPos = 0;
                        }
                        else if (elem.Volume < _clearPos)
                        {
                            _clearPos = _clearPos - elem.Volume;
                            if (flagSyncPnlMan == true)
                            {
                                ChangeManSellPnL(Volume, elem.PriceOrderProfit);
                            }
                            elem.Volume = 0;
                        }
                        if (_clearPos == 0)
                        {
                            break;
                        }
                    }
                }
                else if (dec - Position < 0)
                {
                    decimal _clearPos = Position - dec;

                    if (_LinePos.Where(e => e.Volume > 0).Count() != 0)
                    {
                        minElem = _LinePos.Where(e => e.Volume > 0).Min(p => { return p.Line; });
                    }
                    else
                    {
                        minElem = _LinePos.Max(p => { return p.Line; });
                    }

                    var elem = _LinePos.Find(e =>
                    {
                        if (e.Line == minElem)
                        {
                            return true;
                        }
                        else
                            return false;
                    });
                    elem.Volume = elem.Volume + _clearPos;
                    if (flagSyncPnlMan == true)
                    {
                        ChangeManBuyPnL(_clearPos, elem.Line);
                    }
                }

public void ChangeManBuyPnL(decimal vol, decimal price) {
var tr = new Trade(); var ord = new Order(); tr.Volume = vol; tr.Price = price; tr.Security = this.Security; ord.Portfolio = this.Portfolio; ord.Security = this.Security; ord.Direction = OrderDirections.Buy; ord.Volume = vol; ord.Price = price; var mytr = _mW._trader.EntityFactory.CreateMyTrade(ord, tr);
mytr.Trade.IsSystem = true; this.PnLManager.ProcessMyTrade(mytr);
}

_LinePos - лист с инфой по сделкам по которым была набрана позиция, там есть инфа по цене сделки на покупку и обьему который по этой цене прошел...

casper-ss
casper-ss 作者

в PositionMenedger инфу по позициям сообщая так:

if (this.PositionManager.Position == 0) {
this.PositionManager.Positions = this.Trader.Positions.Where(p => p.Security == this.Security); flagSyncPnlMan = true; }