Calculating Lot size

 

Hi guys,

Im new here, i've read many articles about some estrategies and money management.

Well, i have studied some about lots calculation (exponential and others), then i just think in some strategy that could be calculate using some relation of Volume (ATR), risk per trade and tick value.

#extern variables

The TradeAtRisk variable is used by another function to calc SL price. This represent the quantity of money that i accepted to loss for each order.

extern	double	TradeAtRisk = 2.0; 
#function
double GetLots(int TypeOperation) //TypeOperation [OP_BUY or OP_SELL]
{          
     double CurrOscilation = iATR(Symbol(),NULL,20,0); //no special reason to use 20 periods.
     CurrOscilation = MathFloor(CurrOscilation * 100000);
     double TickPrice = MarketInfo(Symbol(),MODE_TICKVALUE);
     double LotSize = MathSqrt( (AccountBalance()*TradeAtRisk/100) / CurrencyOscilation ) * TickPrice;
     while ( AccountFreeMarginCheck(Symbol(),TypeOperation,LotSize) <= 0 || GetLastError() == ERR_NOT_ENOUGH_MONEY)
     {
         LotSize = LotSize - (LotSize*0.01);
     }    
     return (NormalizeDouble(LotSize,2));
}

The result maybe like this:

Balance$ 10.000,00
TradeAtRisk2.0%
ATR ("X" Periods)120
TickValue$ 0,98
LOT
1,26517


Thanks
Daniel Niero

 
  1. double TickPrice = MarketInfo(Symbol(),MODE_TICKVALUE);
    
    double  PointValuePerLot() { // Value in account currency of a Point of Symbol.
        /* In tester I had a sale: open=1.35883 close=1.35736 (0.00147)
         * gain$=97.32/6.62 lots/147 points=$0.10/point or $1.00/pip.
         * IBFX demo/mini       EURUSD TICKVALUE=0.1 MAXLOT=50 LOTSIZE=10,000
         * IBFX demo/standard   EURUSD TICKVALUE=1.0 MAXLOT=50 LOTSIZE=100,000
         *                                  $1.00/point or $10.00/pip.
         *
         * https://www.mql5.com/en/forum/127584 CB: MODE_TICKSIZE will usually return the
         * same value as MODE_POINT (or Point for the current symbol), however, an
         * example of where to use MODE_TICKSIZE would be as part of a ratio with
         * MODE_TICKVALUE when performing money management calculations which need
         * to take account of the pair and the account currency. The reason I use
         * this ratio is that although TV and TS may constantly be returned as
         * something like 7.00 and 0.00001 respectively, I've seen this
         * (intermittently) change to 14.00 and 0.00002 respectively (just example
         * tick values to illustrate). */
        return(  MarketInfo(Symbol(), MODE_TICKVALUE)
               / MarketInfo(Symbol(), MODE_TICKSIZE) ); // Not Point.
    }
    

  2. return (NormalizeDouble(LotSize,2));
    
    This assumes LotStep == 0.01.
        double  minLot  = MarketInfo(Symbol(), MODE_MINLOT),
                LotStep = MarketInfo(Symbol(), MODE_LOTSTEP),
                perLotPerPoint  = PointValuePerLot(),
                maxLossPerLot   = (risk+Slippage.Pips*pips2dbl) * perLotPerPoint,
                size = maxRisk / maxLossPerLot;     // Must still round to LotStep.
        /*---- Compute lot size based on account balance and MM mode*/}
        /* The broker doesn't care about the at.risk/account balance. They care
         * about margin. Margin used=lots used*marginPerLot and that must be less
         * than free margin available. Using the lesser of size vs
         * AccountFreeMargin / MODE_MARGINREQUIRED should have been sufficient, but
         * the tester was generating error 134 even when marginFree should have been
         * OK. So I also use AccountFreeMarginCheck < 0 which agrees with the
         * tester. Reported at https://www.mql5.com/en/forum/128506
         *
         * Second problem, after opening the new order, if free margin then drops to
         * zero we get a margin call. In the tester, the test stops with: "EA:
         * stopped because of Stop Out" So I make sure that the free margin
         * after is larger then the equity risk so I never get a margin call. */
        EA.status = "SL>AE";    // Assume size < minLot
        while (true){   // Adjust for broker, test for margin, combine with TEF...
            size = MathFloor(MathMax(0.,size)/LotStep)*LotStep;
            at.risk.new = size * maxLossPerLot;                 // Export for Comment
            if (size < minLot){     /*at.risk.new=0;*/                  return(0); }
    
            double  AFMC    = AccountFreeMarginCheck(Symbol(), op.code, size),
                    eRisk   = at.risk.equity + risk*size*perLotPerPoint;
            if (AFMC*0.99 <= eRisk){    size *= 0.95;   EA.status = "Free Margin";
                continue;   }   // Prevent margin call if new trade goes against us.
            break;
        }
    

 

Hi Roeder,
i just saw your response. I will study more calmly later. Its very interesting, cause im having the exactly problem of STOP OUT as you said.

I will response later.

thanks a lot!
NIERO

 
Stop out is a different matter. AFMC just tells you if you have enough margin to open the order. As the trades go against you AccountEquity and AccountFreeMargin drop.
at.risk.equity += Direction( OrderType() )
              * (OrderClosePrice()-OrderStopLoss())*perPoint;
Summed for all open orders.
 

If I know the account balance, the dollar amount I am willing to risk, and the stop loss in pips, how do I calculate the order size in lots? For example:

Account balance ($USD): 1,000.00

Amount of risk (%): 0.02

Total dollar risk ($USD): 1,000 * 0.02 = 20.00

Stop loss (pips): 50

Dollar risk per pip ($USD): 20.00 / 50 = 0.40

Order size (lots): ?


Thank you.

 
  1. deltatangoxray: Dollar risk per pip ($USD): 20.00 / 50 = 0.40
    Dollar risk per pip is $10/lot ($1/point on a 5 digit broker) for a pair ending with USD, on a USD currency account. Period. The Dollar risk total is 50 pips * $10/lot * lotsize. $20.00/500=0.04 lots.
  2. In code
    • You place the stop where it needs to be - where the reason for the trade is no longer valid. E.g. trading a support bounce the stop goes below the support.
    • Account Balance * percent/100 = RISK = OrderLots * (|OrderOpenPrice - OrderStopLoss| * DeltaPerlot + CommissionPerLot) (Note OOP-OSL includes the SPREAD)
    • Do NOT use TickValue by itself - DeltaPerlot
    • You must normalize lots properly and check against min and max.
    • You must also check FreeMargin to avoid stop out
  3. Use a GUI: Indicators: Money Manager Graphic Tool - MQL5.community traders' Forum - Page 5 'Money Manager Graphic Tool' indicator by 'takycard'
Reason: