How to calculate the pip value of a Currency Pair based on the Account Base Currency?

To add comments, please log in or register
Pooya Khamooshi
972
Pooya Khamooshi  

Assume the account balance is £1000 in GBP.

I'd like to buy a 5 digit market such as EURUSD (1.11270) with 50 pips (500 points) but only risk 1% so 50 pips = £10

so every pip should be worth or cost 20 pence for me.

So what is the formula to calculate the lot sizing so that each pip cost me 20 pence for the above example?

similarly what formula should be used for markets with 3 digits like USDJPY (e.g. 109.493) so that each pip cost me 20 pence only.

I've written the below that works but not sure how to find the exchange rate for the counter currency? e.g. CHFGBP when trading EURCHF with GBP as base or e.g. USDEUR when trading EURUSD with GBP as base.

// e.g. "GBP"
string baseCurrency = AccountCurrency();

double FindLotSize(int pips = 50, double riskPercentage = 1) {

        // e.g. £10
        double maxRiskAmount = AccountBalance() * riskPercentage / 100;
        
        // e.g. 10 for EURUSD and 1000 for USDJPY
        int multiplier = Digits >= 4 ? 10 : 1000;

        // e.g. USDEUR, if the target currency was EURCHF then the counter currency would have been CHFGBP
        double counterCurrencyExchangeRate  = // ? how to calculate?

        return multiplier * counterCurrencyExchangeRate * maxRiskAmount * pips;
}
Documentation on MQL5: Constants, Enumerations and Structures / Environment State / Account Properties
Documentation on MQL5: Constants, Enumerations and Structures / Environment State / Account Properties
  • www.mql5.com
, then each symbol positions will be closed in the same order, in which they are opened, starting with the oldest one. In case of an attempt to close positions in a different order, the trader will receive an appropriate error. There are several types of accounts that can be opened on a trade server. The type of account on which an...
William Roeder
20233
William Roeder  
Pooya Khamooshi: with 50 pips (500 points) but only risk 1% so 50 pips = £10
Never risk more than a small percentage of your account, certainly less than 2% per trade, 6% total to the account.
  1. Risk depends on your initial stop loss, lot size, and the value of the pair. It does not depend on margin and leverage.
    1. 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.
    2. AccountBalance * percent/100 = RISK = OrderLots * (|OrderOpenPrice - OrderStopLoss| * DeltaPerLot + CommissionPerLot) (Note OOP-OSL includes the spread, and DeltaPerLot is usually around $10/pip but it takes account of the exchange rates of the pair vs. your account currency.)
    3. Do NOT use TickValue by itself - DeltaPerLot and verify that MODE_TICKVALUE is returning a value in your deposit currency, as promised by the documentation, or whether it is returning a value in the instrument's base currency.
                MODE_TICKVALUE is not reliable on non-fx instruments with many brokers - MQL4 programming forum 2017.10.10
                Is there an universal solution for Tick value? - Currency Pairs - General - MQL5 programming forum 2018.02.11
                Lot value calculation off by a factor of 100 - MQL5 programming forum 2019.07.19
    4. You must normalize lots properly and check against min and max.
    5. You must also check FreeMargin to avoid stop out

    Most pairs are worth about $10 per PIP. A $5 risk with a (very small) 5 PIP SL is $5/$10/5 or 0.1 Lots maximum.

  2. Search for a GUI/Trade Assistant EA like mine (for MT 4): 'Money Manager Graphic Tool' indicator by 'takycard' - Risk Management - Articles, Library comments - MQL5 programming forum - Page 6 #55
Pooya Khamooshi
972
Pooya Khamooshi  
Thanks for the reply but hasn't helped.
Pooya Khamooshi
972
Pooya Khamooshi  

Here is my solution for others to enjoy. Btw, the Trade Assistant EA that is on the market has wrong calculations.

double LotSizeHelper::FindLotSize(int stopLossPips = 50, double riskPercentage = 1) {
   // e.g. £10 = £1000 * 1%
   double maxRiskAmount = AccountBalance() * riskPercentage / 100;
      
   // e.g. 20 pence = £10 / 50
   double riskPerPip = maxRiskAmount / stopLossPips;
 
   double pipValue = 10 * MarketInfo(Symbol(), MODE_TICKVALUE);
   double lot = riskPerPip / pipValue;  
   
   // _numberOfDecimal is based on the min_lot e.g. 2 if min lot is 0.01    
   return NormalizeDouble(lot, _numberOfDecimal);
  }
  
amando
2279
amando  
way easier you can use the TickValue
Pooya Khamooshi
972
Pooya Khamooshi  
amando:
way easier you can use the TickValue

How? Could you rewrite the method with the way you think is way easier and achieve same result?

Looking into it in more details, my understanding is TickSize is the minimum price movement which would be equal to Point for that market e.g. 0.00001 for EURUSD and 0.001 for USDJPY.

TickValue is the point value of the asked market in the deposit currency So

Pip Value = 10 * MarketInfo(Symbol(), MODE_TICKVALUE);

Correct?

Alain Verleyen
38714
Alain Verleyen  
Fabio Cavalloni:

Lot size = (Risk Amount/Stop loss points) / Tick value

For example: you have a $10'000 account and you trade EURUSD with a SL of 100 pips (1000 points with a 5 digit broker) and want to risk 1% ($100).

Your size will be = 100 / 1000 / 1 = 0.1

Remember to always check LOT_MIN, LOT_MAX and normalize value to LOT_STEP
This is exactly what @Pooya Khamooshi is doing in his posted code, what is the point of your post ?
Alain Verleyen
38714
Alain Verleyen  
Pooya Khamooshi:

Here is my solution for others to enjoy. Btw, the Trade Assistant EA that is on the market has wrong calculations.

If you want reliable code you need to check for pipValue!=0 otherwise you are risking a divide by zero error.

It may happen MarketInfo(Symbol(), MODE_TICKVALUE) returns 0.

To add comments, please log in or register