MQL5 Calculate lot size for partial close

To add comments, please log in or register
Nairam18
398
Nairam18  

Hi!

I'm developing a Grid-EA on MQL5, and I'm stuck on a particular problem.

I have the follwing problem to solve and was wondering if you could help me out.
This is the problem I'm trying to solve:
Imagine we have have a grid of buy positions:
1. buy position 1 lot
2. buy position 2 lots
3. buy position 4 lots
4. buy positons 8 lots
We have a parameter called


- minimum profit to reduce drawdown (in account currency


which is set to 60 (USD) for example.

If the 4. buy position goes >= 60 USD
the EA should partially close the 1. buy position with x lots equivalent to 60 USD
and close (reduce) the 1. buy position to x lots.

The problem I have is calculating the lot size the EA should partially close equal to 60 USD.
I have a solution in code. The problem is, however I try to achieve it I don't seem to do the right calculations because I get a loss after the partial close.

So I guess my lot size is always to big, but I'm not sure.

Here is my approach in code:

// recovery
// start if x% in drawdown of account balance
double equity = currentAccount.Equity();
double minDrawdown = (currentAccount.Balance() / 100) * InpMinDDForRecoveryStart;
if (currentAccount.Equity() < (currentAccount.Balance() / 100) * InpMinDDForRecoveryStart || InpMinDDForRecoveryStart == 0) {
// check if the last open positions have some profits

CTrade trade;
CPositionInfo position;

// buy positions
if (countBuyPositions() > 1) {


for (int i = 0; i < countBuyPositions(); i++) {

position.SelectByIndex(i); 
ulong ticketCurrentPosition = position.Ticket();
double lotsCurrentPosition = position.Volume();
double lossCurrentPosition = positionProfitByTicket(ticketCurrentPosition, POSITION_TYPE_BUY);
double priceCurrentPosition = position.PriceOpen();

ulong ticketLastPosition = ticketLastPosition(POSITION_TYPE_BUY);

// check if current position is last, then skip
if (ticketCurrentPosition == ticketLastPosition) {
continue; 
}



double lastPositionProfit = positionProfitByTicket(ticketLastPosition, POSITION_TYPE_BUY);
// switch to last profit position
position.SelectByTicket(ticketLastPosition);
double priceLastPosition = position.PriceCurrent();



if (lotsCurrentPosition > 0.01 && lastPositionProfit > InpMinProfitToUse) {
// calculate lot for partial close
double tickValue = currentSymbol.TickValue();
double tickSize = currentSymbol.TickSize();
double point = Point();
double digits = Digits();
double deltaVal = deltaValuePerLot(Symbol() );
double deltaPips = deltaToPips(deltaVal);

// get distance between position to close and profit position
double distanceInPoints = MathRound((priceCurrentPosition - priceLastPosition)/SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE) );

if (distanceInPoints == 0) continue;

double volume = lastPositionProfit/distanceInPoints;

volume = normalizeLots(volume, Symbol() );

// close Profit making position
//trade.PositionClose(ticketLastPosition, InpMaxSlippage); 
// close Partial loss making position
trade.PositionClosePartial(ticketCurrentPosition, volume, InpMaxSlippage);

Print("Closed partial position with Profit: " + (lastPositionProfit - lossCurrentPosition) );


} else { 
continue;
}


The question is: 

is calculating the lot size like this wrong?


double volume = lastPositionProfit/distanceInPoints;


The normalize function is like this (from @whroeder1)

double normalizeLots(double lots, string pair=""){
    if (pair == "") pair = Symbol();
    double  lotStep     = SymbolInfoDouble(pair, SYMBOL_VOLUME_STEP);
    
    
    
    return MathRound(lots/lotStep) * lotStep;    

}


Thanks in advance for your help!


Best regards

To add comments, please log in or register