← 戻る

Помогите с 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; }