350: v_rc_in xtr_rate_conversion.rate_conv_in_rec_type;
351: v_rc_out xtr_rate_conversion.rate_conv_out_rec_type;
352:
353: BEGIN
354: IF xtr_risk_debug_pkg.g_Debug THEN
355: xtr_risk_debug_pkg.dpush('FX_SPOT_RATE: ' || 'XTR_MM_FORMULAS.FX_GK_OPTION_PRICE_CV');
356: END IF;
357:
358: --get number of days in Actual/365 -- bug 3509267
351: v_rc_out xtr_rate_conversion.rate_conv_out_rec_type;
352:
353: BEGIN
354: IF xtr_risk_debug_pkg.g_Debug THEN
355: xtr_risk_debug_pkg.dpush('FX_SPOT_RATE: ' || 'XTR_MM_FORMULAS.FX_GK_OPTION_PRICE_CV');
356: END IF;
357:
358: --get number of days in Actual/365 -- bug 3509267
359: xtr_calc_p.calc_days_run_c(p_in_rec.p_spot_date, p_in_rec.p_maturity_date,
362: --need to converts all rates to Continuously compounded Actual/365 -- bug 3509267
363: v_rc_in.p_rate_type_out := 'C';
364: v_rc_in.p_day_count_basis_out := 'ACTUAL365';
365: /*
366: IF xtr_risk_debug_pkg.g_Debug THEN
367: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Rate Type Dom',p_in_rec.p_rate_type_dom);
368: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Rate Type For',p_in_rec.p_rate_type_for);
369: END IF;
370: */
363: v_rc_in.p_rate_type_out := 'C';
364: v_rc_in.p_day_count_basis_out := 'ACTUAL365';
365: /*
366: IF xtr_risk_debug_pkg.g_Debug THEN
367: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Rate Type Dom',p_in_rec.p_rate_type_dom);
368: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Rate Type For',p_in_rec.p_rate_type_for);
369: END IF;
370: */
371: --convert domestic rate to continuous ACTUAL/365 -- bug 3509267
364: v_rc_in.p_day_count_basis_out := 'ACTUAL365';
365: /*
366: IF xtr_risk_debug_pkg.g_Debug THEN
367: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Rate Type Dom',p_in_rec.p_rate_type_dom);
368: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Rate Type For',p_in_rec.p_rate_type_for);
369: END IF;
370: */
371: --convert domestic rate to continuous ACTUAL/365 -- bug 3509267
372: IF NOT (p_in_rec.p_rate_type_dom IN ('C','c') AND
376: v_rc_in.p_rate_in := p_in_rec.p_rate_dom;
377: v_rc_in.p_start_date := p_in_rec.p_spot_date;
378: v_rc_in.p_end_date := p_in_rec.p_maturity_date;
379: v_rc_in.p_compound_freq_in := p_in_rec.p_compound_freq_dom;
380: IF xtr_risk_debug_pkg.g_Debug THEN
381: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Rate Type Dom',p_in_rec.p_rate_type_dom);
382: END IF;
383: xtr_rate_conversion.rate_conversion(v_rc_in, v_rc_out);
384: v_contra_int_rate := v_rc_out.p_rate_out;
377: v_rc_in.p_start_date := p_in_rec.p_spot_date;
378: v_rc_in.p_end_date := p_in_rec.p_maturity_date;
379: v_rc_in.p_compound_freq_in := p_in_rec.p_compound_freq_dom;
380: IF xtr_risk_debug_pkg.g_Debug THEN
381: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Rate Type Dom',p_in_rec.p_rate_type_dom);
382: END IF;
383: xtr_rate_conversion.rate_conversion(v_rc_in, v_rc_out);
384: v_contra_int_rate := v_rc_out.p_rate_out;
385: ELSE
400: ELSE
401: v_base_int_rate := p_in_rec.p_rate_for;
402: END IF;
403: /*
404: IF xtr_risk_debug_pkg.g_Debug THEN
405: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'No. of Days',v_days);
406: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Foreign IR C Actual/365',v_base_int_rate);
407: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Domestic IR C Actual365', v_contra_int_rate);
408: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Strike Rate',p_in_rec.p_strike_rate);
401: v_base_int_rate := p_in_rec.p_rate_for;
402: END IF;
403: /*
404: IF xtr_risk_debug_pkg.g_Debug THEN
405: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'No. of Days',v_days);
406: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Foreign IR C Actual/365',v_base_int_rate);
407: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Domestic IR C Actual365', v_contra_int_rate);
408: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Strike Rate',p_in_rec.p_strike_rate);
409: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Spot Rate',p_in_rec.p_spot_rate);
402: END IF;
403: /*
404: IF xtr_risk_debug_pkg.g_Debug THEN
405: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'No. of Days',v_days);
406: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Foreign IR C Actual/365',v_base_int_rate);
407: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Domestic IR C Actual365', v_contra_int_rate);
408: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Strike Rate',p_in_rec.p_strike_rate);
409: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Spot Rate',p_in_rec.p_spot_rate);
410: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Vol',p_in_rec.p_volatility);
403: /*
404: IF xtr_risk_debug_pkg.g_Debug THEN
405: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'No. of Days',v_days);
406: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Foreign IR C Actual/365',v_base_int_rate);
407: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Domestic IR C Actual365', v_contra_int_rate);
408: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Strike Rate',p_in_rec.p_strike_rate);
409: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Spot Rate',p_in_rec.p_spot_rate);
410: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Vol',p_in_rec.p_volatility);
411: END IF;
404: IF xtr_risk_debug_pkg.g_Debug THEN
405: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'No. of Days',v_days);
406: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Foreign IR C Actual/365',v_base_int_rate);
407: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Domestic IR C Actual365', v_contra_int_rate);
408: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Strike Rate',p_in_rec.p_strike_rate);
409: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Spot Rate',p_in_rec.p_spot_rate);
410: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Vol',p_in_rec.p_volatility);
411: END IF;
412: */
405: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'No. of Days',v_days);
406: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Foreign IR C Actual/365',v_base_int_rate);
407: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Domestic IR C Actual365', v_contra_int_rate);
408: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Strike Rate',p_in_rec.p_strike_rate);
409: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Spot Rate',p_in_rec.p_spot_rate);
410: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Vol',p_in_rec.p_volatility);
411: END IF;
412: */
413: --call fx_gk_option_price
406: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Foreign IR C Actual/365',v_base_int_rate);
407: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Domestic IR C Actual365', v_contra_int_rate);
408: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Strike Rate',p_in_rec.p_strike_rate);
409: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Spot Rate',p_in_rec.p_spot_rate);
410: xtr_risk_debug_pkg.dlog('FX_SPOT_RATE: ' || 'Vol',p_in_rec.p_volatility);
411: END IF;
412: */
413: --call fx_gk_option_price
414: fx_gk_option_price(v_days, v_base_int_rate, v_contra_int_rate,
417: p_out_rec.p_call_price, p_out_rec.p_put_price,
418: p_out_rec.p_fx_fwd_rate, p_out_rec.p_nd1, p_out_rec.p_nd2,
419: p_out_rec.p_nd1_a, p_out_rec.p_nd2_a);
420:
421: IF xtr_risk_debug_pkg.g_Debug THEN
422: xtr_risk_debug_pkg.dpop('FX_SPOT_RATE: ' || 'XTR_MM_FORMULAS.FX_GK_OPTION_PRICE_CV');
423: END IF;
424: END fx_gk_option_price_cv;
425:
418: p_out_rec.p_fx_fwd_rate, p_out_rec.p_nd1, p_out_rec.p_nd2,
419: p_out_rec.p_nd1_a, p_out_rec.p_nd2_a);
420:
421: IF xtr_risk_debug_pkg.g_Debug THEN
422: xtr_risk_debug_pkg.dpop('FX_SPOT_RATE: ' || 'XTR_MM_FORMULAS.FX_GK_OPTION_PRICE_CV');
423: END IF;
424: END fx_gk_option_price_cv;
425:
426: --added by sankim 9/12/01
560: v_forward_rate_base_ask NUMBER;
561: v_forward_rate_contra_bid NUMBER;
562: v_forward_rate_contra_ask NUMBER;
563: BEGIN
564: IF xtr_risk_debug_pkg.g_Debug THEN
565: xtr_risk_debug_pkg.dpush('FX_FORWARD_RATE_CV: ' || 'XTR_FORWARD_RATE_CV');
566: END IF;
567: if (p_currency_base <> 'USD') AND (p_currency_contra <> 'USD') THEN
568: --if cross currency is involved
561: v_forward_rate_contra_bid NUMBER;
562: v_forward_rate_contra_ask NUMBER;
563: BEGIN
564: IF xtr_risk_debug_pkg.g_Debug THEN
565: xtr_risk_debug_pkg.dpush('FX_FORWARD_RATE_CV: ' || 'XTR_FORWARD_RATE_CV');
566: END IF;
567: if (p_currency_base <> 'USD') AND (p_currency_contra <> 'USD') THEN
568: --if cross currency is involved
569: -- calculate forward rates for base currency first
567: if (p_currency_base <> 'USD') AND (p_currency_contra <> 'USD') THEN
568: --if cross currency is involved
569: -- calculate forward rates for base currency first
570: if p_quotation_basis_base = 'C' then
571: IF xtr_risk_debug_pkg.g_Debug THEN
572: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'right base bid');
573: END IF;
574: --bid
575: XTR_FX_FORMULAS.fx_forward_rate(p_spot_rate_base_bid, p_usd_curr_int_rate_ask, p_base_curr_int_rate_bid, p_day_count_usd, p_day_count_base, p_annual_basis_usd, p_annual_basis_base, v_forward_rate_base_bid);
568: --if cross currency is involved
569: -- calculate forward rates for base currency first
570: if p_quotation_basis_base = 'C' then
571: IF xtr_risk_debug_pkg.g_Debug THEN
572: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'right base bid');
573: END IF;
574: --bid
575: XTR_FX_FORMULAS.fx_forward_rate(p_spot_rate_base_bid, p_usd_curr_int_rate_ask, p_base_curr_int_rate_bid, p_day_count_usd, p_day_count_base, p_annual_basis_usd, p_annual_basis_base, v_forward_rate_base_bid);
576: --ask
583: else
584: RAISE_APPLICATION_ERROR
585: (-20001,'p_quotation_basis_base must be ''C'' or ''B''.');
586: end if;
587: IF xtr_risk_debug_pkg.g_Debug THEN
588: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'contra quotation basis',p_quotation_basis_contra);
589: END IF;
590: --now calculate forward rates for contra currency
591: if p_quotation_basis_contra = 'C' then
584: RAISE_APPLICATION_ERROR
585: (-20001,'p_quotation_basis_base must be ''C'' or ''B''.');
586: end if;
587: IF xtr_risk_debug_pkg.g_Debug THEN
588: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'contra quotation basis',p_quotation_basis_contra);
589: END IF;
590: --now calculate forward rates for contra currency
591: if p_quotation_basis_contra = 'C' then
592: IF xtr_risk_debug_pkg.g_Debug THEN
588: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'contra quotation basis',p_quotation_basis_contra);
589: END IF;
590: --now calculate forward rates for contra currency
591: if p_quotation_basis_contra = 'C' then
592: IF xtr_risk_debug_pkg.g_Debug THEN
593: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'wrong contra bid');
594: END IF;
595: --bid
596: XTR_FX_FORMULAS.fx_forward_rate(p_spot_rate_contra_bid, p_usd_curr_int_rate_ask, p_contra_curr_int_rate_bid, p_day_count_usd, p_day_count_contra, p_annual_basis_usd, p_annual_basis_contra, v_forward_rate_contra_bid);
589: END IF;
590: --now calculate forward rates for contra currency
591: if p_quotation_basis_contra = 'C' then
592: IF xtr_risk_debug_pkg.g_Debug THEN
593: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'wrong contra bid');
594: END IF;
595: --bid
596: XTR_FX_FORMULAS.fx_forward_rate(p_spot_rate_contra_bid, p_usd_curr_int_rate_ask, p_contra_curr_int_rate_bid, p_day_count_usd, p_day_count_contra, p_annual_basis_usd, p_annual_basis_contra, v_forward_rate_contra_bid);
597: --ask
596: XTR_FX_FORMULAS.fx_forward_rate(p_spot_rate_contra_bid, p_usd_curr_int_rate_ask, p_contra_curr_int_rate_bid, p_day_count_usd, p_day_count_contra, p_annual_basis_usd, p_annual_basis_contra, v_forward_rate_contra_bid);
597: --ask
598: XTR_FX_FORMULAS.fx_forward_rate(p_spot_rate_contra_ask, p_usd_curr_int_rate_bid, p_contra_curr_int_rate_ask, p_day_count_usd, p_day_count_contra, p_annual_basis_usd, p_annual_basis_contra, v_forward_rate_contra_ask);
599: elsif p_quotation_basis_contra = 'B' then
600: IF xtr_risk_debug_pkg.g_Debug THEN
601: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'right contra bid');
602: END IF;
603: --bid
604: XTR_FX_FORMULAS.fx_forward_rate(p_spot_rate_contra_bid, p_contra_curr_int_rate_ask, p_usd_curr_int_rate_bid, p_day_count_contra, p_day_count_usd, p_annual_basis_contra, p_annual_basis_usd, v_forward_rate_contra_bid);
597: --ask
598: XTR_FX_FORMULAS.fx_forward_rate(p_spot_rate_contra_ask, p_usd_curr_int_rate_bid, p_contra_curr_int_rate_ask, p_day_count_usd, p_day_count_contra, p_annual_basis_usd, p_annual_basis_contra, v_forward_rate_contra_ask);
599: elsif p_quotation_basis_contra = 'B' then
600: IF xtr_risk_debug_pkg.g_Debug THEN
601: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'right contra bid');
602: END IF;
603: --bid
604: XTR_FX_FORMULAS.fx_forward_rate(p_spot_rate_contra_bid, p_contra_curr_int_rate_ask, p_usd_curr_int_rate_bid, p_day_count_contra, p_day_count_usd, p_annual_basis_contra, p_annual_basis_usd, v_forward_rate_contra_bid);
605: --ask
608: RAISE_APPLICATION_ERROR
609: (-20001,'p_quotation_basis_base must be ''C'' or ''B''.');
610: end if;
611: -- calculate cross rate
612: IF xtr_risk_debug_pkg.g_Debug THEN
613: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'base fwd bid',v_forward_rate_base_bid);
614: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'base fwd ask',v_forward_rate_base_ask);
615: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'contra fwd bid',v_forward_rate_contra_bid);
616: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'contra fwd ask',v_forward_rate_contra_ask);
609: (-20001,'p_quotation_basis_base must be ''C'' or ''B''.');
610: end if;
611: -- calculate cross rate
612: IF xtr_risk_debug_pkg.g_Debug THEN
613: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'base fwd bid',v_forward_rate_base_bid);
614: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'base fwd ask',v_forward_rate_base_ask);
615: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'contra fwd bid',v_forward_rate_contra_bid);
616: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'contra fwd ask',v_forward_rate_contra_ask);
617: END IF;
610: end if;
611: -- calculate cross rate
612: IF xtr_risk_debug_pkg.g_Debug THEN
613: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'base fwd bid',v_forward_rate_base_bid);
614: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'base fwd ask',v_forward_rate_base_ask);
615: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'contra fwd bid',v_forward_rate_contra_bid);
616: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'contra fwd ask',v_forward_rate_contra_ask);
617: END IF;
618: return XTR_FX_FORMULAS.fx_spot_rate_cv(p_currency_contra,p_currency_base,v_forward_rate_contra_bid,v_forward_rate_contra_ask,v_forward_rate_base_bid,v_forward_rate_base_ask,p_quotation_basis_contra,p_quotation_basis_base);
611: -- calculate cross rate
612: IF xtr_risk_debug_pkg.g_Debug THEN
613: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'base fwd bid',v_forward_rate_base_bid);
614: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'base fwd ask',v_forward_rate_base_ask);
615: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'contra fwd bid',v_forward_rate_contra_bid);
616: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'contra fwd ask',v_forward_rate_contra_ask);
617: END IF;
618: return XTR_FX_FORMULAS.fx_spot_rate_cv(p_currency_contra,p_currency_base,v_forward_rate_contra_bid,v_forward_rate_contra_ask,v_forward_rate_base_bid,v_forward_rate_base_ask,p_quotation_basis_contra,p_quotation_basis_base);
619: else
612: IF xtr_risk_debug_pkg.g_Debug THEN
613: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'base fwd bid',v_forward_rate_base_bid);
614: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'base fwd ask',v_forward_rate_base_ask);
615: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'contra fwd bid',v_forward_rate_contra_bid);
616: xtr_risk_debug_pkg.dlog('FX_FORWARD_RATE_CV: ' || 'contra fwd ask',v_forward_rate_contra_ask);
617: END IF;
618: return XTR_FX_FORMULAS.fx_spot_rate_cv(p_currency_contra,p_currency_base,v_forward_rate_contra_bid,v_forward_rate_contra_ask,v_forward_rate_base_bid,v_forward_rate_base_ask,p_quotation_basis_contra,p_quotation_basis_base);
619: else
620: --simpler case where there is no cross currency involved
658: end if;
659:
660: end if;
661: end if;
662: IF xtr_risk_debug_pkg.g_Debug THEN
663: xtr_risk_debug_pkg.dpop('FX_FORWARD_RATE_CV: ' || 'XTR_FORWARD_RATE_CV');
664: END IF;
665: END FX_FORWARD_RATE_CV;
666:
659:
660: end if;
661: end if;
662: IF xtr_risk_debug_pkg.g_Debug THEN
663: xtr_risk_debug_pkg.dpop('FX_FORWARD_RATE_CV: ' || 'XTR_FORWARD_RATE_CV');
664: END IF;
665: END FX_FORWARD_RATE_CV;
666:
667: END XTR_FX_FORMULAS;