Forex_Strategy_Builder.Backtester.SetPosition C# (CSharp) Method

SetPosition() static private method

Sets the position.
static private SetPosition ( int bar, OrderDirection ordDir, double lots, double price, int ordNumb ) : void
bar int
ordDir OrderDirection
lots double
price double
ordNumb int
return void
        static void SetPosition(int bar, OrderDirection ordDir, double lots, double price, int ordNumb)
        {
            int sessionPosition;
            Position position;
            double pipsToMoneyRate = InstrProperties.Point * InstrProperties.LotSize / AccountExchangeRate(price);
            bool isAbsoluteSL = Strategy.UsePermanentSL && Strategy.PermanentSLType == PermanentProtectionType.Absolute;
            bool isAbsoluteTP = Strategy.UsePermanentTP && Strategy.PermanentTPType == PermanentProtectionType.Absolute;

            if (session[bar].Positions == 0 || session[bar].Summary.PosLots == 0)
            {   // Open new position when either we have not opened one or it has been closed
                if (ordDir == OrderDirection.Buy)
                {   // Opens a long position
                    sessionPosition = session[bar].Positions;
                    position = session[bar].Position[sessionPosition] = new Position();

                    position.Transaction     = Transaction.Open;
                    position.PosDir          = PosDirection.Long;
                    position.OpeningBar      = bar;
                    position.FormOrdNumb     = ordNumb;
                    position.FormOrdPrice    = price;
                    position.PosNumb         = totalPositions;
                    position.PosLots         = lots;
                    position.AbsoluteSL      = isAbsoluteSL ? price - Strategy.PermanentSL * InstrProperties.Point : 0;
                    position.AbsoluteTP      = isAbsoluteTP ? price + Strategy.PermanentTP * InstrProperties.Point : 0;
                    position.RequiredMargin  = RequiredMargin(position.PosLots, bar);

                    position.Spread          = lots * InstrProperties.Spread;
                    position.Commission      = Commission(lots, price, false);
                    position.Slippage        = lots * InstrProperties.Slippage;
                    position.PosPrice        = price + (InstrProperties.Spread + InstrProperties.Slippage) * InstrProperties.Point;
                    position.FloatingPL      = lots * (Close[bar] - position.PosPrice) / InstrProperties.Point;
                    position.ProfitLoss      = 0;
                    position.Balance         = PosFromNumb(totalPositions - 1).Balance - position.Commission;
                    position.Equity          = position.Balance + position.FloatingPL;

                    position.MoneySpread     = lots * InstrProperties.Spread * pipsToMoneyRate;
                    position.MoneyCommission = CommissionInMoney(lots, price, false);
                    position.MoneySlippage   = lots * InstrProperties.Slippage * pipsToMoneyRate;
                    position.MoneyFloatingPL = lots * (Close[bar] - position.PosPrice) * InstrProperties.LotSize / AccountExchangeRate(price);
                    position.MoneyProfitLoss = 0;
                    position.MoneyBalance    = PosFromNumb(totalPositions - 1).MoneyBalance - position.MoneyCommission;
                    position.MoneyEquity     = position.MoneyBalance + position.MoneyFloatingPL;

                    posCoord[totalPositions].Bar = bar;
                    posCoord[totalPositions].Pos = sessionPosition;
                    session[bar].Positions++;
                    totalPositions++;

                    return;
                }
                else
                {   // Opens a short position
                    sessionPosition = session[bar].Positions;
                    position = session[bar].Position[sessionPosition] = new Position();

                    position.Transaction     = Transaction.Open;
                    position.PosDir          = PosDirection.Short;
                    position.OpeningBar      = bar;
                    position.FormOrdNumb     = ordNumb;
                    position.FormOrdPrice    = price;
                    position.PosNumb         = totalPositions;
                    position.PosLots         = lots;
                    position.AbsoluteSL      = isAbsoluteSL ? price + Strategy.PermanentSL * InstrProperties.Point : 0;
                    position.AbsoluteTP      = isAbsoluteTP ? price - Strategy.PermanentTP * InstrProperties.Point : 0;
                    position.RequiredMargin  = RequiredMargin(position.PosLots, bar);

                    position.Spread          = lots * InstrProperties.Spread;
                    position.Commission      = Commission(lots, price, false);
                    position.Slippage        = lots * InstrProperties.Slippage;
                    position.PosPrice        = price - (InstrProperties.Spread + InstrProperties.Slippage) * InstrProperties.Point;
                    position.FloatingPL      = lots * (position.PosPrice - Close[bar]) / InstrProperties.Point;
                    position.ProfitLoss      = 0;
                    position.Balance         = PosFromNumb(totalPositions - 1).Balance - position.Commission;
                    position.Equity          = position.Balance + position.FloatingPL;

                    position.MoneySpread     = lots * InstrProperties.Spread * pipsToMoneyRate;
                    position.MoneyCommission = CommissionInMoney(lots, price, false);
                    position.MoneySlippage   = lots * InstrProperties.Slippage * pipsToMoneyRate;
                    position.MoneyFloatingPL = lots * (position.PosPrice - Close[bar]) * InstrProperties.LotSize / AccountExchangeRate(price);
                    position.MoneyProfitLoss = 0;
                    position.MoneyBalance    = PosFromNumb(totalPositions - 1).MoneyBalance - position.MoneyCommission;
                    position.MoneyEquity     = position.MoneyBalance + position.MoneyFloatingPL;

                    posCoord[totalPositions].Bar = bar;
                    posCoord[totalPositions].Pos = sessionPosition;
                    session[bar].Positions++;
                    totalPositions++;

                    return;
                }
            }

            int sessionPosOld = session[bar].Positions - 1;
            Position positionOld = session[bar].Position[sessionPosOld];
            PosDirection posDirOld = positionOld.PosDir;
            double lotsOld  = positionOld.PosLots;
            double priceOld = positionOld.PosPrice;
            double absoluteSL = positionOld.AbsoluteSL;
            double absoluteTP = positionOld.AbsoluteTP;
            double posBalanceOld = positionOld.Balance;
            double posEquityOld  = positionOld.Equity;

            sessionPosition = sessionPosOld + 1;
            position = session[bar].Position[sessionPosition] = new Position();

            position.PosNumb      = totalPositions;
            position.FormOrdPrice = price;
            position.FormOrdNumb  = ordNumb;
            position.Balance      = posBalanceOld;
            position.Equity       = posEquityOld;
            position.MoneyBalance = positionOld.MoneyBalance;
            position.MoneyEquity  = positionOld.MoneyEquity;

            posCoord[totalPositions].Bar = bar;
            posCoord[totalPositions].Pos = sessionPosition;
            session[bar].Positions++;
            totalPositions++;

            // Closing of a long position
            if (posDirOld == PosDirection.Long && ordDir == OrderDirection.Sell && lotsOld == lots)
            {
                position.Transaction     = Transaction.Close;
                position.PosDir          = PosDirection.Closed;
                position.PosLots         = 0;
                position.AbsoluteSL      = 0;
                position.AbsoluteTP      = 0;
                position.RequiredMargin  = 0;

                position.Commission      = Commission(lots, price, true);
                position.Slippage        = lots * InstrProperties.Slippage;
                position.PosPrice        = priceOld;
                position.FloatingPL      = 0;
                position.ProfitLoss      = lots * (price - priceOld) / InstrProperties.Point - position.Slippage;
                position.Balance        += position.ProfitLoss - position.Commission;
                position.Equity          = position.Balance;

                position.MoneyCommission = CommissionInMoney(lots, price, true);
                position.MoneySlippage   = lots * InstrProperties.Slippage * pipsToMoneyRate;
                position.MoneyFloatingPL = 0;
                position.MoneyProfitLoss = lots * (price - priceOld) * InstrProperties.LotSize / AccountExchangeRate(price) - position.MoneySlippage;
                position.MoneyBalance   += position.MoneyProfitLoss - position.MoneyCommission;
                position.MoneyEquity     = position.MoneyBalance;
                return;
            }

            // Closing of a short position
            if (posDirOld == PosDirection.Short && ordDir == OrderDirection.Buy && lotsOld == lots)
            {
                position.Transaction     = Transaction.Close;
                position.PosDir          = PosDirection.Closed;
                position.PosLots         = 0;
                position.AbsoluteSL      = 0;
                position.AbsoluteTP      = 0;
                position.RequiredMargin  = 0;

                position.Commission      = Commission(lots, price, true);
                position.Slippage        = lots * InstrProperties.Slippage;
                position.PosPrice        = priceOld;
                position.FloatingPL      = 0;
                position.ProfitLoss      = lots * (priceOld - price) / InstrProperties.Point - position.Slippage;
                position.Balance        += position.ProfitLoss - position.Commission;
                position.Equity          = position.Balance;

                position.MoneyCommission = CommissionInMoney(lots, price, true);
                position.MoneySlippage   = lots * InstrProperties.Slippage * pipsToMoneyRate;
                position.MoneyFloatingPL = 0;
                position.MoneyProfitLoss = lots * (priceOld - price) * InstrProperties.LotSize / AccountExchangeRate(price) - position.MoneySlippage;
                position.MoneyBalance   += position.MoneyProfitLoss - position.MoneyCommission;
                position.MoneyEquity     = position.MoneyBalance;
                return;
            }

            // Adding to a long position
            if (posDirOld == PosDirection.Long && ordDir == OrderDirection.Buy)
            {
                position.Transaction     = Transaction.Add;
                position.PosDir          = PosDirection.Long;
                position.PosLots         = lotsOld + lots;
                position.AbsoluteSL      = absoluteSL;
                position.AbsoluteTP      = absoluteTP;
                position.RequiredMargin  = RequiredMargin(position.PosLots, bar);

                position.Spread          = lots * InstrProperties.Spread;
                position.Commission      = Commission(lots, price, false);
                position.Slippage        = lots * InstrProperties.Slippage;
                position.PosPrice        = (lotsOld * priceOld + lots * (price + (InstrProperties.Spread + InstrProperties.Slippage) * InstrProperties.Point)) / (lotsOld + lots);
                position.FloatingPL      = (lotsOld + lots) * (Close[bar] - position.PosPrice) / InstrProperties.Point;
                position.ProfitLoss      = 0;
                position.Balance        -= position.Commission;
                position.Equity          = position.Balance + position.FloatingPL;

                position.MoneySpread     = lots * InstrProperties.Spread * pipsToMoneyRate;
                position.MoneyCommission = CommissionInMoney(lots, price, false);
                position.MoneySlippage   = lots * InstrProperties.Slippage * pipsToMoneyRate;
                position.MoneyFloatingPL = (lotsOld + lots) * (Close[bar] - position.PosPrice) * InstrProperties.LotSize / AccountExchangeRate(price);
                position.MoneyProfitLoss = 0;
                position.MoneyBalance   -= position.MoneyCommission;
                position.MoneyEquity     = position.MoneyBalance + position.MoneyFloatingPL;
                return;
            }

            // Adding to a short position
            if (posDirOld == PosDirection.Short && ordDir == OrderDirection.Sell)
            {
                position.Transaction     = Transaction.Add;
                position.PosDir          = PosDirection.Short;
                position.PosLots         = lotsOld + lots;
                position.AbsoluteSL      = absoluteSL;
                position.AbsoluteTP      = absoluteTP;
                position.RequiredMargin  = RequiredMargin(position.PosLots, bar);

                position.Spread          = lots * InstrProperties.Spread;
                position.Commission      = Commission(lots, price, false);
                position.Slippage        = lots * InstrProperties.Slippage;
                position.PosPrice        = (lotsOld * priceOld + lots * (price - (InstrProperties.Spread + InstrProperties.Slippage) * InstrProperties.Point)) / (lotsOld + lots);
                position.FloatingPL      = (lotsOld + lots) * (position.PosPrice - Close[bar]) / InstrProperties.Point;
                position.ProfitLoss      = 0;
                position.Balance        -= position.Commission;
                position.Equity          = position.Balance + position.FloatingPL;

                position.MoneySpread     = lots * InstrProperties.Spread * pipsToMoneyRate;
                position.MoneyCommission = CommissionInMoney(lots, price, false);
                position.MoneySlippage   = lots * InstrProperties.Slippage * pipsToMoneyRate;
                position.MoneyFloatingPL = (lotsOld + lots) * (position.PosPrice - Close[bar]) * InstrProperties.LotSize / AccountExchangeRate(price);
                position.MoneyProfitLoss = 0;
                position.MoneyBalance   -= position.MoneyCommission;
                position.MoneyEquity     = position.MoneyBalance + position.MoneyFloatingPL;
                return;
            }

            // Reducing of a long position
            if (posDirOld == PosDirection.Long && ordDir == OrderDirection.Sell && lotsOld > lots)
            {
                position.Transaction     = Transaction.Reduce;
                position.PosDir          = PosDirection.Long;
                position.PosLots         = lotsOld - lots;
                position.AbsoluteSL      = absoluteSL;
                position.AbsoluteTP      = absoluteTP;
                position.RequiredMargin  = RequiredMargin(position.PosLots, bar);

                position.Commission      = Commission(lots, price, true);
                position.Slippage        = lots * InstrProperties.Slippage;
                position.PosPrice        = priceOld;
                position.FloatingPL      = (lotsOld - lots) * (Close[bar] - priceOld) / InstrProperties.Point;
                position.ProfitLoss      = lots * ((price - priceOld) / InstrProperties.Point - InstrProperties.Slippage);
                position.Balance        += position.ProfitLoss - position.Commission;
                position.Equity          = position.Balance + position.FloatingPL;

                position.MoneyCommission = CommissionInMoney(lots, price, true);
                position.MoneySlippage   = lots * InstrProperties.Slippage * pipsToMoneyRate;
                position.MoneyFloatingPL = (lotsOld - lots) * (Close[bar] - priceOld) * InstrProperties.LotSize / AccountExchangeRate(price);
                position.MoneyProfitLoss = lots * (price - priceOld) * InstrProperties.LotSize / AccountExchangeRate(price) - position.MoneySlippage;
                position.MoneyBalance   += position.MoneyProfitLoss - position.MoneyCommission;
                position.MoneyEquity     = position.MoneyBalance + position.MoneyFloatingPL;
                return;
            }

            // Reducing of a short position
            if (posDirOld == PosDirection.Short && ordDir == OrderDirection.Buy && lotsOld > lots)
            {
                position.Transaction     = Transaction.Reduce;
                position.PosDir          = PosDirection.Short;
                position.PosLots         = lotsOld - lots;
                position.AbsoluteSL      = absoluteSL;
                position.AbsoluteTP      = absoluteTP;
                position.RequiredMargin  = RequiredMargin(position.PosLots, bar);

                position.Commission      = Commission(lots, price, true);
                position.Slippage        = lots * InstrProperties.Slippage;
                position.PosPrice        = priceOld;
                position.FloatingPL      = (lotsOld - lots) * (priceOld - Close[bar]) / InstrProperties.Point;
                position.ProfitLoss      = lots * ((priceOld - price) / InstrProperties.Point - InstrProperties.Slippage);
                position.Balance        += position.ProfitLoss - position.Commission;
                position.Equity          = position.Balance + position.FloatingPL;

                position.MoneyCommission = CommissionInMoney(lots, price, true);
                position.MoneySlippage   = lots * InstrProperties.Slippage * pipsToMoneyRate;
                position.MoneyFloatingPL = (lotsOld - lots) * (priceOld - Close[bar]) * InstrProperties.LotSize / AccountExchangeRate(price);
                position.MoneyProfitLoss = lots * (priceOld - price) * InstrProperties.LotSize / AccountExchangeRate(price) - position.MoneySlippage;
                position.MoneyBalance   += position.MoneyProfitLoss - position.MoneyCommission;
                position.MoneyEquity     = position.MoneyBalance + position.MoneyFloatingPL;
                return;
            }

            // Reversing of a long position
            if (posDirOld == PosDirection.Long && ordDir == OrderDirection.Sell && lotsOld < lots)
            {
                position.Transaction     = Transaction.Reverse;
                position.PosDir          = PosDirection.Short;
                position.PosLots         = lots - lotsOld;
                position.OpeningBar      = bar;
                position.AbsoluteSL      = isAbsoluteSL ? price + Strategy.PermanentSL * InstrProperties.Point : 0;
                position.AbsoluteTP      = isAbsoluteTP ? price - Strategy.PermanentTP * InstrProperties.Point : 0;
                position.RequiredMargin  = RequiredMargin(position.PosLots, bar);

                position.Spread          = (lots - lotsOld) * InstrProperties.Spread;
                position.Commission      = Commission(lotsOld, price, true) + Commission(lots - lotsOld, price, false);
                position.Slippage        = lots * InstrProperties.Slippage;
                position.PosPrice        = price - (InstrProperties.Spread + InstrProperties.Slippage) * InstrProperties.Point;
                position.FloatingPL      = (lots - lotsOld) * (position.PosPrice - Close[bar]) / InstrProperties.Point;
                position.ProfitLoss      = lotsOld * ((price - priceOld) / InstrProperties.Point - InstrProperties.Slippage);
                position.Balance        += position.ProfitLoss - position.Commission;
                position.Equity          = position.Balance + position.FloatingPL;

                position.MoneySpread     = (lots - lotsOld) * InstrProperties.Spread * pipsToMoneyRate;
                position.MoneyCommission = CommissionInMoney(lotsOld, price, true) + CommissionInMoney(lots - lotsOld, price, false);
                position.MoneySlippage   = lots * InstrProperties.Slippage * pipsToMoneyRate;
                position.MoneyFloatingPL = (lots - lotsOld) * (position.PosPrice - Close[bar]) * InstrProperties.LotSize / AccountExchangeRate(price);
                position.MoneyProfitLoss = lotsOld * (price - priceOld) * InstrProperties.LotSize / AccountExchangeRate(price) - lotsOld * InstrProperties.Slippage * pipsToMoneyRate;
                position.MoneyBalance   += position.MoneyProfitLoss - position.MoneyCommission;
                position.MoneyEquity     = position.MoneyBalance + position.MoneyFloatingPL;
                return;
            }

            // Reversing of a short position
            if (posDirOld == PosDirection.Short && ordDir == OrderDirection.Buy && lotsOld < lots)
            {
                position.Transaction     = Transaction.Reverse;
                position.PosDir          = PosDirection.Long;
                position.PosLots         = lots - lotsOld;
                position.OpeningBar      = bar;
                position.AbsoluteSL      = Strategy.UsePermanentSL ? price - Strategy.PermanentSL * InstrProperties.Point : 0;
                position.AbsoluteTP      = Strategy.UsePermanentTP ? price + Strategy.PermanentTP * InstrProperties.Point : 0;
                position.RequiredMargin  = RequiredMargin(position.PosLots, bar);

                position.Spread          = (lots - lotsOld) * InstrProperties.Spread;
                position.Commission      = Commission(lotsOld, price, true) + Commission(lots - lotsOld, price, false);
                position.Slippage        = lots * InstrProperties.Slippage;
                position.PosPrice        = price + (InstrProperties.Spread + InstrProperties.Slippage) * InstrProperties.Point;
                position.FloatingPL      = (lots - lotsOld) * (Close[bar] - position.PosPrice) / InstrProperties.Point;
                position.ProfitLoss      = lotsOld * ((priceOld - price) / InstrProperties.Point - InstrProperties.Slippage);
                position.Balance        += position.ProfitLoss - position.Commission;
                position.Equity          = position.Balance + position.FloatingPL;

                position.MoneySpread     = (lots - lotsOld) * InstrProperties.Spread * pipsToMoneyRate;
                position.MoneyCommission = CommissionInMoney(lotsOld, price, true) + CommissionInMoney(lots - lotsOld, price, false);
                position.MoneySlippage   = lots * InstrProperties.Slippage * pipsToMoneyRate;
                position.MoneyFloatingPL = (lots - lotsOld) * (Close[bar] - position.PosPrice) * InstrProperties.LotSize / AccountExchangeRate(price);
                position.MoneyProfitLoss = lotsOld * (priceOld - price) * InstrProperties.LotSize / AccountExchangeRate(price) - lotsOld * InstrProperties.Slippage * pipsToMoneyRate;
                position.MoneyBalance   += position.MoneyProfitLoss - position.MoneyCommission;
                position.MoneyEquity     = position.MoneyBalance + position.MoneyFloatingPL;
                return;
            }

            // We should never be here !!
            return;
        }