← Voltar

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

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

Este tópico foi útil?

Compartilhar tópico

Comentários (3)

Entrar ou Criar conta, Faça login ou cadastre-se para deixar um comentário

yar1k0v
yar1k0v

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

casper-ss
casper-ss Autor

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 Autor

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

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