Forex_Strategy_Builder.Backtester.TransferFromPreviousBar C# (CSharp) Метод

TransferFromPreviousBar() статический приватный Метод

static private TransferFromPreviousBar ( int bar ) : void
bar int
Результат void
        static void TransferFromPreviousBar(int bar)
        {
            // Check the previous bar for an open position
            if (session[bar - 1].Summary.PosDir == PosDirection.Long ||
                session[bar - 1].Summary.PosDir == PosDirection.Short)
            {   // Yes, we have a position
                // We copy the position from the previous bar
                int sessionPosition = session[bar].Positions;
                Position position = session[bar].Position[sessionPosition] = session[bar - 1].Summary.Copy();

                // How many days we transfer the positions with
                int days = Time[bar].DayOfYear - Time[bar - 1].DayOfYear;
                if (days < 0) days += 365;

                position.Rollover      = 0;
                position.MoneyRollover = 0;

                if (days > 0)
                {   // Calculate the Rollover fee
                    double swapLongPips  = 0;
                    double swapShortPips = 0;

                    if (InstrProperties.SwapType == Commission_Type.pips)
                    {
                        swapLongPips  = InstrProperties.SwapLong;
                        swapShortPips = InstrProperties.SwapShort;
                    }
                    else if (InstrProperties.SwapType == Commission_Type.percents)
                    {
                        swapLongPips  = (Close[bar - 1] / InstrProperties.Point) * (0.01 * InstrProperties.SwapLong  / 365);
                        swapShortPips = (Close[bar - 1] / InstrProperties.Point) * (0.01 * InstrProperties.SwapShort / 365);
                    }
                    else if (InstrProperties.SwapType == Commission_Type.money)
                    {
                        swapLongPips  = InstrProperties.SwapLong  / (InstrProperties.Point * InstrProperties.LotSize);
                        swapShortPips = InstrProperties.SwapShort / (InstrProperties.Point * InstrProperties.LotSize);
                    }

                    if (position.PosDir == PosDirection.Long)
                    {
                        position.PosPrice     += InstrProperties.Point * days * swapLongPips;
                        position.Rollover      = position.PosLots * days * swapLongPips;
                        position.MoneyRollover = position.PosLots * days * swapLongPips * InstrProperties.Point * InstrProperties.LotSize / AccountExchangeRate(Close[bar - 1]);
                    }
                    else
                    {
                        position.PosPrice     += InstrProperties.Point * days * swapShortPips;
                        position.Rollover      = -position.PosLots * days * swapShortPips;
                        position.MoneyRollover = -position.PosLots * days * swapShortPips * InstrProperties.Point * InstrProperties.LotSize / AccountExchangeRate(Close[bar - 1]);
                    }
                }

                if (position.PosDir == PosDirection.Long)
                {
                    position.FloatingPL      = position.PosLots * (Close[bar] - position.PosPrice) / InstrProperties.Point;
                    position.MoneyFloatingPL = position.PosLots * (Close[bar] - position.PosPrice) * InstrProperties.LotSize / AccountExchangeRate(Close[bar]);
                }
                else
                {
                    position.FloatingPL      = position.PosLots * (position.PosPrice - Close[bar]) / InstrProperties.Point;
                    position.MoneyFloatingPL = position.PosLots * (position.PosPrice - Close[bar]) * InstrProperties.LotSize / AccountExchangeRate(Close[bar]);
                }

                position.PosNumb         = totalPositions;
                position.Transaction     = Transaction.Transfer;
                position.RequiredMargin  = RequiredMargin(position.PosLots, bar);
                position.Spread          = 0;
                position.Commission      = 0;
                position.Slippage        = 0;
                position.ProfitLoss      = 0;
                position.Equity          = position.Balance + position.FloatingPL;
                position.MoneySpread     = 0;
                position.MoneyCommission = 0;
                position.MoneySlippage   = 0;
                position.MoneyProfitLoss = 0;
                position.MoneyEquity     = position.MoneyBalance + position.MoneyFloatingPL;

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

                // Saves the Trailing Stop price
                if (Strategy.Slot[Strategy.CloseSlot].IndicatorName == "Trailing Stop" &&
                    session[bar - 1].Summary.Transaction != Transaction.Transfer)
                {
                    double deltaStop = Strategy.Slot[Strategy.CloseSlot].IndParam.NumParam[0].Value * InstrProperties.Point;
                    double stop = position.FormOrdPrice + (position.PosDir == PosDirection.Long ? -deltaStop : deltaStop);
                    Strategy.Slot[Strategy.CloseSlot].Component[0].Value[bar - 1] = stop;
                }

                // Saves the Trailing Stop Limit price
                if (Strategy.Slot[Strategy.CloseSlot].IndicatorName == "Trailing Stop Limit" &&
                    session[bar - 1].Summary.Transaction != Transaction.Transfer)
                {
                    double deltaStop = Strategy.Slot[Strategy.CloseSlot].IndParam.NumParam[0].Value * InstrProperties.Point;
                    double stop = position.FormOrdPrice + (position.PosDir == PosDirection.Long ? -deltaStop : deltaStop);
                    Strategy.Slot[Strategy.CloseSlot].Component[0].Value[bar - 1] = stop;
                }

                // Saves the ATR Stop price
                if (Strategy.Slot[Strategy.CloseSlot].IndicatorName == "ATR Stop" &&
                    session[bar - 1].Summary.Transaction != Transaction.Transfer)
                {
                    double deltaStop = Strategy.Slot[Strategy.CloseSlot].Component[0].Value[bar - 1];
                    double stop = position.FormOrdPrice + (position.PosDir == PosDirection.Long ? -deltaStop : deltaStop);
                    Strategy.Slot[Strategy.CloseSlot].Component[1].Value[bar - 1] = stop;
                }

                // Saves the Account Percent Stop price
                if (Strategy.Slot[Strategy.CloseSlot].IndicatorName == "Account Percent Stop" &&
                    session[bar - 1].Summary.Transaction != Transaction.Transfer)
                {
                    double deltaMoney = Strategy.Slot[Strategy.CloseSlot].IndParam.NumParam[0].Value * MoneyBalance(bar - 1) / (100 * position.PosLots);
                    double deltaStop  = Math.Max(MoneyToPips(deltaMoney, bar), 5) * InstrProperties.Point;
                    double stop = position.FormOrdPrice + (position.PosDir == PosDirection.Long ? -deltaStop : deltaStop);
                    Strategy.Slot[Strategy.CloseSlot].Component[0].Value[bar - 1] = stop;
                }
            }
            else
            {   // When there is no position transfer the old balance and equity
                session[bar].Summary.Balance      = session[bar - 1].Summary.Balance;
                session[bar].Summary.Equity       = session[bar - 1].Summary.Equity;
                session[bar].Summary.MoneyBalance = session[bar - 1].Summary.MoneyBalance;
                session[bar].Summary.MoneyEquity  = session[bar - 1].Summary.MoneyEquity;
            }

            // Transfer all confirmed orders
            for (int iOrd = 0; iOrd < session[bar-1].Orders; iOrd++)
                if (session[bar - 1].Order[iOrd].OrdStatus == OrderStatus.Confirmed)
                {
                    int iSessionOrder = session[bar].Orders;
                    Order order = session[bar].Order[iSessionOrder] = session[bar - 1].Order[iOrd].Copy();
                    ordCoord[order.OrdNumb].Bar = bar;
                    ordCoord[order.OrdNumb].Ord = iSessionOrder;
                    session[bar].Orders++;
                }

            return;
        }