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;
}