Better late than never.
There are lots of nuances to consider when pricing options. The help desk should have been able to point you towards a solution. I do not think they will (be able to) replicate completely but should at least provide generic examples.
Personally, I do not like domestic vs foreign. Tends to cause confusion in my humble opinion. I will use CCY1CCY2 (USDJPY).
Garman-Kohlhagen (short GK) uses domestic and foreign in its definitions. It's quoted in units of domestic currency per unit of foreign currency. Hence USD is foreign, JPY domestic as pointed out by rbonallo.
E.g.
- it is unlikely your time is exactly 0.25 (FX vol has a cutoff, and on top of this, there is the distinction between expiry and delivery time)
- displayed rates are usually not continuous; whereas Garman-Kohlhagen requires cont. rates
- by default, JPY rate would be implied via covered interest rate parity (solved for JPY rate here ($r_{ccy2}$) to be internally consistent
$$f(s,ccy1,ccy2,t) = s*exp^{(r_{ccy2}-r_{ccy1})*t}$$
- GK is priced in terms of notional in ccy1, and premium in ccy2
- call is in perspective of ccy1
- OVML has a lot more decimals under the hood: the settings allow you to display increased precision - which should be visible when you hover over the values
Either way, ignoring all this, and simply plugging in your values on the terminal gives ~1.5M JPY. Displaying the result in USD gives what rbonallo provided. About 121 USD pips (13.66K USD for default 1 million USD notional). This is 1.37% P (for pay) in USD. Slightly different from your values but I simply used todays 3 month, was overriding the values, and ignored interest rate quotation etc.
$$𝑐=𝑆 *𝑒xp^{−𝑟_{𝑐𝑐𝑦1}*𝑇}*𝑁(𝑑1) −𝐾*𝑒xp^{−𝑟_{𝑐𝑐𝑦2}*𝑇} *𝑁(𝑑_2)$$
I am not typing this here but coded it in Julia. The below ignores every detail mentioned above which is why it does NOT match exactly. If you want an exact computation, you can see here how implied rates and daycount works in FX option pricing.
You cannot simple divide by spot (as you ask in your edit) because your value is derived by mixing up interest rates(see screenshot: #wrong). If you go from JPY to USD premium, that is where spot comes in (see screenshot again).
To drive this home, if you were to invert this (use JPYUSD) you now have notional in JPY and premium in USD, as well as a call on JPY. To get the same result, you value a put on JPY, where [2]
in the code pulls the second argument in the return function which is the put value.
Put on JPY = Call on USD
Also, you need to take into account that your notional is now actually in JPY. To adjust this you need to use Strike (not Spot) as that is what you actually exchange.
Getting Pct into Pips is a separate story.