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