[Home] [Help]
PACKAGE BODY: APPS.QRM_CALCULATORS_P
Source
1 PACKAGE BODY QRM_CALCULATORS_P AS
2 /* $Header: qrmcalcb.pls 120.5 2004/07/02 16:19:21 jhung ship $ */
3
4 PROCEDURE ni_calculator (p_settlement_date DATE,
5 p_maturity_date DATE,
6 p_day_count_basis VARCHAR2,
7 --'C'=to calculate considertion,'M'=to calculate maturity
8 p_indicator VARCHAR2,
9 p_ref_amt NUMBER,
10 p_rate_type VARCHAR2,
11 --'DR'=discount rate,'Y'=yield rate
12 p_rate NUMBER,
13 p_consideration OUT NOCOPY NUMBER,
14 p_int_amt OUT NOCOPY NUMBER,
15 p_mat_amt OUT NOCOPY NUMBER,
16 p_price OUT NOCOPY NUMBER,
17 p_hold_prd OUT NOCOPY NUMBER,
18 p_adj_hold_prd OUT NOCOPY NUMBER,
19 p_conv_rate OUT NOCOPY NUMBER,
20 p_duration OUT NOCOPY NUMBER,
21 p_mod_dur OUT NOCOPY NUMBER,
22 p_bpv_y OUT NOCOPY NUMBER,
23 p_bpv_d OUT NOCOPY NUMBER,
24 p_dol_dur_y OUT NOCOPY NUMBER,
25 p_dol_dur_d OUT NOCOPY NUMBER,
26 p_convexity OUT NOCOPY NUMBER,
27 p_ccy IN OUT NOCOPY VARCHAR2) IS
28
29 v_yield NUMBER;
30 v_day_count NUMBER;
31 v_ann_basis NUMBER;
32 v_in_pv xtr_mm_covers.presentvalue_in_rec_type;
33 v_out_pv xtr_mm_covers.presentvalue_out_rec_type;
37 v_days xtr_md_num_table := xtr_md_num_table();
34 v_in_fv xtr_mm_covers.futurevalue_in_rec_type;
35 v_out_fv xtr_mm_covers.futurevalue_out_rec_type;
36 v_pvc xtr_md_num_table := xtr_md_num_table();
38
39 BEGIN
40 --call the debug package
41 IF (g_proc_level>=g_debug_level) THEN
42 xtr_risk_debug_pkg.dpush(null,'QRM_CALCULATORS_P.NI_CALCULATOR');
43 xtr_risk_debug_pkg.dlog('ni_calculator: ' || 'p_settlement_date',p_settlement_date);
44 xtr_risk_debug_pkg.dlog('ni_calculator: ' || 'p_maturity_date',p_maturity_date);
45 xtr_risk_debug_pkg.dlog('ni_calculator: ' || 'p_day_count_basis',p_day_count_basis);
46 xtr_risk_debug_pkg.dlog('ni_calculator: ' || 'p_indicator',p_indicator);
47 xtr_risk_debug_pkg.dlog('ni_calculator: ' || 'p_ref_amt',p_ref_amt);
48 xtr_risk_debug_pkg.dlog('ni_calculator: ' || 'p_rate_type',p_rate_type);
49 xtr_risk_debug_pkg.dlog('ni_calculator: ' || 'p_rate',p_rate);
50 END IF;
51
52 --need to find day count and ann basis first
53 xtr_calc_p.calc_days_run_c(p_settlement_date, p_maturity_date,
54 p_day_count_basis, null, v_day_count, v_ann_basis);
55 p_hold_prd := p_maturity_date - p_settlement_date;
56 p_adj_hold_prd := v_day_count;
57 --calc the mat. or cons depending on the indicator
58 IF (p_indicator = 'C') THEN
59 p_mat_amt := p_ref_amt;
60 v_in_pv.p_indicator := p_rate_type;
61 v_in_pv.p_future_val := p_ref_amt;
62 v_in_pv.p_rate := p_rate;
63 v_in_pv.p_day_count := v_day_count;
64 v_in_pv.p_annual_basis := v_ann_basis;
65 xtr_mm_covers.present_value(v_in_pv, v_out_pv);
66 p_consideration := v_out_pv.p_present_val;
67 ELSE
68 p_consideration := p_ref_amt;
69 v_in_fv.p_indicator := p_rate_type;
70 v_in_fv.p_present_val := p_ref_amt;
71 v_in_fv.p_rate := p_rate;
72 v_in_fv.p_day_count := v_day_count;
73 v_in_fv.p_annual_basis := v_ann_basis;
74 xtr_mm_covers.future_value(v_in_fv, v_out_fv);
75 p_mat_amt := v_out_fv.p_future_val;
76 END IF;
77 p_int_amt := p_mat_amt - p_consideration;
78 p_price := (p_consideration/p_mat_amt)*100;
79
80 --calculate Converted Rate
81 IF (p_rate_type <> 'Y') THEN
82 xtr_rate_conversion.discount_to_yield_rate(p_rate,v_day_count,v_ann_basis,
83 p_conv_rate);
84 ELSE
85 xtr_rate_conversion.yield_to_discount_rate(p_rate,v_day_count,v_ann_basis,
86 p_conv_rate);
87 END IF;
88
89 --calculate sensitivities, first Duration
90 v_pvc.EXTEND;
91 v_days.EXTEND;
92 v_pvc(1) := 1;
93 v_days(1) := v_day_count;
94 p_duration := qrm_mm_formulas.duration(v_pvc,v_days,v_ann_basis);
95 --calc Mod Dur, first we need yield rate
96 IF (p_rate_type <> 'Y') THEN
97 v_yield := p_conv_rate;
98 ELSE
99 v_yield := p_rate;
100 END IF;
101 --xtr_risk_debug_pkg.dlog('p_rate_type',p_rate_type);
102 p_mod_dur := qrm_mm_formulas.mod_duration(p_duration,v_yield,1);
103 --calc BPV Yield and Discount
104 p_bpv_y := qrm_mm_formulas.bpv_yr(p_consideration,p_mod_dur);
105 p_bpv_d := qrm_mm_formulas.ni_bpv_dr(p_mat_amt,v_day_count,v_ann_basis);
106 --calc Dollar Duration for Yield and Discount
107 p_dol_dur_y := qrm_mm_formulas.ni_delta_bpv('DOLLAR',p_bpv_y);
108 p_dol_dur_d := qrm_mm_formulas.ni_delta_bpv('DOLLAR',p_bpv_d);
109 --calc convexity
110 p_convexity := qrm_mm_formulas.ni_fra_convexity(v_day_count,v_yield,v_ann_basis);
111
112 --if currency is null defaults value to XTR Reporting Curr.
113 IF (p_ccy IS NULL) THEN
114 SELECT param_value INTO p_ccy
115 FROM xtr_pro_param WHERE param_name = 'SYSTEM_FUNCTIONAL_CCY';
116 END IF;
117
118 IF (g_proc_level>=g_debug_level) THEN
119 xtr_risk_debug_pkg.dpop(null,'QRM_CALCULATORS_P.NI_CALCULATOR');
120 END IF;
121
122 END ni_calculator;
123
124
125
126 PROCEDURE fx_calculator(p_date_args IN SYSTEM.QRM_DATE_TABLE,
127 p_varchar_args IN OUT NOCOPY SYSTEM.QRM_VARCHAR_TABLE,
128 p_num_args IN OUT NOCOPY xtr_md_num_table) IS
129
130 p_spot_date date := p_date_args(1);
131 p_forward_date date := p_date_args(2);
132
133 p_indicator varchar2(1) := p_varchar_args(1);
134 p_base_ccy varchar2(15) := p_varchar_args(2);
135 p_contra_ccy varchar2(15) := p_varchar_args(3);
136 p_currency_quote varchar2(20) := p_varchar_args(4);
137 p_interest_quote varchar2(20) := p_varchar_args(5);
138 p_base_curve varchar2(20) := p_varchar_args(6);
139 p_contra_curve varchar2(20) := p_varchar_args(7);
140 p_usd_curve varchar2(20) := p_varchar_args(8);
141 p_base_interpolation varchar2(20) := p_varchar_args(9);
142 p_contra_interpolation varchar2(20) := p_varchar_args(10);
143 p_usd_interpolation varchar2(20) := p_varchar_args(11);
144 p_base_quote_usd varchar2(1) := p_varchar_args(12);
145 p_contra_quote_usd varchar2(1) := p_varchar_args(13);
146 p_base_day_count varchar2(15) := p_varchar_args(14);
147 p_contra_day_count varchar2(15) := p_varchar_args(15);
148 p_usd_day_count varchar2(15) := p_varchar_args(16);
149 p_res_first_base_ccy varchar2(15) := p_varchar_args(17);
150 p_res_first_contra_ccy varchar2(15) := p_varchar_args(18);
151 p_res_sec_base_ccy varchar2(15) := p_varchar_args(19);
152 p_res_sec_contra_ccy varchar2(15) := p_varchar_args(20);
153
154 p_base_ccy_amt number := p_num_args(1);
155 p_base_spot_bid number := p_num_args(2);
156 p_base_spot_ask number := p_num_args(3);
157 p_contra_spot_bid number := p_num_args(4);
158 p_contra_spot_ask number := p_num_args(5);
159 p_base_int_rate_bid number := p_num_args(6);
160 p_base_int_rate_ask number := p_num_args(7);
161 p_contra_int_rate_bid number := p_num_args(8);
165 p_res_spot_bid number := p_num_args(12);
162 p_contra_int_rate_ask number := p_num_args(9);
163 p_usd_int_rate_bid number := p_num_args(10);
164 p_usd_int_rate_ask number := p_num_args(11);
166 p_res_spot_ask number := p_num_args(13);
167 p_res_first_rate_bid number := p_num_args(14);
168 p_res_first_rate_ask number := p_num_args(15);
169 p_res_first_points_bid number := p_num_args(16);
170 p_res_first_points_ask number := p_num_args(17);
171 p_res_sec_rate_bid number := p_num_args(18);
172 p_res_sec_rate_ask number := p_num_args(19);
173 p_res_sec_points_bid number := p_num_args(20);
174 p_res_sec_points_ask number := p_num_args(21);
175 p_res_fwd_rate_bid number := p_num_args(22);
176 p_res_fwd_rate_ask number := p_num_args(23);
177 p_res_fwd_points_bid number := p_num_args(24);
178 p_res_fwd_points_ask number := p_num_args(25);
179 p_delta_spot_bid number := p_num_args(26);
180 p_delta_spot_ask number := p_num_args(27);
181 p_rho_base_bid number := p_num_args(28);
182 p_rho_base_ask number := p_num_args(29);
183 p_rho_contra_bid number := p_num_args(30);
184 p_rho_contra_ask number := p_num_args(31);
185
186 p_curve_types SYSTEM.QRM_VARCHAR_TABLE;
187 p_curve_codes SYSTEM.QRM_VARCHAR_TABLE;
188 p_rate_types SYSTEM.QRM_VARCHAR_TABLE;
189 p_base_currencies SYSTEM.QRM_VARCHAR_TABLE;
190 p_contra_currencies SYSTEM.QRM_VARCHAR_TABLE;
191 p_quote_bases SYSTEM.QRM_VARCHAR_TABLE;
192 p_interp_methods SYSTEM.QRM_VARCHAR_TABLE;
193 p_data_sides SYSTEM.QRM_VARCHAR_TABLE;
194 p_day_count_bases SYSTEM.QRM_VARCHAR_TABLE;
195 p_spot_quote_bases SYSTEM.QRM_VARCHAR_TABLE;
196
197 p_rates_table xtr_md_num_table;
198
199 p_day_count_base number;
200 p_day_count_contra number;
201 p_day_count_usd number;
202 p_year_basis_base number;
203 p_year_basis_contra number;
204 p_year_basis_usd number;
205
206 p_bid_rate_comm number;
207 p_ask_rate_comm number;
208 p_bid_rate_base number;
209 p_ask_rate_base number;
210 p_ccy varchar2(15);
211
212
213 -- boolean for checking whether usd row is required
214 -- true if neither currency is USD
215 p_neither_usd boolean := (p_base_ccy<>'USD' AND p_contra_ccy<>'USD');
216
217 -- overwrite system quotation basis against usd when one currency is 'USD'
218 -- want to overwrite for FX Forward
219 p_ow_spot_rates boolean := true;
220
221 md_in_rec XTR_MARKET_DATA_P.md_from_curve_in_rec_type;
222 md_out_rec XTR_MARKET_DATA_P.md_from_curve_out_rec_type;
223
224 p_spot_rates xtr_md_num_table := xtr_md_num_table();
225 p_forward_rates xtr_md_num_table := xtr_md_num_table();
226
227 df_in_rec XTR_RATE_CONVERSION.df_in_rec_type;
228 df_out_rec XTR_RATE_CONVERSION.df_out_rec_type;
229 p_int_rates xtr_md_num_table;
230 p_day_counts SYSTEM.QRM_VARCHAR_TABLE;
231 p_dis_factors xtr_md_num_table := xtr_md_num_table();
232
233 p_delta xtr_md_num_table;
234 p_rho xtr_md_num_table;
235
236 BEGIN
237 IF (g_proc_level>=g_debug_level) THEN
238 xtr_risk_debug_pkg.dpush(null,'QRM_CALCULATORS_P.fx_calculator');
239 END IF;
240
241 IF fnd_msg_pub.count_msg > 0 THEN
242 fnd_msg_pub.Initialize;
243 END IF;
244
245 -- Use Default Curves
246 -- Do preparation work
247 IF (p_indicator = 'D') THEN
248 IF (g_proc_level>=g_debug_level) THEN
249 xtr_risk_debug_pkg.dpush('fx_calculator: ' || 'Calculation Based On Defaults');
250 END IF;
251
252 -- ** Default fields ** --
253 p_base_interpolation := 'DEFAULT';
254 p_contra_interpolation := 'DEFAULT';
255 p_usd_interpolation := 'DEFAULT';
256 p_interest_quote := 'BID/ASK';
257 p_base_day_count := 'ACTUAL/ACTUAL';
258 p_contra_day_count := 'ACTUAL/ACTUAL';
259 p_usd_day_count := 'ACTUAL/ACTUAL';
260 -- ****************** --
261
262 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD','YIELD','YIELD');
263 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy,p_contra_ccy,'USD');
264
265 p_curve_codes := get_curves_from_base(p_curve_types,p_base_currencies,
266 p_contra_currencies);
267 p_base_curve := p_curve_codes(1);
268 p_contra_curve := p_curve_codes(2);
269 p_usd_curve := null;
270 p_usd_interpolation := null;
271
272 IF (g_proc_level>=g_debug_level) THEN
273 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'base curve', p_base_curve);
274 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'contra curve', p_contra_curve);
275 END IF;
276 -- if neither currency is USD, then a USD curve is needed
277 if (p_neither_usd) then
278 p_usd_curve := p_curve_codes(3);
279 p_usd_interpolation := 'DEFAULT';
280 IF (g_proc_level>=g_debug_level) THEN
281 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'usd required', p_neither_usd);
282 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'usd curve', p_usd_curve);
283 END IF;
284 end if;
285
286 -- calculate Rates
287 -- this follows the calculator table across each row
288 -- first do Spot Rates
289 -- get quotation basis against usd defined in Current System Rates
290 p_spot_quote_bases := get_spot_quotation_basis(p_base_ccy, p_contra_ccy,
291 p_ow_spot_rates);
292 p_base_quote_usd := p_spot_quote_bases(1);
293 p_contra_quote_usd := p_spot_quote_bases(2);
294 if (p_base_ccy = 'USD' AND p_contra_ccy <> 'USD') then
295 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
296 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_contra_ccy, p_contra_ccy);
300 elsif (p_contra_ccy = 'USD' AND p_base_ccy <> 'USD') then
297 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_contra_quote_usd,
298 p_contra_quote_usd);
299 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
301 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
302 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy, p_base_ccy);
303 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_base_quote_usd,p_base_quote_usd);
304 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
305 elsif (p_base_ccy <> 'USD' AND p_contra_ccy <> 'USD') then
306 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT','SPOT','SPOT');
307 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy,p_base_ccy,
308 p_contra_ccy, p_contra_ccy);
309 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_base_quote_usd, p_base_quote_usd,
310 p_contra_quote_usd,p_contra_quote_usd);
311 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
312 end if;
313
314 p_rates_table := get_rates_from_base(p_rate_types, p_base_currencies,
315 p_contra_currencies, p_quote_bases,
316 p_interp_methods, p_data_sides,
317 p_day_count_bases,p_interest_quote,
318 p_currency_quote,p_spot_date,
319 p_forward_date);
320
321 if (p_base_ccy = 'USD' AND p_contra_ccy <> 'USD') then
322 p_base_spot_bid := 1;
323 p_base_spot_ask := 1;
324 p_contra_spot_bid := p_rates_table(1);
325 p_contra_spot_ask := p_rates_table(2);
326 elsif (p_contra_ccy = 'USD' AND p_base_ccy <> 'USD') then
327 p_base_spot_bid := p_rates_table(1);
328 p_base_spot_ask := p_rates_table(2);
329 p_contra_spot_bid := 1;
330 p_contra_spot_ask := 1;
331 elsif (p_neither_usd) then
332 p_base_spot_bid := p_rates_table(1);
333 p_base_spot_ask := p_rates_table(2);
334 p_contra_spot_bid := p_rates_table(3);
335 p_contra_spot_ask := p_rates_table(4);
336 end if;
337
338 -- now do Interest Rates
339 p_rate_types.delete;
340 p_base_currencies.delete;
341 p_data_sides.delete;
342 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT','DEFAULT',
343 'DEFAULT','DEFAULT');
344 p_quote_bases := null;
345 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD','YIELD','YIELD','YIELD');
346 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy, p_base_ccy,
347 p_contra_ccy, p_contra_ccy);
348 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
349 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_base_day_count, p_base_day_count,
350 p_contra_day_count,
351 p_contra_day_count);
352 if (p_neither_usd) then
353 p_rate_types.extend(2);
354 p_rate_types(5) := 'YIELD';
355 p_rate_types(6) := 'YIELD';
356 p_interp_methods.extend(2);
357 p_interp_methods(5) := 'DEFAULT';
358 p_interp_methods(6) := 'DEFAULT';
359 p_base_currencies.extend(2);
360 p_base_currencies(5) := 'USD';
361 p_base_currencies(6) := 'USD';
362 p_data_sides.extend(2);
363 p_data_sides(5) := 'BID';
364 p_data_sides(6) := 'ASK';
365 p_day_count_bases.extend(2);
366 p_day_count_bases(5) := p_usd_day_count;
367 p_day_count_bases(6) := p_usd_day_count;
368 end if;
369
370
371 p_rates_table := get_rates_from_base(p_rate_types, p_base_currencies,
372 p_contra_currencies, p_quote_bases,
373 p_interp_methods, p_data_sides,
374 p_day_count_bases,p_interest_quote,
375 p_currency_quote,p_spot_date,
376 p_forward_date);
377 p_base_int_rate_bid := p_rates_table(1);
378 p_base_int_rate_ask := p_rates_table(2);
379 p_contra_int_rate_bid := p_rates_table(3);
380 p_contra_int_rate_ask := p_rates_table(4);
381
382 if (p_neither_usd) then
383 p_usd_int_rate_bid := p_rates_table(5);
384 p_usd_int_rate_ask := p_rates_table(6);
385 else
386 p_usd_day_count := null;
387 p_usd_int_rate_bid := null;
388 p_usd_int_rate_ask := null;
389 end if;
390
391 for i IN 1..p_rates_table.count LOOP
392 IF (g_proc_level>=g_debug_level) THEN
393 xtr_risk_debug_pkg.dlog('fx_calculator: ' || p_rate_types(i),p_rates_table(i));
394 END IF;
395 END LOOP;
396 IF (g_proc_level>=g_debug_level) THEN
397 xtr_risk_debug_pkg.dpop('fx_calculator: ' || 'Calculation Based On Defaults');
398 END IF;
399
400 ELSIF (p_indicator = 'C') then
401 IF (g_proc_level>=g_debug_level) THEN
402 xtr_risk_debug_pkg.dpush('fx_calculator: ' || 'Calculation Based On Curves');
403 END IF;
404
405 -- ** Default fields ** --
406 p_base_day_count := 'ACTUAL/ACTUAL';
407 p_contra_day_count := 'ACTUAL/ACTUAL';
408 p_usd_day_count := 'ACTUAL/ACTUAL';
409 -- ****************** --
410
411 -- GET DEFAULT CURVES
412 if (p_base_curve IS null) then
413 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
414 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy);
415 p_curve_codes := get_curves_from_base(p_curve_types,
416 p_base_currencies,
417 p_contra_currencies);
418 p_base_curve := p_curve_codes(1);
419 end if;
420 if (p_contra_curve IS null) then
421 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
422 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_contra_ccy);
423 p_curve_codes := get_curves_from_base(p_curve_types,
424 p_base_currencies,
425 p_contra_currencies);
426 p_contra_curve := p_curve_codes(1);
427 end if;
428
429 -- USD curve is required, but it is null
430 -- get default USD curve
434 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE('USD');
431 if (p_neither_usd) then
432 if (p_usd_curve IS null) then
433 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
435 p_curve_codes := get_curves_from_base(p_curve_types,
436 p_base_currencies,
437 p_contra_currencies);
438 p_usd_curve := p_curve_codes(1);
439 end if;
440 -- if one ccy is USD, set usd row curve/interp to null
441 else
442 p_usd_curve := null;
443 p_usd_interpolation := null;
444 end if;
445
446 -- GET DEFAULT RATES based on CURVES
447 -- first do SPOT RATES
448 p_curve_codes := null;
449 p_base_currencies := null;
450 -- get quotation basis against usd defined in Current System Rates
451 p_spot_quote_bases := get_spot_quotation_basis(p_base_ccy, p_contra_ccy,
452 p_ow_spot_rates);
453 p_base_quote_usd := p_spot_quote_bases(1);
454 p_contra_quote_usd := p_spot_quote_bases(2);
455 if (p_base_ccy = 'USD' AND p_contra_ccy <> 'USD') then
456 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
457 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_contra_ccy, p_contra_ccy);
458 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_contra_quote_usd,
459 p_contra_quote_usd);
460 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
461 elsif (p_base_ccy <> 'USD' AND p_contra_ccy = 'USD') then
462 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
463 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy, p_base_ccy);
464 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_base_quote_usd, p_base_quote_usd);
465 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
466 elsif (p_neither_usd) then
467 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT','SPOT','SPOT');
468 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy,p_base_ccy,
469 p_contra_ccy,p_contra_ccy);
470 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_base_quote_usd, p_base_quote_usd,
471 p_contra_quote_usd,p_contra_quote_usd);
472 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
473 end if;
474
475 p_rates_table := get_rates_from_curves(p_rate_types,p_curve_codes,
476 p_base_currencies,
477 p_contra_currencies,
478 p_quote_bases,
479 p_interp_methods,
480 p_data_sides,
481 p_day_count_bases,
482 p_interest_quote,
483 p_currency_quote,
484 p_spot_date, p_forward_date);
485 if (p_contra_ccy = 'USD') then
486 p_base_spot_bid := p_rates_table(1);
487 p_base_spot_ask := p_rates_table(2);
488 p_contra_spot_bid := 1;
489 p_contra_spot_ask := 1;
490 elsif (p_base_ccy = 'USD') then
491 p_base_spot_bid := 1;
492 p_base_spot_ask := 1;
493 p_contra_spot_bid := p_rates_table(1);
494 p_contra_spot_ask := p_rates_table(2);
495 elsif (p_neither_usd) then
496 p_base_spot_bid := p_rates_table(1);
497 p_base_spot_ask := p_rates_table(2);
498 p_contra_spot_bid := p_rates_table(3);
499 p_contra_spot_ask := p_rates_table(4);
500 end if;
501
502 -- now get INTEREST RATES
503 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD','YIELD','YIELD','YIELD');
504 p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_base_curve,p_base_curve,
505 p_contra_curve,p_contra_curve);
506 p_base_currencies.delete;
507 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy,p_base_ccy,
508 p_contra_ccy,p_contra_ccy);
509 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_base_interpolation,
510 p_base_interpolation, p_contra_interpolation, p_contra_interpolation);
511
512 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
513 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_base_day_count,p_base_day_count,
514 p_contra_day_count,p_contra_day_count);
515 p_quote_bases := null;
516 if (p_neither_usd) then
517 p_rate_types.extend(2);
518 p_rate_types(5) := 'YIELD';
519 p_rate_types(6) := 'YIELD';
520 p_curve_codes.extend(2);
521 p_curve_codes(5) := p_usd_curve;
522 p_curve_codes(6) := p_usd_curve;
523 p_base_currencies.extend(2);
524 p_base_currencies(5) := 'USD';
525 p_base_currencies(6) := 'USD';
526 p_interp_methods.extend(2);
527 p_interp_methods(5) := p_usd_interpolation;
528 p_interp_methods(6) := p_usd_interpolation;
529 p_data_sides.extend(2);
530 p_data_sides(5) := 'BID';
531 p_data_sides(6) := 'ASK';
532 p_day_count_bases.extend(2);
533 p_day_count_bases(5) := p_usd_day_count;
534 p_day_count_bases(6) := p_usd_day_count;
535 end if;
536
537 p_rates_table := get_rates_from_curves(p_rate_types,p_curve_codes,
538 p_base_currencies,
539 p_contra_currencies,
540 p_quote_bases,p_interp_methods,
541 p_data_sides,p_day_count_bases,
542 p_interest_quote,p_currency_quote,
543 p_spot_date,
544 p_forward_date);
545 p_base_int_rate_bid := p_rates_table(1);
546 p_base_int_rate_ask := p_rates_table(2);
547 p_contra_int_rate_bid := p_rates_table(3);
548 p_contra_int_rate_ask := p_rates_table(4);
549 if (p_neither_usd) then
550 p_usd_int_rate_bid := p_rates_table(5);
551 p_usd_int_rate_ask := p_rates_table(6);
552 else
553 p_usd_day_count := null;
554 p_usd_int_rate_bid := null;
555 p_usd_int_rate_ask := null;
556 end if;
557 IF (g_proc_level>=g_debug_level) THEN
558 xtr_risk_debug_pkg.dpop('fx_calculator: ' || 'Calculation Based On Curves');
559 END IF;
560
561 -- 'Calculate Based On Rates' button pressed
565 END IF;
562 ELSIF (p_indicator = 'R') then
563 IF (g_proc_level>=g_debug_level) THEN
564 xtr_risk_debug_pkg.dpush('fx_calculator: ' || 'Calculation Based On Rates');
566 -- if a spot rate is missing, go to base(defaults) section
567 if (p_base_spot_bid IS null) then
568 if (p_base_ccy <> 'USD') then
569 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
570 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy);
571 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_base_quote_usd);
572 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
573 p_rates_table := get_rates_from_curves(p_rate_types,
574 p_curve_codes,
575 p_base_currencies,
576 p_contra_currencies,
577 p_quote_bases,
578 p_interp_methods,
579 p_data_sides,
580 p_day_count_bases,
581 p_interest_quote,
582 p_currency_quote,
583 p_spot_date, p_forward_date);
584 p_base_spot_bid := p_rates_table(1);
585 else
586 p_base_spot_bid := 1;
587 end if;
588 -- get corresponding base ccy curve
589
590 end if;
591 if (p_base_spot_ask IS null) then
592 if (p_base_ccy <> 'USD') then
593 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
594 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy);
595 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_base_quote_usd);
596 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
597 p_rates_table := get_rates_from_curves(p_rate_types,
598 p_curve_codes,
599 p_base_currencies,
600 p_contra_currencies,
601 p_quote_bases,
602 p_interp_methods,
603 p_data_sides,
604 p_day_count_bases,
605 p_interest_quote,
606 p_currency_quote,
607 p_spot_date, p_forward_date);
608 p_base_spot_ask := p_rates_table(1);
609 else
610 p_base_spot_ask := 1;
611 end if;
612 end if;
613 if (p_contra_spot_bid IS null) then
614 if (p_contra_ccy <> 'USD') then
615 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
616 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_contra_ccy);
617 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_contra_quote_usd);
618 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
619 p_rates_table := get_rates_from_curves(p_rate_types,
620 p_curve_codes,
621 p_base_currencies,
622 p_contra_currencies,
623 p_quote_bases,
624 p_interp_methods,
625 p_data_sides,
626 p_day_count_bases,
627 p_interest_quote,
628 p_currency_quote,
629 p_spot_date, p_forward_date);
630 p_contra_spot_bid := p_rates_table(1);
631 else
632 p_contra_spot_bid := 1;
633 end if;
634 end if;
635 if (p_contra_spot_ask IS null) then
636 if (p_contra_ccy <> 'USD') then
637 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
638 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_contra_ccy);
639 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_contra_quote_usd);
640 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
641 p_rates_table := get_rates_from_curves(p_rate_types,
642 p_curve_codes,
643 p_base_currencies,
644 p_contra_currencies,
645 p_quote_bases,
646 p_interp_methods,
647 p_data_sides,
648 p_day_count_bases,
649 p_interest_quote,
650 p_currency_quote,
651 p_spot_date, p_forward_date);
652 p_contra_spot_ask := p_rates_table(1);
653 else
654 p_contra_spot_ask := 1;
655 end if;
656 end if;
657
658 -- if INTEREST RATES are missing, first check if curve section is filled
659 -- if so, use curve;
660 -- else, go to base(defaults) section and default curve in curves section
661 if (p_base_int_rate_bid IS null) then
662 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
663 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy);
664 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
665 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_base_day_count);
666 -- if curve section is null, go to defaults
667 if (p_base_curve IS null) then
668 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
669 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
670 p_curve_codes := get_curves_from_base(p_curve_types,
671 p_base_currencies,
672 p_contra_currencies);
673 -- calculate rate
674 p_rates_table := get_rates_from_curves(p_rate_types,
675 p_curve_codes,p_base_currencies,p_contra_currencies,
676 p_quote_bases,p_interp_methods,p_data_sides,
677 p_day_count_bases,p_interest_quote,p_currency_quote,
678 p_spot_date,p_forward_date);
679 -- default curves section
680 p_base_curve := p_curve_codes(1);
681 IF (g_proc_level>=g_debug_level) THEN
682 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted base curve', p_base_curve);
683 END IF;
684 p_base_interpolation := p_interp_methods(1);
685 else
686 -- curve section not null, use curve
687 p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_base_curve);
688 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_base_interpolation);
689 -- calculate rate
690 p_rates_table := get_rates_from_curves(p_rate_types,
691 p_curve_codes,p_base_currencies,p_contra_currencies,
692 p_quote_bases,p_interp_methods,p_data_sides,
693 p_day_count_bases,p_interest_quote,p_currency_quote,
694 p_spot_date,p_forward_date);
695 end if;
696 p_base_int_rate_bid := p_rates_table(1);
697 IF (g_proc_level>=g_debug_level) THEN
701 if (p_base_int_rate_ask IS null) then
698 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted base bid rate',p_base_int_rate_bid);
699 END IF;
700 end if;
702 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
703 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_base_ccy);
704 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
705 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_base_day_count);
706 -- if curve section is null, go to defaults
707 if (p_base_curve IS null) then
708 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
709 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
710 p_curve_codes := get_curves_from_base(p_curve_types,
711 p_base_currencies,
712 p_contra_currencies);
713 -- calculate rate
714 p_rates_table := get_rates_from_curves(p_rate_types,
715 p_curve_codes,p_base_currencies,p_contra_currencies,
716 p_quote_bases,p_interp_methods,p_data_sides,
717 p_day_count_bases,p_interest_quote,p_currency_quote,
718 p_spot_date,p_forward_date);
719 -- default curves section
720 p_base_curve := p_curve_codes(1);
721 IF (g_proc_level>=g_debug_level) THEN
722 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted base curve', p_base_curve);
723 END IF;
724 p_base_interpolation := p_interp_methods(1);
725 else
726 -- curve section not null, use curve
727 p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_base_curve);
728 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_base_interpolation);
729 p_rates_table := get_rates_from_curves(p_rate_types,
730 p_curve_codes,p_base_currencies,p_contra_currencies,
731 p_quote_bases,p_interp_methods,p_data_sides,
732 p_day_count_bases,p_interest_quote,p_currency_quote,
733 p_spot_date,p_forward_date);
734 end if;
735 p_base_int_rate_ask := p_rates_table(1);
736 IF (g_proc_level>=g_debug_level) THEN
737 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted base ask rate',p_base_int_rate_ask);
738 END IF;
739 end if;
740 if (p_contra_int_rate_bid IS null) then
741 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
742 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_contra_ccy);
743 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
744 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_contra_day_count);
745 -- if curve section is null, go to defaults
746 if (p_contra_curve IS null) then
747 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
748 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
749 p_curve_codes := get_curves_from_base(p_curve_types,
750 p_base_currencies,
751 p_contra_currencies);
752 -- calculate rate
753 p_rates_table := get_rates_from_curves(p_rate_types,
754 p_curve_codes,p_base_currencies,p_contra_currencies,
755 p_quote_bases,p_interp_methods,p_data_sides,
756 p_day_count_bases,p_interest_quote,p_currency_quote,
757 p_spot_date,p_forward_date);
758 -- default curves section
759 p_contra_curve := p_curve_codes(1);
760 IF (g_proc_level>=g_debug_level) THEN
761 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted contra curve', p_contra_curve);
762 END IF;
763 p_contra_interpolation := p_interp_methods(1);
764 else
765 -- curve section not null, use curve
766 p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_contra_curve);
767 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_contra_interpolation);
768 p_rates_table := get_rates_from_curves(p_rate_types,
769 p_curve_codes,p_base_currencies,p_contra_currencies,
770 p_quote_bases,p_interp_methods,p_data_sides,
771 p_day_count_bases,p_interest_quote,p_currency_quote,
772 p_spot_date,p_forward_date);
773 end if;
774 p_contra_int_rate_bid := p_rates_table(1);
775 IF (g_proc_level>=g_debug_level) THEN
776 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted contra bid rate',p_contra_int_rate_bid);
777 END IF;
778 end if;
779 if (p_contra_int_rate_ask IS null) then
780 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
781 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_contra_ccy);
782 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
783 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_contra_day_count);
784 -- if curve section is null, go to defaults
785 if (p_contra_curve IS null) then
786 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
787 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
788 p_curve_codes := get_curves_from_base(p_curve_types,
789 p_base_currencies,
790 p_contra_currencies);
791 -- calculate rate
792 p_rates_table := get_rates_from_curves(p_rate_types,
793 p_curve_codes,p_base_currencies,p_contra_currencies,
794 p_quote_bases,p_interp_methods,p_data_sides,
795 p_day_count_bases,p_interest_quote,p_currency_quote,
796 p_spot_date,p_forward_date);
797 -- default curves section
798 p_contra_curve := p_curve_codes(1);
799 IF (g_proc_level>=g_debug_level) THEN
800 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted contra curve', p_contra_curve);
801 END IF;
802 p_contra_interpolation := p_interp_methods(1);
803 else
804 -- curve section not null, use curve
805 p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_contra_curve);
806 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_contra_interpolation);
807 p_rates_table := get_rates_from_curves(p_rate_types,
808 p_curve_codes,p_base_currencies,p_contra_currencies,
809 p_quote_bases,p_interp_methods,p_data_sides,
810 p_day_count_bases,p_interest_quote,p_currency_quote,
811 p_spot_date,p_forward_date);
812 end if;
813 p_contra_int_rate_ask := p_rates_table(1);
814 IF (g_proc_level>=g_debug_level) THEN
818 if (p_neither_usd) then
815 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted contra ask rate',p_contra_int_rate_ask);
816 END IF;
817 end if;
819 if (p_usd_int_rate_bid IS null) then
820 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
821 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE('USD');
822 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
823 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_usd_day_count);
824 -- if curve section is null, go to defaults
825 if (p_usd_curve IS null) then
826 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
827 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
828 p_curve_codes := get_curves_from_base(p_curve_types,
829 p_base_currencies,
830 p_contra_currencies);
831 -- calculate rate
832 p_rates_table := get_rates_from_curves(p_rate_types,
833 p_curve_codes,p_base_currencies,p_contra_currencies,
834 p_quote_bases,p_interp_methods,p_data_sides,
835 p_day_count_bases,p_interest_quote,p_currency_quote,
836 p_spot_date,p_forward_date);
837 -- default curves section
838 p_usd_curve := p_curve_codes(1);
839 IF (g_proc_level>=g_debug_level) THEN
840 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted usd curve', p_usd_curve);
841 END IF;
842 p_usd_interpolation := p_interp_methods(1);
843 else
844 -- curve section not null, use curve
845 p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_usd_curve);
846 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_usd_interpolation);
847 p_rates_table := get_rates_from_curves(p_rate_types,
848 p_curve_codes,p_base_currencies,p_contra_currencies,
849 p_quote_bases,p_interp_methods,p_data_sides,
850 p_day_count_bases,p_interest_quote,p_currency_quote,
851 p_spot_date,p_forward_date);
852 end if;
853 p_usd_int_rate_bid := p_rates_table(1);
854 IF (g_proc_level>=g_debug_level) THEN
855 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted usd bid rate',p_usd_int_rate_bid);
856 END IF;
857 end if;
858 if (p_usd_int_rate_ask IS null) then
859 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
860 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE('USD');
861 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
862 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_usd_day_count);
863 -- if curve section is null, go to defaults
864 if (p_usd_curve IS null) then
865 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
866 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
867 p_curve_codes := get_curves_from_base(p_curve_types,
868 p_base_currencies,
869 p_contra_currencies);
870 -- calculate rate
871 p_rates_table := get_rates_from_curves(p_rate_types,
872 p_curve_codes,p_base_currencies,p_contra_currencies,
873 p_quote_bases,p_interp_methods,p_data_sides,
874 p_day_count_bases,p_interest_quote,p_currency_quote,
875 p_spot_date,p_forward_date);
876 -- default curves section
877 p_usd_curve := p_curve_codes(1);
878 IF (g_proc_level>=g_debug_level) THEN
879 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted usd curve',p_usd_curve);
880 END IF;
881 p_usd_interpolation := p_interp_methods(1);
882 else
883 -- curve section not null, use curve
884 p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_usd_curve);
885 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_usd_interpolation);
886 p_rates_table := get_rates_from_curves(p_rate_types,
887 p_curve_codes,p_base_currencies,p_contra_currencies,
888 p_quote_bases,p_interp_methods,p_data_sides,
889 p_day_count_bases,p_interest_quote,p_currency_quote,
890 p_spot_date,p_forward_date);
891 end if;
892 p_usd_int_rate_ask := p_rates_table(1);
893 IF (g_proc_level>=g_debug_level) THEN
894 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'defaulted USD ask rate',p_usd_int_rate_ask);
895 END IF;
896 end if;
897 else
898 p_usd_int_rate_bid := null;
899 p_usd_int_rate_ask := null;
900 p_usd_day_count := null;
901 end if;
902 IF (g_proc_level>=g_debug_level) THEN
903 xtr_risk_debug_pkg.dpop('fx_calculator: ' || 'Calculation Based On Rates');
904 END IF;
905 END IF;
906
907 -- ***END OF DEFAULTING SECTION ***--
908 -- ***RESULTS ***--
909 -- now on to calculating results
910 XTR_CALC_P.calc_days_run_c(p_spot_date, p_forward_date,
911 p_usd_day_count, null, p_day_count_usd, p_year_basis_usd);
912 XTR_CALC_P.calc_days_run_c(p_spot_date, p_forward_date,
913 p_base_day_count, null, p_day_count_base, p_year_basis_base);
914 XTR_CALC_P.calc_days_run_c(p_spot_date, p_forward_date,
915 p_contra_day_count, null, p_day_count_contra,
916 p_year_basis_contra);
917
918 if (NOT p_neither_usd) then
919 if (p_base_ccy = 'USD') then
920 p_base_spot_bid := 1;
921 p_base_spot_ask := 1;
922 p_usd_int_rate_bid := p_base_int_rate_bid;
923 p_usd_int_rate_ask := p_base_int_rate_ask;
924 p_day_count_usd := p_day_count_base;
925 p_year_basis_usd := p_year_basis_base;
926 elsif (p_contra_ccy = 'USD') then
927 p_contra_spot_bid := 1;
928 p_contra_spot_ask := 1;
929 p_usd_int_rate_bid := p_contra_int_rate_bid;
930 p_usd_int_rate_ask := p_contra_int_rate_ask;
931 p_day_count_usd := p_day_count_contra;
932 p_year_basis_usd := p_year_basis_contra;
933 end if;
934 end if;
935
936 --cross spot rate
937 p_spot_rates.extend;
938 p_spot_rates.extend;
939 p_spot_rates := xtr_fx_formulas.fx_spot_rate_cv(
940 p_CURRENCY_CONTRA => p_contra_ccy,
944 p_RATE_BASE_BID => p_base_spot_bid,
941 p_CURRENCY_BASE => p_base_ccy,
942 p_RATE_CONTRA_BID => p_contra_spot_bid,
943 p_RATE_CONTRA_ASK => p_contra_spot_ask,
945 p_RATE_BASE_ASK => p_base_spot_ask,
946 p_QUOTATION_BASIS_CONTRA => p_contra_quote_usd,
947 p_QUOTATION_BASIS_BASE => p_base_quote_usd);
948 p_res_spot_bid := p_spot_rates(1);
949 p_res_spot_ask := p_spot_rates(2);
950
951
952 if (p_neither_usd) then
953 -- forward rates
954 p_forward_rates.extend;
955 p_forward_rates.extend;
956 -- USD/Base Ccy or Base Ccy/USD
957 if (p_base_quote_usd = 'C') then
958 -- USD/Base Ccy
959 p_forward_rates := xtr_fx_formulas.fx_forward_rate_cv(
960 p_SPOT_RATE_BASE_BID => null,
961 p_SPOT_RATE_BASE_ASK => null,
962 p_SPOT_RATE_CONTRA_BID => p_base_spot_bid,
963 p_SPOT_RATE_CONTRA_ASK => p_base_spot_ask,
964 p_BASE_CURR_INT_RATE_BID => null,
965 p_BASE_CURR_INT_RATE_ASK => null,
966 p_CONTRA_CURR_INT_RATE_BID => p_base_int_rate_bid,
967 p_CONTRA_CURR_INT_RATE_ASK => p_base_int_rate_ask,
968 p_USD_CURR_INT_RATE_BID => p_usd_int_rate_bid,
969 p_USD_CURR_INT_RATE_ASK => p_usd_int_rate_ask,
970 p_DAY_COUNT_BASE => null,
971 p_DAY_COUNT_CONTRA => p_day_count_base,
972 p_DAY_COUNT_USD => p_day_count_usd,
973 p_ANNUAL_BASIS_BASE => null,
974 p_ANNUAL_BASIS_CONTRA => p_year_basis_base,
975 p_ANNUAL_BASIS_USD => p_year_basis_usd,
976 p_CURRENCY_BASE => 'USD',
977 p_CURRENCY_CONTRA => p_base_ccy,
978 p_QUOTATION_BASIS_BASE => null,
979 p_QUOTATION_BASIS_CONTRA => p_base_quote_usd);
980 p_res_first_base_ccy := 'USD';
981 p_res_first_contra_ccy := p_base_ccy;
982 else
983 -- Base Ccy/USD
984 p_forward_rates := xtr_fx_formulas.fx_forward_rate_cv(
985 p_SPOT_RATE_BASE_BID => p_base_spot_bid,
986 p_SPOT_RATE_BASE_ASK => p_base_spot_ask,
987 p_SPOT_RATE_CONTRA_BID => null,
988 p_SPOT_RATE_CONTRA_ASK => null,
989 p_BASE_CURR_INT_RATE_BID => p_base_int_rate_bid,
990 p_BASE_CURR_INT_RATE_ASK => p_base_int_rate_ask,
991 p_CONTRA_CURR_INT_RATE_BID => null,
992 p_CONTRA_CURR_INT_RATE_ASK => null,
993 p_USD_CURR_INT_RATE_BID => p_usd_int_rate_bid,
994 p_USD_CURR_INT_RATE_ASK => p_usd_int_rate_ask,
995 p_DAY_COUNT_BASE => p_day_count_base,
996 p_DAY_COUNT_CONTRA => null,
997 p_DAY_COUNT_USD => p_day_count_usd,
998 p_ANNUAL_BASIS_BASE => p_year_basis_base,
999 p_ANNUAL_BASIS_CONTRA => null,
1000 p_ANNUAL_BASIS_USD => p_year_basis_usd,
1001 p_CURRENCY_BASE => p_base_ccy,
1002 p_CURRENCY_CONTRA => 'USD',
1003 p_QUOTATION_BASIS_BASE => p_base_quote_usd,
1004 p_QUOTATION_BASIS_CONTRA => null);
1005 p_res_first_base_ccy := p_base_ccy;
1006 p_res_first_contra_ccy := 'USD';
1007 end if;
1008 p_res_first_rate_bid := p_forward_rates(1);
1009 p_res_first_rate_ask := p_forward_rates(2);
1010 p_res_first_points_bid := p_res_first_rate_bid - p_base_spot_bid;
1011 p_res_first_points_ask := p_res_first_rate_ask - p_base_spot_ask;
1012
1013 -- Contra Ccy/USD or USD/Contra Ccy
1014
1015 if (p_contra_quote_usd = 'B') then
1016 -- Contra Ccy/USD
1017 p_forward_rates := xtr_fx_formulas.fx_forward_rate_cv(
1018 p_SPOT_RATE_BASE_BID => p_contra_spot_bid,
1019 p_SPOT_RATE_BASE_ASK => p_contra_spot_ask,
1020 p_SPOT_RATE_CONTRA_BID => null,
1021 p_SPOT_RATE_CONTRA_ASK => null,
1022 p_BASE_CURR_INT_RATE_BID => p_contra_int_rate_bid,
1023 p_BASE_CURR_INT_RATE_ASK => p_contra_int_rate_ask,
1024 p_CONTRA_CURR_INT_RATE_BID => null,
1025 p_CONTRA_CURR_INT_RATE_ASK => null,
1026 p_USD_CURR_INT_RATE_BID => p_usd_int_rate_bid,
1027 p_USD_CURR_INT_RATE_ASK => p_usd_int_rate_ask,
1028 p_DAY_COUNT_BASE => p_day_count_contra,
1029 p_DAY_COUNT_CONTRA => null,
1030 p_DAY_COUNT_USD => p_day_count_usd,
1031 p_ANNUAL_BASIS_BASE => p_year_basis_contra,
1032 p_ANNUAL_BASIS_CONTRA => null,
1033 p_ANNUAL_BASIS_USD => p_year_basis_usd,
1034 p_CURRENCY_BASE => p_contra_ccy,
1035 p_CURRENCY_CONTRA => 'USD',
1036 p_QUOTATION_BASIS_BASE => p_contra_quote_usd,
1037 p_QUOTATION_BASIS_CONTRA => null);
1038 p_res_sec_base_ccy := p_contra_ccy;
1039 p_res_sec_contra_ccy := 'USD';
1040 else
1041 -- USD/Contra Ccy
1042 p_forward_rates := xtr_fx_formulas.fx_forward_rate_cv(
1043 p_SPOT_RATE_BASE_BID => null,
1044 p_SPOT_RATE_BASE_ASK => null,
1045 p_SPOT_RATE_CONTRA_BID => p_contra_spot_bid,
1046 p_SPOT_RATE_CONTRA_ASK => p_contra_spot_ask,
1047 p_BASE_CURR_INT_RATE_BID => null,
1048 p_BASE_CURR_INT_RATE_ASK => null,
1049 p_CONTRA_CURR_INT_RATE_BID => p_contra_int_rate_bid,
1050 p_CONTRA_CURR_INT_RATE_ASK => p_contra_int_rate_ask,
1051 p_USD_CURR_INT_RATE_BID => p_usd_int_rate_bid,
1052 p_USD_CURR_INT_RATE_ASK => p_usd_int_rate_ask,
1053 p_DAY_COUNT_BASE => null,
1054 p_DAY_COUNT_CONTRA => p_day_count_contra,
1055 p_DAY_COUNT_USD => p_day_count_usd,
1056 p_ANNUAL_BASIS_BASE => null,
1057 p_ANNUAL_BASIS_CONTRA => p_year_basis_contra,
1058 p_ANNUAL_BASIS_USD => p_year_basis_usd,
1059 p_CURRENCY_BASE => 'USD',
1060 p_CURRENCY_CONTRA => p_contra_ccy,
1061 p_QUOTATION_BASIS_BASE => null,
1062 p_QUOTATION_BASIS_CONTRA => p_contra_quote_usd);
1063 p_res_sec_base_ccy := 'USD';
1064 p_res_sec_contra_ccy := p_contra_ccy;
1065 end if;
1069 p_res_sec_points_ask := p_res_sec_rate_ask - p_contra_spot_ask;
1066 p_res_sec_rate_bid := p_forward_rates(1);
1067 p_res_sec_rate_ask := p_forward_rates(2);
1068 p_res_sec_points_bid := p_res_sec_rate_bid - p_contra_spot_bid;
1070
1071 -- Base Ccy/Contra Ccy forward rate
1072 p_forward_rates := xtr_fx_formulas.fx_spot_rate_cv(
1073 p_CURRENCY_CONTRA => p_contra_ccy,
1074 p_CURRENCY_BASE => p_base_ccy,
1075 p_RATE_CONTRA_BID => p_res_sec_rate_bid,
1076 p_RATE_CONTRA_ASK => p_res_sec_rate_ask,
1077 p_RATE_BASE_BID => p_res_first_rate_bid,
1078 p_RATE_BASE_ASK => p_res_first_rate_ask,
1079 p_QUOTATION_BASIS_CONTRA => p_contra_quote_usd,
1080 p_QUOTATION_BASIS_BASE => p_base_quote_usd);
1081 p_res_fwd_rate_bid := p_forward_rates(1);
1082 p_res_fwd_rate_ask := p_forward_rates(2);
1083 p_res_fwd_points_bid := p_res_fwd_rate_bid - p_res_spot_bid;
1084 p_res_fwd_points_ask := p_res_fwd_rate_ask - p_res_spot_ask;
1085 else
1086 -- one currency is USD
1087 p_forward_rates.extend;
1088 p_forward_rates.extend;
1089
1090 p_forward_rates := xtr_fx_formulas.fx_forward_rate_cv(
1091 p_SPOT_RATE_BASE_BID => p_base_spot_bid,
1092 p_SPOT_RATE_BASE_ASK => p_base_spot_ask,
1093 p_SPOT_RATE_CONTRA_BID => p_contra_spot_bid,
1094 p_SPOT_RATE_CONTRA_ASK => p_contra_spot_ask,
1095 p_BASE_CURR_INT_RATE_BID => p_base_int_rate_bid,
1096 p_BASE_CURR_INT_RATE_ASK => p_base_int_rate_ask,
1097 p_CONTRA_CURR_INT_RATE_BID => p_contra_int_rate_bid,
1098 p_CONTRA_CURR_INT_RATE_ASK => p_contra_int_rate_ask,
1099 p_USD_CURR_INT_RATE_BID => p_usd_int_rate_bid,
1100 p_USD_CURR_INT_RATE_ASK => p_usd_int_rate_ask,
1101 p_DAY_COUNT_BASE => p_day_count_base,
1102 p_DAY_COUNT_CONTRA => p_day_count_contra,
1103 p_DAY_COUNT_USD => p_day_count_usd,
1104 p_ANNUAL_BASIS_BASE => p_year_basis_base,
1105 p_ANNUAL_BASIS_CONTRA => p_year_basis_contra,
1106 p_ANNUAL_BASIS_USD => p_year_basis_usd,
1107 p_CURRENCY_BASE => p_base_ccy,
1108 p_CURRENCY_CONTRA => p_contra_ccy,
1109 p_QUOTATION_BASIS_BASE => p_base_quote_usd,
1110 p_QUOTATION_BASIS_CONTRA => p_contra_quote_usd);
1111 p_res_fwd_rate_bid := p_forward_rates(1);
1112 p_res_fwd_rate_ask := p_forward_rates(2);
1113 p_res_fwd_points_bid := p_res_fwd_rate_bid - p_res_spot_bid;
1114 p_res_fwd_points_ask := p_res_fwd_rate_ask - p_res_spot_ask;
1115 end if;
1116
1117
1118 --- Sensitivities
1119 -- delta spot
1120 p_int_rates := xtr_md_num_table(p_contra_int_rate_bid,p_contra_int_rate_ask,
1121 p_base_int_rate_bid, p_base_int_rate_ask,
1122 p_usd_int_rate_bid, p_usd_int_rate_ask);
1123 p_day_counts := SYSTEM.QRM_VARCHAR_TABLE(p_contra_day_count, p_contra_day_count,
1124 p_base_day_count, p_base_day_count,
1125 p_usd_day_count, p_usd_day_count);
1126 IF (g_proc_level>=g_debug_level) THEN
1127 xtr_risk_debug_pkg.dpush('fx_calculator: ' || 'Calculating Delta Spot');
1128 END IF;
1129 for i IN 1..p_int_rates.count LOOP
1130 df_in_rec.p_indicator := 'T';
1131 df_in_rec.p_rate := p_int_rates(i);
1132 df_in_rec.p_spot_date := p_spot_date;
1133 df_in_rec.p_future_date := p_forward_date;
1134 df_in_rec.p_day_count_basis := p_day_counts(i);
1135 xtr_rate_conversion.discount_factor_conv(df_in_rec, df_out_rec);
1136 p_dis_factors.extend;
1137 p_dis_factors(i) := df_out_rec.p_result;
1138 IF (g_proc_level>=g_debug_level) THEN
1139 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'int rate', p_int_rates(i));
1140 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'day count', p_day_counts(i));
1141 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'disc factor', p_dis_factors(i));
1142 END IF;
1143 end LOOP;
1144 IF (g_proc_level>=g_debug_level) THEN
1145 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'contra curr', p_contra_ccy);
1146 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'base curr', p_base_ccy);
1147 END IF;
1148 p_delta := qrm_fx_formulas.fx_forward_delta_spot(p_contra_ccy, p_base_ccy,
1149 p_dis_factors(1), p_dis_factors(2),
1150 p_dis_factors(3), p_dis_factors(4),
1151 p_dis_factors(5), p_dis_factors(6));
1152 p_delta_spot_bid := p_delta(1);
1153 p_delta_spot_ask := p_delta(2);
1154 IF (g_proc_level>=g_debug_level) THEN
1155 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'delta spot bid', p_delta_spot_bid);
1156 xtr_risk_debug_pkg.dlog('fx_calculator: ' || 'delta spot ask', p_delta_spot_ask);
1157 xtr_risk_debug_pkg.dpop('fx_calculator: ' || 'Calculating Delta Spot');
1158 END IF;
1159
1160 -- fx forward rho
1161 IF (g_proc_level>=g_debug_level) THEN
1162 xtr_risk_debug_pkg.dpush('fx_calculator: ' || 'Calculating FX Rho');
1163 END IF;
1164 p_rho := qrm_fx_formulas.fx_forward_rho(p_OUT => 'D',
1165 p_SPOT_RATE_BASE_BID => p_base_spot_bid,
1166 p_SPOT_RATE_BASE_ASK => p_base_spot_ask,
1167 p_SPOT_RATE_CONTRA_BID => p_contra_spot_bid,
1168 p_SPOT_RATE_CONTRA_ASK => p_contra_spot_ask,
1169 p_BASE_CURR_INT_RATE_BID => p_base_int_rate_bid,
1170 p_BASE_CURR_INT_RATE_ASK => p_base_int_rate_ask,
1171 p_CONTRA_CURR_INT_RATE_BID => p_contra_int_rate_bid,
1172 p_CONTRA_CURR_INT_RATE_ASK => p_contra_int_rate_ask,
1173 p_USD_CURR_INT_RATE_BID => p_usd_int_rate_bid,
1174 p_USD_CURR_INT_RATE_ASK => p_usd_int_rate_ask,
1175 p_DAY_COUNT_BASE => p_day_count_base,
1176 p_DAY_COUNT_CONTRA => p_day_count_contra,
1177 p_DAY_COUNT_USD => p_day_count_usd,
1178 p_ANNUAL_BASIS_BASE => p_year_basis_base,
1179 p_ANNUAL_BASIS_CONTRA => p_year_basis_contra,
1180 p_ANNUAL_BASIS_USD => p_year_basis_usd,
1181 p_CURRENCY_BASE => p_base_ccy,
1182 p_CURRENCY_CONTRA => p_contra_ccy,
1183 p_QUOTATION_BASIS_BASE => p_base_quote_usd,
1184 p_QUOTATION_BASIS_CONTRA => p_contra_quote_usd);
1188 p_rho_contra_ask := p_rho(4);
1185 p_rho_base_bid := p_rho(1);
1186 p_rho_base_ask := p_rho(2);
1187 p_rho_contra_bid := p_rho(3);
1189 IF (g_proc_level>=g_debug_level) THEN
1190 xtr_risk_debug_pkg.dpop('fx_calculator: ' || 'Calculating FX Rho');
1191 END IF;
1192
1193
1194 p_varchar_args(1) := p_indicator;
1195 p_varchar_args(2) := p_base_ccy;
1196 p_varchar_args(3) := p_contra_ccy;
1197 p_varchar_args(4) := p_currency_quote;
1198 p_varchar_args(5) := p_interest_quote;
1199 p_varchar_args(6) := p_base_curve;
1200 p_varchar_args(7) := p_contra_curve;
1201 p_varchar_args(8) := p_usd_curve;
1202 p_varchar_args(9) := p_base_interpolation;
1203 p_varchar_args(10) := p_contra_interpolation;
1204 p_varchar_args(11) := p_usd_interpolation;
1205 p_varchar_args(12) := p_base_quote_usd;
1206 p_varchar_args(13) := p_contra_quote_usd;
1207 p_varchar_args(14) := p_base_day_count;
1208 p_varchar_args(15) := p_contra_day_count;
1209 p_varchar_args(16) := p_usd_day_count;
1210 p_varchar_args(17) := p_res_first_base_ccy;
1211 p_varchar_args(18) := p_res_first_contra_ccy;
1212 p_varchar_args(19) := p_res_sec_base_ccy;
1213 p_varchar_args(20) := p_res_sec_contra_ccy;
1214
1215 p_num_args(1) := p_base_ccy_amt;
1216 p_num_args(2) := p_base_spot_bid;
1217 p_num_args(3) := p_base_spot_ask;
1218 p_num_args(4) := p_contra_spot_bid;
1219 p_num_args(5) := p_contra_spot_ask;
1220 p_num_args(6) := p_base_int_rate_bid;
1221 p_num_args(7) := p_base_int_rate_ask;
1222 p_num_args(8) := p_contra_int_rate_bid;
1223 p_num_args(9) := p_contra_int_rate_ask;
1224 p_num_args(10) := p_usd_int_rate_bid;
1225 p_num_args(11) := p_usd_int_rate_ask;
1226 p_num_args(12) := p_res_spot_bid;
1227 p_num_args(13) := p_res_spot_ask;
1228 p_num_args(14) := p_res_first_rate_bid;
1229 p_num_args(15) := p_res_first_rate_ask;
1230 p_num_args(16) := p_res_first_points_bid;
1231 p_num_args(17) := p_res_first_points_ask;
1232 p_num_args(18) := p_res_sec_rate_bid;
1233 p_num_args(19) := p_res_sec_rate_ask;
1234 p_num_args(20) := p_res_sec_points_bid;
1235 p_num_args(21) := p_res_sec_points_ask;
1236 p_num_args(22) := p_res_fwd_rate_bid;
1237 p_num_args(23) := p_res_fwd_rate_ask;
1238 p_num_args(24) := p_res_fwd_points_bid;
1239 p_num_args(25) := p_res_fwd_points_ask;
1240 p_num_args(26) := p_delta_spot_bid;
1241 p_num_args(27) := p_delta_spot_ask;
1242 p_num_args(28) := p_rho_base_bid;
1243 p_num_args(29) := p_rho_base_ask;
1244 p_num_args(30) := p_rho_contra_bid;
1245 p_num_args(31) := p_rho_contra_ask;
1246
1247
1248 IF (g_proc_level>=g_debug_level) THEN--bug3236479
1249 xtr_risk_debug_pkg.dpop(null,'QRM_CALCULATORS_P.fx_calculator');
1250 END IF;
1251 EXCEPTION
1252 WHEN e_no_int_rates THEN
1253 fnd_msg_pub.add;
1254 IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
1255 xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_INT_RATES',
1256 'QRM_CALCULATORS_P.FX_CALCULATOR',G_ERROR_LEVEL);
1257 END IF;
1258 WHEN e_no_rate_curve THEN
1259 fnd_msg_pub.add;
1260 IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
1261 xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_RATE_CURVE',
1262 'QRM_CALCULATORS_P.FX_CALCULATOR',G_ERROR_LEVEL);
1263 END IF;
1264 WHEN e_no_spot_rates THEN
1265 fnd_msg_pub.add;
1266 IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
1267 xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_SPOT_RATES',
1268 'QRM_CALCULATORS_P.FX_CALCULATOR',G_ERROR_LEVEL);
1269 END IF;
1270
1271 END fx_calculator;
1272
1273
1274
1275 FUNCTION get_curves_from_base (p_curve_types SYSTEM.QRM_VARCHAR_TABLE,
1276 p_base_currencies SYSTEM.QRM_VARCHAR_TABLE,
1277 p_contra_currencies SYSTEM.QRM_VARCHAR_TABLE)
1278 RETURN SYSTEM.QRM_VARCHAR_TABLE IS
1279
1280
1281 -- ** main cursors for defaulting ** --
1282
1283 -- for YIELD and IRVOL curves
1284 CURSOR get_default_curve(p_type VARCHAR2,p_base_ccy VARCHAR2) IS
1285 SELECT curve_code
1286 FROM xtr_rm_md_curves
1287 WHERE type=p_type and authorized_yn='Y' and ccy=p_base_ccy
1288 ORDER BY creation_date;
1289
1290 -- for FXVOL curves
1291 CURSOR get_default_curve_fx(p_type VARCHAR2,p_base_ccy VARCHAR2,
1292 p_contra_ccy VARCHAR2) IS
1293 SELECT curve_code
1294 FROM xtr_rm_md_curves
1295 WHERE type=p_type and authorized_yn='Y' and
1296 (ccy=p_base_ccy and contra_ccy=p_contra_ccy) or
1297 (ccy=p_contra_ccy and contra_ccy=p_base_ccy)
1298 ORDER BY creation_date;
1299
1300 v_curve_code varchar2(20);
1301 v_curve_codes_table SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
1302
1303
1304 BEGIN
1305 IF (g_proc_level>=g_debug_level) THEN
1306 xtr_risk_debug_pkg.dpush(null,'QRM_CALCULATORS_P.get_curves_from_base');
1307 END IF;
1308 if ((p_curve_types.count <> p_base_currencies.count) OR
1309 ((p_contra_currencies IS NOT null) AND
1310 ((p_base_currencies.count <> p_contra_currencies.count) OR
1311 (p_curve_types.count <> p_contra_currencies.count)))) then
1312 RAISE_APPLICATION_ERROR
1313 (-20001,'input tables must be the same size.');
1314 else
1315 v_curve_codes_table.extend(p_curve_types.count);
1316 FOR i IN 1..p_curve_types.count LOOP
1317 IF (g_proc_level>=g_debug_level) THEN
1318 xtr_risk_debug_pkg.dlog('get_curves_from_base: ' || 'currency is', p_base_currencies(i));
1319 END IF;
1320 if (p_curve_types(i) = 'FXVOL') then
1321 OPEN get_default_curve_fx(p_curve_types(i),
1322 p_base_currencies(i),
1326 FND_MESSAGE.SET_NAME('QRM','QRM_CALC_NO_DEFAULT_CURVE_ERR');
1323 p_contra_currencies(i));
1324 FETCH get_default_curve_fx INTO v_curve_code;
1325 if (get_default_curve_fx%notfound) then
1327 FND_MESSAGE.SET_TOKEN('CCY',p_base_currencies(i)||'/'||
1328 p_contra_currencies(i));
1329 raise e_no_rate_curve;
1330 else
1331 v_curve_codes_table(i) := v_curve_code;
1332 end if;
1333 IF (g_proc_level>=g_debug_level) THEN
1334 xtr_risk_debug_pkg.dlog('get_curves_from_base: ' || 'found fxvol curve', v_curve_code);
1335 END IF;
1336 CLOSE get_default_curve_fx;
1337 elsif ((p_curve_types(i) = 'YIELD') OR
1338 (p_curve_types(i) = 'IRVOL')) then
1339 OPEN get_default_curve(p_curve_types(i),p_base_currencies(i));
1340 FETCH get_default_curve INTO v_curve_code;
1341 if (get_default_curve%notfound) then
1342 FND_MESSAGE.SET_NAME('QRM','QRM_CALC_NO_DEFAULT_CURVE_ERR');
1343 FND_MESSAGE.SET_TOKEN('CCY',p_base_currencies(i));
1344 raise e_no_rate_curve;
1345 else
1346 v_curve_codes_table(i) := v_curve_code;
1347 end if;
1348 IF (g_proc_level>=g_debug_level) THEN
1349 xtr_risk_debug_pkg.dlog('get_curves_from_base: ' || 'found yield/irvol curve', v_curve_code);
1350 END IF;
1351 CLOSE get_default_curve;
1352 end if;
1353 END LOOP;
1354 IF (g_proc_level>=g_debug_level) THEN
1355 xtr_risk_debug_pkg.dpop(null,'QRM_CALCULATORS_P.get_curves_from_base');
1356 END IF;
1357 return v_curve_codes_table;
1358 end if;
1359 END get_curves_from_base;
1360
1361
1362
1363 -- also extracts spot rates
1364 FUNCTION get_rates_from_curves (p_rate_types SYSTEM.QRM_VARCHAR_TABLE,
1365 p_curve_codes SYSTEM.QRM_VARCHAR_TABLE,
1366 p_base_currencies SYSTEM.QRM_VARCHAR_TABLE,
1367 p_contra_currencies SYSTEM.QRM_VARCHAR_TABLE,
1368 p_quote_bases SYSTEM.QRM_VARCHAR_TABLE,
1369 p_interp_methods SYSTEM.QRM_VARCHAR_TABLE,
1370 p_data_sides SYSTEM.QRM_VARCHAR_TABLE,
1371 p_day_count_bases SYSTEM.QRM_VARCHAR_TABLE,
1372 p_interest_quote_basis VARCHAR2,
1373 p_currency_quote_basis VARCHAR2,
1374 p_spot_date DATE,
1375 p_future_date DATE)
1376 RETURN xtr_md_num_table IS
1377
1378 v_rounding_factor number := 6;
1379 v_table_size number := p_rate_types.count;
1380 v_rate_type varchar2(1);
1381
1382 v_rates_table xtr_md_num_table := xtr_md_num_table();
1383 v_sides_table SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
1384
1385 v_in_rec_type XTR_MARKET_DATA_P.md_from_curve_in_rec_type;
1386 v_out_rec_type XTR_MARKET_DATA_P.md_from_curve_out_rec_type;
1387
1388 v_bid_rate_comm number;
1389 v_ask_rate_comm number;
1390 v_bid_rate_base number;
1391 v_ask_rate_base number;
1392 v_ccy varchar2(15);
1393 v_curve varchar2(20);
1394
1395 -- Cursor for obtaining spot rates in base/commodity unit quotes
1396 -- for non-USD currencies against USD
1397 CURSOR get_fx_spot_rates(p_base_ccy VARCHAR2) IS
1398 SELECT usd_base_curr_bid_rate bid_rate_comm,
1399 usd_base_curr_offer_rate ask_rate_comm,
1400 1/usd_base_curr_offer_rate bid_rate_base,
1401 1/usd_base_curr_bid_rate ask_rate_base,
1402 currency
1403 FROM xtr_spot_rates
1404 WHERE (rate_date, currency) IN
1405 (SELECT MAX(rate_date), currency
1406 FROM xtr_spot_rates
1407 WHERE currency IN (p_base_ccy)
1408 AND currency <> 'USD'
1409 AND trunc(rate_date) <= trunc(p_spot_date)
1410 GROUP BY currency);
1411
1412 BEGIN
1413 IF (g_proc_level>=g_debug_level) THEN
1414 xtr_risk_debug_pkg.dpush(null,'QRM_CALCULATORS_P.get_rates_from_curves');
1415 END IF;
1416 IF (((p_curve_codes IS NOT null) AND
1417 (p_curve_codes.count <> v_table_size)) OR
1418 (p_rate_types.count <> v_table_size) OR
1419 ((p_base_currencies IS NOT null) AND
1420 (p_base_currencies.count <> v_table_size)) OR
1421 ((p_contra_currencies IS NOT null) AND
1422 (p_contra_currencies.count <> v_table_size)) OR
1423 ((p_quote_bases IS NOT null) AND
1424 (p_quote_bases.count <> v_table_size)) OR
1425 ((p_day_count_bases IS NOT null) AND
1426 (p_day_count_bases.count <> v_table_size)) OR
1427 ((p_interp_methods IS NOT null) AND
1428 (p_interp_methods.count <> v_table_size)) OR
1429 ((p_data_sides IS NOT null) AND
1430 (p_data_sides.count <> v_table_size))) THEN
1431 RAISE_APPLICATION_ERROR
1432 (-20001,'input tables must be the same size.');
1433 ELSE
1434 -- now fill up interest rates/volatilities according to curves
1435 -- and spot rates from database
1436 v_rates_table.extend(p_rate_types.count);
1437 v_sides_table.extend(p_rate_types.count);
1438 FOR i IN 1..p_rate_types.count LOOP
1439 if (p_rate_types(i)='SPOT') then
1440 IF (g_proc_level>=g_debug_level) THEN
1441 xtr_risk_debug_pkg.dpush('get_rates_from_curves: ' || 'calculating spot rate');
1442 END IF;
1443 -- it is spot taken by spot rate
1444 -- then do spot rate extraction
1445 IF (g_proc_level>=g_debug_level) THEN
1446 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'base currency',p_base_currencies(i));
1447 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'currency quote basis', p_currency_quote_basis);
1448 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'quote basis against usd',p_quote_bases(i));
1449 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'data side', p_data_sides(i));
1450 END IF;
1451 OPEN get_fx_spot_rates(p_base_currencies(i));
1452 FETCH get_fx_spot_rates INTO v_bid_rate_comm, v_ask_rate_comm,
1453 v_bid_rate_base, v_ask_rate_base,
1454 v_ccy;
1458 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'spot rates found',' ');
1455 if (get_fx_spot_rates%found) then
1456 ---logic for interpreting market data side of Spot Rates---
1457 IF (g_proc_level>=g_debug_level) THEN
1459 END IF;
1460 if (p_currency_quote_basis = 'BID') then
1461 if (p_quote_bases(i) = 'C') then
1462 v_rates_table(i) := round(v_bid_rate_comm,v_rounding_factor);
1463 IF (g_proc_level>=g_debug_level) THEN
1464 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'commodity unit quote bid',v_bid_rate_comm);
1465 END IF;
1466 elsif (p_quote_bases(i) = 'B') then
1467 v_rates_table(i) := round(v_bid_rate_base, v_rounding_factor);
1468 IF (g_proc_level>=g_debug_level) THEN
1469 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'base unit quote bid',v_bid_rate_base);
1470 END IF;
1471 end if;
1472 elsif (p_currency_quote_basis = 'ASK') then
1473 if (p_quote_bases(i) = 'C') then
1474 v_rates_table(i) := round(v_ask_rate_comm, v_rounding_factor);
1475 IF (g_proc_level>=g_debug_level) THEN
1476 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'commodity unit quote ask',v_ask_rate_comm);
1477 END IF;
1478 elsif (p_quote_bases(i) = 'B') then
1479 v_rates_table(i) := round(v_ask_rate_base, v_rounding_factor);
1480 IF (g_proc_level>=g_debug_level) THEN
1481 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'base unit quote ask',v_ask_rate_base);
1482 END IF;
1483 end if;
1484 elsif (p_currency_quote_basis = 'MID') then
1485 if (p_quote_bases(i) = 'C') then
1486 v_rates_table(i) := round((v_bid_rate_comm+v_ask_rate_comm)/2, v_rounding_factor);
1487 elsif (p_quote_bases(i) = 'B') then
1488 v_rates_table(i) := round((v_bid_rate_base+v_ask_rate_base)/2, v_rounding_factor);
1489 end if;
1490 elsif (p_currency_quote_basis = 'BID/ASK') then
1491 IF (g_proc_level>=g_debug_level) THEN
1492 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'currency quote is bid/ask');
1493 END IF;
1494 if (p_quote_bases(i) = 'C') then
1495 IF (g_proc_level>=g_debug_level) THEN
1496 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'quote against usd is C');
1497 END IF;
1498 if (p_data_sides(i) = 'BID') then
1499 v_rates_table(i) := round(v_bid_rate_comm, v_rounding_factor);
1500 IF (g_proc_level>=g_debug_level) THEN
1501 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'BID/ASK: commodity unit quote bid', v_bid_rate_comm);
1502 END IF;
1503 elsif (p_data_sides(i) = 'ASK') then
1504 v_rates_table(i) := round(v_ask_rate_comm, v_rounding_factor);
1505 IF (g_proc_level>=g_debug_level) THEN
1506 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'BID/ASK: commodity unit quote ask', v_ask_rate_comm);
1507 END IF;
1508 end if;
1509 elsif (p_quote_bases(i) = 'B') then
1510 IF (g_proc_level>=g_debug_level) THEN
1511 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'quote against usd is B');
1512 END IF;
1513 if (p_data_sides(i) = 'BID') then
1514 v_rates_table(i) := round(v_bid_rate_base, v_rounding_factor);
1515 IF (g_proc_level>=g_debug_level) THEN
1516 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'BID/ASK: base unit quote bid', v_bid_rate_base);
1517 END IF;
1518 elsif (p_data_sides(i) = 'ASK') then
1519 v_rates_table(i) := round(v_ask_rate_base, v_rounding_factor);
1520 IF (g_proc_level>=g_debug_level) THEN
1521 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'BID/ASK: base unit quote ask', v_bid_rate_base);
1522 END IF;
1523 end if;
1524 end if;
1525 end if;
1526 ----------------------------------------------------------
1527 else
1528 FND_MESSAGE.SET_NAME('QRM','QRM_CALC_NO_DEFAULT_SPOT_ERR');
1529 FND_MESSAGE.SET_TOKEN('CCY',p_base_currencies(1));
1530 raise e_no_spot_rates;
1531 end if;
1532 CLOSE get_fx_spot_rates;
1533 IF (g_proc_level>=g_debug_level) THEN
1534 xtr_risk_debug_pkg.dpop('get_rates_from_curves: ' || 'calculating spot rates');
1535 END IF;
1536 -- not spot rate, then extract rate/vol from curve
1537 -- get interest rates/ volatilities for each curve
1538 elsif ((p_rate_types(i)='YIELD') OR
1539 (p_rate_types(i)='IRVOL') OR
1540 (p_rate_types(i)='FXVOL')) then
1541 IF (g_proc_level>=g_debug_level) THEN
1542 xtr_risk_debug_pkg.dpush('get_rates_from_curves: ' || 'calculating curve rates');
1543 END IF;
1544 -----logic for interpreting market data side of Int Rates----
1545 if (p_interest_quote_basis = 'BID') then
1546 v_sides_table(i) := 'B';
1547 elsif (p_interest_quote_basis = 'ASK') then
1548 v_sides_table(i) := 'A';
1549 elsif (p_interest_quote_basis = 'MID') then
1550 v_sides_table(i) := 'M';
1551 elsif (p_interest_quote_basis = 'BID/ASK') then
1552 if (p_data_sides(i) = 'BID') then
1553 v_sides_table(i) := 'B';
1554 elsif (p_data_sides(i) = 'ASK') then
1555 v_sides_table(i) := 'A';
1556 end if;
1557 end if;
1558 ------------------------------------------------
1559 IF (g_proc_level>=g_debug_level) THEN
1560 xtr_risk_debug_pkg.dpop('get_rates_from_curves: ' || 'calculating curve rates');
1561 END IF;
1562 v_in_rec_type.p_curve_code := p_curve_codes(i);
1563 v_curve := p_curve_codes(i);
1564 IF (g_proc_level>=g_debug_level) THEN
1565 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'curve code',p_curve_codes(i));
1566 END IF;
1567 v_in_rec_type.p_source := 'C';
1568 if (p_rate_types(i) = 'YIELD') then
1569 v_rate_type := 'Y';
1570 elsif ((p_rate_types(i) = 'IRVOL') OR
1571 (p_rate_types(i) = 'FXVOL')) then
1575 IF (g_proc_level>=g_debug_level) THEN
1572 v_rate_type := 'V';
1573 end if;
1574 v_in_rec_type.p_indicator := v_rate_type;
1576 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'indicator', v_rate_type);
1577 END IF;
1578 v_in_rec_type.p_spot_date := p_spot_date;
1579 IF (g_proc_level>=g_debug_level) THEN
1580 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'spot date', p_spot_date);
1581 END IF;
1582 v_in_rec_type.p_future_date := p_future_date;
1583 IF (g_proc_level>=g_debug_level) THEN
1584 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'future date', p_future_date);
1585 END IF;
1586 v_in_rec_type.p_day_count_basis_out := p_day_count_bases(i);
1587 IF (g_proc_level>=g_debug_level) THEN
1588 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'day count basis', p_day_count_bases(i));
1589 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'interest quote basis', p_interest_quote_basis);
1590 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'data side here',v_sides_table(i));
1591 END IF;
1592 v_in_rec_type.p_interpolation_method := p_interp_methods(i);
1593 IF (g_proc_level>=g_debug_level) THEN
1594 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'interpolation method',p_interp_methods(i));
1595 END IF;
1596 v_in_rec_type.p_side := v_sides_table(i);
1597 v_in_rec_type.p_batch_id := null;
1598 IF (g_proc_level>=g_debug_level) THEN
1599 xtr_risk_debug_pkg.dpush('get_rates_from_curves: ' || 'get md from curve');
1600 END IF;
1601 XTR_MARKET_DATA_P.get_md_from_curve(v_in_rec_type,
1602 v_out_rec_type);
1603 v_rates_table(i) := round(v_out_rec_type.p_md_out, v_rounding_factor);
1604 IF (g_proc_level>=g_debug_level) THEN
1605 xtr_risk_debug_pkg.dlog('get_rates_from_curves: ' || 'got rate', v_rates_table(i));
1606 END IF;
1607 end if;
1608 END LOOP;
1609 IF (g_proc_level>=g_debug_level) THEN
1610 xtr_risk_debug_pkg.dpop(null,'QRM_CALCULATORS_P.get_rates_from_curves');
1611 END IF;
1612 return v_rates_table;
1613 END IF;
1614
1615 EXCEPTION
1616 WHEN xtr_market_data_p.e_mdcs_no_data_found THEN
1617 if (v_rate_type = 'Y') then
1618 FND_MESSAGE.SET_NAME('QRM','QRM_CALC_NO_DEFAULT_INT_ERR');
1619 FND_MESSAGE.SET_TOKEN('CURVE',v_curve);
1620 IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
1621 xtr_risk_debug_pkg.dlog('EXCEPTION','QRM-CALC_NO_DEFAULT_INT_ERR',
1622 'QRM_CALCULATORS_P.GET_RATES_FROM_CURVE',G_ERROR_LEVEL);
1623 END IF;
1624 raise e_no_int_rates;
1625 else
1626 FND_MESSAGE.SET_NAME('QRM','QRM_CALC_NO_DEFAULT_VOL_ERR');
1627 FND_MESSAGE.SET_TOKEN('CURVE',v_curve);
1628 IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
1629 xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_VOL_RATES',
1630 'QRM_CALCULATORS_P.GET_RATES_FROM_CURVES',G_ERROR_LEVEL);
1631 END IF;
1632 raise e_no_vol_rates;
1633 end if;
1634 END get_rates_from_curves;
1635
1636
1637 FUNCTION get_rates_from_base (p_rate_types SYSTEM.QRM_VARCHAR_TABLE,
1638 p_base_currencies SYSTEM.QRM_VARCHAR_TABLE,
1639 p_contra_currencies SYSTEM.QRM_VARCHAR_TABLE,
1640 p_quote_bases SYSTEM.QRM_VARCHAR_TABLE,
1641 p_interp_methods SYSTEM.QRM_VARCHAR_TABLE,
1642 p_data_sides SYSTEM.QRM_VARCHAR_TABLE,
1643 p_day_count_bases SYSTEM.QRM_VARCHAR_TABLE,
1644 p_interest_quote_basis VARCHAR2,
1645 p_currency_quote_basis VARCHAR2,
1646 p_spot_date DATE,
1647 p_future_date DATE)
1648 RETURN xtr_md_num_table IS
1649
1650 v_curves_table SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
1651 --v_sides_table SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
1652 v_rates_table xtr_md_num_table := xtr_md_num_table();
1653
1654 v_rate_type SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
1655 v_base_ccy SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
1656 v_contra_ccy SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
1657 v_curve SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
1658
1659 v_in_rec_type XTR_MARKET_DATA_P.md_from_curve_in_rec_type;
1660 v_out_rec_type XTR_MARKET_DATA_P.md_from_curve_out_rec_type;
1661
1662 v_table_size number := p_rate_types.count;
1663 BEGIN
1664 IF (g_proc_level>=g_debug_level) THEN
1665 xtr_risk_debug_pkg.dpush(null,'QRM_CALCULATORS_P.get_rates_from_base');
1666 END IF;
1667 if ((p_base_currencies.count <> v_table_size) OR
1668 ((p_contra_currencies IS NOT null) AND
1669 (p_contra_currencies.count <> v_table_size)) OR
1670 ((p_quote_bases IS NOT null) AND
1671 (p_quote_bases.count <> v_table_size)) OR
1672 ((p_interp_methods IS NOT null) AND
1673 (p_interp_methods.count <> v_table_size)) OR
1674 ((p_data_sides IS NOT null) AND
1675 (p_data_sides.count <> v_table_size)) OR
1676 ((p_day_count_bases IS NOT null) AND
1677 (p_day_count_bases.count <> v_table_size))) then
1678 RAISE_APPLICATION_ERROR
1679 (-20001,'input tables must be the same size.');
1680 else
1681 -- first get the corresponding default curve for each rate/rate type
1682 -- to be extracted
1683 v_rate_type.extend(1);
1684 v_base_ccy.extend(1);
1685 v_contra_ccy.extend(1);
1686 v_curve.extend(1);
1687 v_curves_table.extend(v_table_size);
1688 --v_sides_table.extend(v_table_size);
1689 v_rates_table.extend(v_table_size);
1690 FOR i IN 1..v_table_size LOOP
1691 if ((p_rate_types(i) = 'YIELD') OR
1692 (p_rate_types(i) = 'FXVOL') OR
1693 (p_rate_types(i) = 'IRVOL')) then
1694 v_rate_type(1) := p_rate_types(i);
1695 v_base_ccy(1) := p_base_currencies(i);
1696 if (p_contra_currencies IS NOT null) then
1700 v_base_ccy,
1697 v_contra_ccy(1) := p_contra_currencies(i);
1698 end if;
1699 v_curve := get_curves_from_base(v_rate_type,
1701 v_contra_ccy);
1702 v_curves_table(i) := v_curve(1);
1703 IF (g_proc_level>=g_debug_level) THEN
1704 xtr_risk_debug_pkg.dlog('get_rates_from_base: ' || 'curve code', v_curve(1));
1705 END IF;
1706
1707 elsif (p_rate_types(i) = 'SPOT') then
1708 -- do spot rate extraction here
1709 -- but need to fill up space in corresponding tables
1710 v_curves_table(i) := ' ';
1711 end if;
1712 END LOOP;
1713 end if;
1714
1715 --- FILL UP RATES table
1716 -- first make sure all tables are same length
1717 if (v_curves_table.count <> v_table_size) then
1718 RAISE_APPLICATION_ERROR
1719 (-20001,'input tables must be the same size.');
1720 else
1721 -- call get_rates_from_curves
1722 v_rates_table := get_rates_from_curves(p_rate_types,
1723 v_curves_table,
1724 p_base_currencies,
1725 p_contra_currencies,
1726 p_quote_bases,
1727 p_interp_methods,
1728 p_data_sides,
1729 p_day_count_bases,
1730 p_interest_quote_basis,
1731 p_currency_quote_basis,
1732 p_spot_date,
1733 p_future_date);
1734
1735 IF (g_proc_level>=g_debug_level) THEN
1736 xtr_risk_debug_pkg.dpop(null,'QRM_CALCULATORS_P.get_rates_from_base');
1737 END IF;
1738 return v_rates_table;
1739 end if;
1740 END get_rates_from_base;
1741
1742
1743
1744 FUNCTION get_spot_quotation_basis(p_base_currency IN VARCHAR2,
1745 p_contra_currency IN VARCHAR2,
1746 p_overwrite_sys IN BOOLEAN)
1747
1748 RETURN SYSTEM.QRM_VARCHAR_TABLE IS
1749
1750 p_ccy_a varchar2(15);
1751 p_ccy_b varchar2(15);
1752 p_quote_bases SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
1753
1754 p_no_usd boolean := (p_base_currency <> 'USD' AND
1755 p_contra_currency <> 'USD');
1756
1757 CURSOR get_quote_basis(p_ccy varchar2) IS
1758 SELECT currency_a, currency_b
1759 FROM xtr_market_prices
1760 WHERE p_ccy IN (currency_a, currency_b) AND term_type='S';
1761
1762 BEGIN
1763 p_quote_bases.extend;
1764 p_quote_bases.extend;
1765
1766 if (p_overwrite_sys) then
1767 if (p_base_currency = 'USD') then
1768 p_quote_bases(1) := 'C';
1769 p_quote_bases(2) := 'C';
1770 elsif (p_contra_currency = 'USD') then
1771 p_quote_bases(1) := 'B';
1772 p_quote_bases(2) := 'C';
1773 end if;
1774 end if;
1775 if ((p_no_usd AND p_overwrite_sys) OR (NOT p_overwrite_sys)) then
1776 OPEN get_quote_basis(p_base_currency);
1777 FETCH get_quote_basis INTO p_ccy_a, p_ccy_b;
1778 if (get_quote_basis%found) then
1779 if (p_ccy_a = 'USD') then
1780 p_quote_bases(1) := 'C';
1781 elsif (p_ccy_b = 'USD') then
1782 p_quote_bases(1) := 'B';
1783 end if;
1784 else
1785 FND_MESSAGE.SET_NAME('QRM','QRM_CALC_NO_DEFAULT_SPOT_ERR');
1786 FND_MESSAGE.SET_TOKEN('CCY',p_base_currency);
1787 raise e_no_spot_rates;
1788 end if;
1789 CLOSE get_quote_basis;
1790 OPEN get_quote_basis(p_contra_currency);
1791 FETCH get_quote_basis INTO p_ccy_a, p_ccy_b;
1792 if (get_quote_basis%found) then
1793 if (p_ccy_a = 'USD') then
1794 p_quote_bases(2) := 'C';
1795 elsif (p_ccy_b = 'USD') then
1796 p_quote_bases(2) := 'B';
1797 end if;
1798 else
1799 FND_MESSAGE.SET_NAME('QRM','QRM_CALC_NO_DEFAULT_SPOT_ERR');
1800 FND_MESSAGE.SET_TOKEN('CCY',p_contra_currency);
1801 raise e_no_spot_rates;
1802 end if;
1803 CLOSE get_quote_basis;
1804 end if;
1805 return p_quote_bases;
1806 END get_spot_quotation_basis;
1807
1808
1809 --added by sankim 10/2/01
1810 /*a note about p_indicator
1811 CC:calculate using curves. override any previous rates existing.
1812 CR: calculate using rates with some rates missing, but curve code specified.
1813 default only the missing rates from the specified curve.
1814 R:calculate using rates. all rates are provided so there's no need to default
1815 any rates.
1816 NR: curve and some rates are missing when calculating using rates. a curve
1817 needs to be defaulted and fill in any missing rates.
1818 NC: no curve specified when calculating using curves. a curve needs to be
1819 defaulted and fill in all the rates
1820 */
1821 PROCEDURE fra_pricing(p_indicator IN VARCHAR2,
1822 p_settlement_date IN DATE ,
1823 p_maturity_date IN DATE,
1824 p_day_count_basis IN VARCHAR2,
1825 p_spot_date IN DATE,
1826 p_rate_curve IN OUT NOCOPY VARCHAR2,
1827 p_quote_basis IN VARCHAR2,
1828 p_interpolation IN VARCHAR2,
1829 p_ss_bid IN OUT NOCOPY NUMBER,
1830 p_ss_ask IN OUT NOCOPY NUMBER,
1831 p_sm_bid IN OUT NOCOPY NUMBER,
1832 p_sm_ask IN OUT NOCOPY NUMBER,
1833 p_holding_period OUT NOCOPY NUMBER,
1834 p_adjusted_holding_period OUT NOCOPY NUMBER,
1835 p_contract_rate_bid OUT NOCOPY NUMBER,
1836 p_contract_rate_ask OUT NOCOPY NUMBER) is
1837 v_quote_basis VARCHAR2(20) := p_quote_basis;
1838 v_settlement_date DATE;
1839 v_maturity_date DATE;
1840 v_spot_date DATE;
1841 v_spot_settlement NUMBER;
1842 --number of days from spot to settlement
1843 v_spot_maturity NUMBER;
1847 v_ss_bid NUMBER :=p_ss_bid;
1844 --number of days from spot to maturity
1845 v_year_count NUMBER;
1846 --variable for year basis
1848 v_ss_ask NUMBER :=p_ss_ask;
1849 v_sm_bid NUMBER :=p_sm_bid;
1850 v_sm_ask NUMBER :=p_sm_ask;
1851 v_fra_rec_in XTR_MM_COVERS.INT_FORW_RATE_IN_REC_TYPE;
1852 v_fra_rec_out XTR_MM_COVERS.INT_FORW_RATE_OUT_REC_TYPE;
1853 CURSOR default_currency_cursor is
1854 select param_value from xtr_pro_param
1855 where param_name = 'SYSTEM_FUNCTIONAL_CCY';
1856 v_curve_type SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
1857 v_curve_code SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE(p_rate_curve,p_rate_curve);
1858 v_base_currency SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
1859 v_interpolation SYSTEM.QRM_VARCHAR_TABLE :=
1860 SYSTEM.QRM_VARCHAR_TABLE(p_interpolation,p_interpolation);
1861 v_data_side SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
1862 v_day_count_basis SYSTEM.QRM_VARCHAR_TABLE :=
1863 SYSTEM.QRM_VARCHAR_TABLE(p_day_count_basis,p_day_count_basis);
1864 v_rates XTR_MD_NUM_TABLE := XTR_MD_NUM_TABLE();
1865 v_default_curve SYSTEM.QRM_VARCHAR_TABLE;
1866 BEGIN
1867 --xtr_risk_debug_pkg.start_debug('/sqlcom/out/findv11i','sktest.dbg');
1868 --xtr_risk_debug_pkg.start_debug;
1869 IF (g_proc_level>=g_debug_level) THEN
1870 xtr_risk_debug_pkg.dpush(null,'QRM_CALCULATORS_P.fra_pricing');
1871 END IF;
1872 --if any errors were added before, remove it
1873 IF fnd_msg_pub.count_msg > 0 THEN
1874 fnd_msg_pub.Initialize;
1875 END IF;
1876 v_base_currency.extend;
1877 v_settlement_date:= p_settlement_date;
1878 v_maturity_date:= p_maturity_date;
1879 v_spot_date:= p_spot_date;
1880 IF (g_proc_level>=g_debug_level) THEN
1881 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'p_indicator',p_indicator);
1882 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'v_settlement_date',v_settlement_date);
1883 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'v_maturity_date',v_maturity_date);
1884 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'p_day_count_basis',p_day_count_basis);
1885 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'spot_date',v_spot_date);
1886 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'rate curve',p_rate_curve);
1887 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'quote basis',p_quote_basis);
1888 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'interpolation',p_interpolation);
1889 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'ss bid',p_ss_bid);
1890 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'ss ask',p_ss_ask);
1891 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'sm bid',p_sm_bid);
1892 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'sm ask',p_sm_ask);
1893 END IF;
1894 IF p_indicator = 'NR' or p_indicator = 'NC' THEN
1895 --default a curve
1896 --get the treasury reporting currency
1897 open default_currency_cursor;
1898 fetch default_currency_cursor into v_base_currency(1);
1899 --xtr_risk_debug_pkg.dlog('default curve',p_rate_curve);
1900 close default_currency_cursor;
1901 --get the default curve that belong to the treasury reporting currency
1902 v_default_curve:=get_curves_from_base(v_curve_type,v_base_currency,null);
1903 p_rate_curve:=v_default_curve(1);
1904 v_base_currency.extend;
1905 v_base_currency(2):=v_base_currency(1);
1906 v_curve_type.extend;
1907 v_curve_type(2):='YIELD';
1908 IF v_quote_basis = 'DEFAULT' THEN
1909 --for curve default quote basis, get the actual value
1910 select data_side into v_quote_basis from xtr_rm_md_curves where
1911 curve_code = p_rate_curve;
1912 END IF;
1913 --get spot to settlement rates
1914 IF v_ss_bid is null or v_ss_ask is null or p_indicator = 'NC' THEN
1915 v_rates:=get_rates_from_base(v_curve_type,
1916 v_base_currency, null,null,v_interpolation,v_data_side,v_day_count_basis,
1917 v_quote_basis,null, p_spot_date,p_settlement_date);
1918 IF (g_proc_level>=g_debug_level) THEN
1919 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'ss bid',v_rates(1));
1920 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'ss ask',v_rates(2));
1921 END IF;
1922 IF v_ss_bid is null or p_indicator = 'NC' THEN
1923 p_ss_bid := v_rates(1);
1924 END IF;
1925 IF v_ss_ask is null or p_indicator = 'NC' THEN
1926 p_ss_ask := v_rates(2);
1927 END IF;
1928 END IF;
1929 --get spot to maturity rates
1930 IF v_sm_bid is null or v_sm_ask is null or p_indicator = 'NC' THEN
1931 v_rates:=get_rates_from_base(v_curve_type,
1932 v_base_currency, null,null,v_interpolation,v_data_side,v_day_count_basis,
1933 v_quote_basis,null, p_spot_date,p_maturity_date);
1934 IF (g_proc_level>=g_debug_level) THEN
1935 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'sm bid',v_rates(1));
1936 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'sm ask',v_rates(2));
1937 END IF;
1938 IF v_sm_bid is null or p_indicator = 'NC' THEN
1939 p_sm_bid := v_rates(1);
1940 END IF;
1941 IF v_sm_ask is null or p_indicator = 'NC' THEN
1942 p_sm_ask := v_rates(2);
1943 END IF;
1944 END IF;
1945 ELSIF p_indicator = 'CC' or p_indicator = 'CR' THEN
1946 -- get rates from curve
1947 IF v_quote_basis = 'DEFAULT' THEN
1948 --for curve default quote basis, get the actual value
1949 select data_side into v_quote_basis from xtr_rm_md_curves where
1950 curve_code = p_rate_curve;
1951 END IF;
1952 v_base_currency.extend;
1953 v_base_currency(2):=v_base_currency(1);
1954 v_curve_type.extend;
1955 v_curve_type(2):='YIELD';
1956 v_rates:=get_rates_from_curves(v_curve_type,v_curve_code,v_base_currency,
1957 null,null,v_interpolation,v_data_side,v_day_count_basis,
1958 v_quote_basis,null, p_spot_date,p_settlement_date);
1962 IF v_ss_ask is null or p_indicator = 'CC' THEN
1959 IF v_ss_bid is null or p_indicator = 'CC' THEN
1960 p_ss_bid:=v_rates(1);
1961 END IF;
1963 p_ss_ask:=v_rates(2);
1964 END IF;
1965 v_rates:=get_rates_from_curves(v_curve_type,v_curve_code,v_base_currency,
1966 null,null,v_interpolation,v_data_side,v_day_count_basis,
1967 v_quote_basis,null, p_spot_date,p_maturity_date);
1968 IF v_sm_bid is null or p_indicator = 'CC' THEN
1969 p_sm_bid:=v_rates(1);
1970 END IF;
1971 IF v_sm_ask is null or p_indicator = 'CC' THEN
1972 p_sm_ask:=v_rates(2);
1973 END IF;
1974 END IF;
1975 --calculate holding period
1976 XTR_CALC_P.calc_days_run_c(v_settlement_date,v_maturity_date,'ACTUAL/ACTUAL',null,
1977 p_holding_period,v_year_count);
1978 --calculate adjusted holding period
1979 XTR_CALC_P.calc_days_run_c(v_settlement_date,v_maturity_date,p_day_count_basis,
1980 null,p_adjusted_holding_period,v_year_count);
1981 --calculate contract rates
1982 XTR_CALC_P.calc_days_run_c(v_spot_date,v_settlement_date,p_day_count_basis,null,
1983 v_spot_settlement,v_year_count);
1984 XTR_CALC_P.calc_days_run_c(v_spot_date,v_maturity_date,p_day_count_basis,null
1985 ,v_spot_maturity,v_year_count);
1986 IF (g_proc_level>=g_debug_level) THEN
1987 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'ss bid',p_ss_bid);
1988 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'ss ask',p_ss_ask);
1989 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'sm bid',p_sm_bid);
1990 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'sm ask',p_sm_ask);
1991 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'spot maturity',v_spot_maturity);
1992 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'spot settlement',v_spot_settlement);
1993 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'year count',v_year_count);
1994 END IF;
1995
1996 v_fra_rec_in.p_indicator:= 'Y';
1997 v_fra_rec_in.p_t:=v_spot_settlement;
1998 v_fra_rec_in.p_T1:= v_spot_maturity;
1999 v_fra_rec_in.p_Rt:= p_ss_ask;
2000 v_fra_rec_in.p_RT1:= p_sm_bid;
2001 v_fra_rec_in.p_year_basis:= v_year_count;
2002
2003
2004 XTR_MM_COVERS.interest_forward_rate(v_fra_rec_in,v_fra_rec_out);
2005 p_contract_rate_bid:=v_fra_rec_out.p_fra_rate;
2006
2007 v_fra_rec_in.p_indicator:= 'Y';
2008 v_fra_rec_in.p_t:=v_spot_settlement;
2009 v_fra_rec_in.p_T1:= v_spot_maturity;
2010 v_fra_rec_in.p_Rt:= p_ss_bid;
2011 v_fra_rec_in.p_RT1:= p_sm_ask;
2012 v_fra_rec_in.p_year_basis:= v_year_count;
2013
2014
2015
2016 XTR_MM_COVERS.interest_forward_rate(v_fra_rec_in,v_fra_rec_out);
2017 p_contract_rate_ask:=v_fra_rec_out.p_fra_rate;
2018 IF (g_proc_level>=g_debug_level) THEN
2019 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'ss bid',p_ss_bid);
2020 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'ss ask',p_ss_ask);
2021 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'sm bid',p_sm_bid);
2022 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'sm ask',p_sm_ask);
2023 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'contract bid',p_contract_rate_bid);
2024 xtr_risk_debug_pkg.dlog('fra_pricing: ' || 'contract ask',p_contract_rate_ask);
2025 xtr_risk_debug_pkg.dpop('fra_pricing: ' || 'pricing cover');
2026 END IF;
2027 --xtr_risk_debug_pkg.stop_debug;
2028 IF (g_proc_level>=g_debug_level) THEN
2029 xtr_risk_debug_pkg.dpop(null,'QRM_CALCULATORS_P.fra_pricing');
2030 END IF;
2031 EXCEPTION
2032 WHEN e_no_rate_curve THEN
2033 IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
2034 xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_RATE_CURVE',
2035 'QRM_CALCULATORS_P.FRA_PRICING',G_ERROR_LEVEL);
2036 END IF;
2037 fnd_msg_pub.add;
2038 WHEN e_no_int_rates THEN
2039 IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
2040 xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_INT_RATES',
2041 'QRM_CALCULATORS_P.FRA_PRICING',G_ERROR_LEVEL);
2042 END IF;
2043 fnd_msg_pub.add;
2044 END fra_pricing;
2045
2046 --added by sankim 10/16/01
2047 /*a note about p_indicator
2048 CC:calculate using curves. override any previous rates existing.
2049 CR: calculate using rates with some rates missing, but curve code specified.
2050 default only the missing rates from the specified curve.
2051 R:calculate using rates. all rates are provided so there's no need to default
2052 any rates.
2053 NR: curve and some rates are missing when calculating using rates. a curve
2054 needs to be defaulted and fill in any missing rates.
2055 NC: no curve specified when calculating using curves. a curve needs to be
2056 defaulted and fill in all the rates
2057 */
2058 PROCEDURE fra_settlement(p_indicator IN VARCHAR2,
2059 p_settlement_date IN DATE,
2060 p_maturity_date IN DATE,
2061 p_face_value IN NUMBER,
2062 p_currency IN OUT NOCOPY VARCHAR2,
2063 p_contract_rate IN OUT NOCOPY NUMBER,
2064 p_day_count_basis IN VARCHAR2,
2065 p_deal_subtype IN VARCHAR2,
2066 p_calculation_method IN VARCHAR2,
2067 p_rate_curve IN OUT NOCOPY VARCHAR2,
2068 p_quote_basis IN VARCHAR2,
2069 p_interpolation IN VARCHAR2,
2070 p_settlement_rate IN OUT NOCOPY NUMBER,
2071 p_holding_period OUT NOCOPY NUMBER,
2072 p_adjusted_holding_period OUT NOCOPY NUMBER,
2073 p_action OUT NOCOPY VARCHAR2,
2074 p_settlement_amount OUT NOCOPY NUMBER,
2075 p_duration OUT NOCOPY NUMBER,
2076 p_convexity OUT NOCOPY NUMBER,
2077 p_basis_point_value OUT NOCOPY NUMBER) is
2078 v_quote_basis VARCHAR2(20) := p_quote_basis;
2079 v_settlement_date DATE;
2080 v_maturity_date DATE;
2081 v_spot_date DATE;
2082 v_spot_settlement NUMBER;
2086 v_year_count NUMBER;
2083 --number of days from spot to settlement
2084 v_settlement_maturity NUMBER;
2085 --number of days from settlement to maturity
2087 --variable for year basis
2088 v_settlement_rate NUMBER :=p_settlement_rate;
2089 v_fra_rec_in XTR_MM_COVERS.FRA_SETTLEMENT_IN_REC_TYPE;
2090 v_fra_rec_out XTR_MM_COVERS.FRA_SETTLEMENT_OUT_REC_TYPE;
2091 CURSOR default_currency_cursor is
2092 select param_value from xtr_pro_param
2093 where param_name = 'SYSTEM_FUNCTIONAL_CCY';
2094 v_curve_type SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2095 v_curve_code SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE(p_rate_curve);
2096 v_base_currency SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE();
2097 v_interpolation SYSTEM.QRM_VARCHAR_TABLE :=
2098 SYSTEM.QRM_VARCHAR_TABLE(p_interpolation);
2099 v_data_side SYSTEM.QRM_VARCHAR_TABLE := SYSTEM.QRM_VARCHAR_TABLE(p_quote_basis);
2100 v_day_count_basis SYSTEM.QRM_VARCHAR_TABLE :=
2101 SYSTEM.QRM_VARCHAR_TABLE(p_day_count_basis);
2102 v_rates XTR_MD_NUM_TABLE := XTR_MD_NUM_TABLE();
2103 v_days_array XTR_MD_NUM_TABLE := XTR_MD_NUM_TABLE();
2104 v_pvc_array XTR_MD_NUM_TABLE := XTR_MD_NUM_TABLE();
2105 v_default_curve SYSTEM.QRM_VARCHAR_TABLE;
2106 v_ss_bid NUMBER;
2107 v_ss_ask NUMBER;
2108 v_sm_bid NUMBER;
2109 v_sm_ask NUMBER;
2110 v_holding_period NUMBER;
2111 v_adjusted_holding_period NUMBER;
2112 v_contract_rate_bid NUMBER;
2113 v_contract_rate_ask NUMBER;
2114 v_rounding_factor NUMBER := 6;
2115 BEGIN
2116 --xtr_risk_debug_pkg.start_debug('/sqlcom/out/findv11i','sktest.dbg');
2117 --xtr_risk_debug_pkg.start_debug;
2118 IF (g_proc_level>=g_debug_level) THEN
2119 xtr_risk_debug_pkg.dpush(null,'QRM_CALCULATORS_P.fra_settlement');
2120 END IF;
2121 --if any errors were added before, remove it
2122 IF fnd_msg_pub.count_msg > 0 THEN
2123 fnd_msg_pub.Initialize;
2124 END IF;
2125 v_base_currency.extend;
2126 v_settlement_date:= p_settlement_date;
2127 v_maturity_date:= p_maturity_date;
2128
2129 v_spot_date := trunc(sysdate);
2130
2131
2132 /*xtr_risk_debug_pkg.dlog('p_indicator',p_indicator);
2133 IF (g_proc_level>=g_debug_level) THEN
2134 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'v_maturity_date',v_maturity_date);
2135 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'p_day_count_basis',p_day_count_basis);
2136 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'spot_date',v_spot_date);
2137 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'rate curve',p_rate_curve);
2138 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'quote basis',p_quote_basis);
2139 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'interpolation',p_interpolation);
2140 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'ss bid',p_ss_bid);
2141 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'ss ask',p_ss_ask);
2142 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'sm bid',p_sm_bid);
2143 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'sm ask',p_sm_ask);
2144 END IF;*/
2145 IF p_currency is NULL THEN
2146 --get the treasury reporting currency if no currency is specified
2147 open default_currency_cursor;
2148 fetch default_currency_cursor into v_base_currency(1);
2149 --xtr_risk_debug_pkg.dlog('default curve',p_rate_curve);
2150 close default_currency_cursor;
2151 ELSE
2152 v_base_currency(1):=p_currency;
2153 END IF;
2154 IF p_indicator = 'NC'or p_indicator = 'NR' THEN
2155 --default a curve
2156 --get the default curve that belong to the currency specified or the treasury
2157 -- reporting currency
2158 v_default_curve:=get_curves_from_base(v_curve_type, v_base_currency,null);
2159 p_rate_curve:=v_default_curve(1);
2160 --get settlement rate
2161 IF v_settlement_rate is null or p_indicator = 'NC' THEN
2162 IF v_spot_date >= v_settlement_date THEN
2163 v_rates:=get_rates_from_base(v_curve_type,
2164 v_base_currency, null,null,v_interpolation,v_data_side,
2165 v_day_count_basis,v_quote_basis,null, v_settlement_date,
2166 p_maturity_date);
2167 --xtr_risk_debug_pkg.dlog('ss bid',v_rates(1));
2168 --xtr_risk_debug_pkg.dlog('ss ask',v_rates(2));
2169 p_settlement_rate:=v_rates(1);
2170 ELSE --calculate forward-forward rate
2171 IF (g_proc_level>=g_debug_level) THEN
2172 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'settle date',p_settlement_date);
2173 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'maturity date',p_maturity_date);
2174 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'day count',p_day_count_basis);
2175 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'spot date',v_spot_date);
2176 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'curve',p_rate_curve);
2177 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'quote basis',p_quote_basis);
2178 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'interp',p_interpolation);
2179 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'ss bid',v_ss_bid);
2180 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'ss ask',v_ss_ask);
2181 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'sm bid',v_sm_bid);
2182 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'sm ask',v_sm_ask);
2183 END IF;
2184 fra_pricing('CC',p_settlement_date,p_maturity_date,p_day_count_basis,
2185 v_spot_date,p_rate_curve,p_quote_basis,p_interpolation,v_ss_bid,
2186 v_ss_ask,v_sm_bid,v_sm_ask,v_holding_period,v_adjusted_holding_period,
2187 v_contract_rate_bid,v_contract_rate_ask);
2188 IF p_quote_basis = 'BID' THEN
2189 p_settlement_rate:= v_contract_rate_bid;
2190 ELSIF p_quote_basis = 'ASK' THEN
2191 p_settlement_rate:= v_contract_rate_ask;
2192 ELSE --mid
2193 p_settlement_rate:= (v_contract_rate_bid+v_contract_rate_ask)/2;
2194 END IF;
2198 ELSIF p_indicator = 'CC' or p_indicator = 'CR' THEN
2195 p_settlement_rate:= round(p_settlement_rate,v_rounding_factor);
2196 END IF;
2197 END IF;
2199 -- get rates from curve
2200 IF v_settlement_rate is null or p_indicator = 'CC' THEN
2201 IF v_spot_date >= v_settlement_date THEN
2202 v_rates:=get_rates_from_curves(v_curve_type,v_curve_code,
2203 v_base_currency,null,null,v_interpolation,v_data_side,
2204 v_day_count_basis,v_quote_basis,null, v_settlement_date,
2205 p_maturity_date);
2206 /*v_rates:=get_rates_from_curves(v_curve_type,v_curve_code,
2207 v_base_currency,null,null,v_interpolation,v_data_side,
2208 v_day_count_basis,v_quote_basis,null, v_spot_date,
2209 p_maturity_date);*/
2210 p_settlement_rate:=v_rates(1);
2211 ELSE --calculate forward-forward rate
2212 IF (g_proc_level>=g_debug_level) THEN
2213 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'settle date',p_settlement_date);
2214 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'maturity date',p_maturity_date);
2215 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'day count',p_day_count_basis);
2216 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'spot date',v_spot_date);
2217 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'curve',p_rate_curve);
2218 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'quote basis',p_quote_basis);
2219 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'interp',p_interpolation);
2220 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'ss bid',v_ss_bid);
2221 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'ss ask',v_ss_ask);
2222 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'sm bid',v_sm_bid);
2223 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'sm ask',v_sm_ask);
2224 END IF;
2225 fra_pricing('CC',p_settlement_date,p_maturity_date,p_day_count_basis,
2226 v_spot_date,p_rate_curve,p_quote_basis,p_interpolation,v_ss_bid,
2227 v_ss_ask,v_sm_bid,v_sm_ask,v_holding_period,v_adjusted_holding_period,
2228 v_contract_rate_bid,v_contract_rate_ask);
2229 IF p_quote_basis = 'BID' THEN
2230 p_settlement_rate:= v_contract_rate_bid;
2231 ELSIF p_quote_basis = 'ASK' THEN
2232 p_settlement_rate:= v_contract_rate_ask;
2233 ELSE --mid
2234 p_settlement_rate:= (v_contract_rate_bid+v_contract_rate_ask)/2;
2235 END IF;
2236 p_settlement_rate:= round(p_settlement_rate,v_rounding_factor);
2237 END IF;
2238 END IF;
2239 END IF;
2240 --calculate holding period
2241 XTR_CALC_P.calc_days_run_c(v_settlement_date,v_maturity_date,'ACTUAL/ACTUAL',
2242 null,p_holding_period,v_year_count);
2243 --calculate adjusted holding period
2244 XTR_CALC_P.calc_days_run_c(v_settlement_date,v_maturity_date,
2245 p_day_count_basis,null,p_adjusted_holding_period,v_year_count);
2246 --calculate settlement amount
2247 v_settlement_maturity:= p_adjusted_holding_period;
2248 IF (g_proc_level>=g_debug_level) THEN
2249 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'calc method',p_calculation_method);
2250 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'settle rate',p_settlement_rate);
2251 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'contract rate',p_contract_rate);
2252 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'face value',p_face_value);
2253 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'settlement maturity',v_settlement_maturity);
2254 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'year count',v_year_count);
2255 END IF;
2256
2257 v_fra_rec_in.p_indicator:= p_calculation_method;
2258 v_fra_rec_in.p_fra_price:= p_contract_rate;
2259 v_fra_rec_in.p_settlement_rate:= p_settlement_rate;
2260 v_fra_rec_in.p_face_value:= p_face_value;
2261 v_fra_rec_in.p_day_count:= v_settlement_maturity;
2262 v_fra_rec_in.p_annual_basis:= v_year_count;
2263 v_fra_rec_in.p_deal_subtype:= null;
2264
2265
2266
2267 XTR_MM_COVERS.fra_settlement_amount(v_fra_rec_in,v_fra_rec_out);
2268 p_settlement_amount:=v_fra_rec_out.p_settlement_amount;
2269 IF (g_proc_level>=g_debug_level) THEN
2270 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'settle amount',p_settlement_amount);
2271 END IF;
2272 --calculate sensitivities of fra
2273 IF v_spot_date< v_settlement_date THEN
2274 -- first, calculate duration
2275 XTR_CALC_P.calc_days_run_c(v_spot_date,v_settlement_date,p_day_count_basis,
2276 null,v_spot_settlement,v_year_count);
2277 IF (g_proc_level>=g_debug_level) THEN
2278 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'spot_date',v_spot_date);
2279 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'settlement_date',v_settlement_date);
2280 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'spot_settlement',v_spot_settlement);
2281 END IF;
2282 v_days_array.extend;
2283 v_days_array(1):=v_spot_settlement;
2284 v_pvc_array.extend;
2285 v_pvc_array(1):=1;
2286 p_duration:=QRM_MM_FORMULAS.duration(v_pvc_array,v_days_array,v_year_count);
2287 IF (g_proc_level>=g_debug_level) THEN
2288 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'year count',v_year_count);
2289 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'duration',p_duration);
2290 END IF;
2291 --secondly, calculate convexity
2292 p_convexity:=QRM_MM_FORMULAS.ni_fra_convexity(v_spot_settlement,
2293 p_settlement_rate,v_year_count);
2294 IF (g_proc_level>=g_debug_level) THEN
2295 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'settlement rate',p_settlement_rate);
2296 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'convexity',p_convexity);
2297 END IF;
2298 -- lastly, calculate bpv
2299 --calculate shifted settlement
2300 v_fra_rec_in.p_settlement_rate:=p_settlement_rate+0.01;
2304 IF (g_proc_level>=g_debug_level) THEN
2301 XTR_MM_COVERS.fra_settlement_amount(v_fra_rec_in,v_fra_rec_out);
2302 p_basis_point_value:=QRM_MM_FORMULAS.bpv(p_settlement_amount,
2303 v_fra_rec_out.p_settlement_amount);
2305 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'shifted',v_fra_rec_out.p_settlement_amount);
2306 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'base',p_settlement_amount);
2307 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'bpv',p_basis_point_value);
2308 END IF;
2309 END IF;
2310 --determine pay or receive
2311 IF p_deal_subtype = 'FUND' THEN
2312 IF p_contract_rate > p_settlement_rate THEN
2313 SELECT description INTO p_action FROM xtr_amount_actions_v WHERE deal_type ='FRA' AND amount_type = 'SETTLE' AND action_code = 'PAY';
2314 ELSIF p_contract_rate < p_settlement_rate THEN
2315 SELECT description INTO p_action FROM xtr_amount_actions_v WHERE deal_type ='FRA' AND amount_type = 'SETTLE' AND action_code = 'REC';
2316 ELSE
2317 p_action:=null;
2318 END IF;
2319 ELSE
2320 IF p_contract_rate > p_settlement_rate THEN
2321 SELECT description INTO p_action FROM xtr_amount_actions_v WHERE deal_type ='FRA' AND amount_type = 'SETTLE' AND action_code = 'REC';
2322 ELSIF p_contract_rate < p_settlement_rate THEN
2323 SELECT description INTO p_action FROM xtr_amount_actions_v WHERE deal_type ='FRA' AND amount_type = 'SETTLE' AND action_code = 'PAY';
2324 ELSE
2325 p_action:=null;
2326 END IF;
2327 END IF;
2328 /*xtr_risk_debug_pkg.dlog('ss bid',p_ss_bid);
2329 IF (g_proc_level>=g_debug_level) THEN
2330 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'ss ask',p_ss_ask);
2331 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'sm bid',p_sm_bid);
2332 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'sm ask',p_sm_ask);
2333 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'contract bid',p_contract_rate_bid);
2334 xtr_risk_debug_pkg.dlog('fra_settlement: ' || 'contract ask',p_contract_rate_ask);
2335 END IF;*/
2336 --xtr_risk_debug_pkg.stop_debug;
2337 --return currency if it wasn't provided
2338 IF p_currency is NULL THEN
2339 p_currency:= v_base_currency(1);
2340 END IF;
2341 IF (g_proc_level>=g_debug_level) THEN
2342 xtr_risk_debug_pkg.dpop(null,'QRM_CALCULATORS_P.fra_settlement');
2343 END IF;
2344 EXCEPTION
2345 WHEN e_no_rate_curve THEN
2346 IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
2347 xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_RATE_CURVE',
2348 'QRM_CALCULATORS_P.FRA_SETTLEMENT',G_ERROR_LEVEL);
2349 END IF;
2350 fnd_msg_pub.add;
2351 WHEN e_no_int_rates THEN
2352 IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
2353 xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_INT_RATES',
2354 'QRM_CALCULATORS_P.FRA_SETTLEMENT',G_ERROR_LEVEL);
2355 END IF;
2356 fnd_msg_pub.add;
2357 END fra_settlement;
2358
2359
2360
2361 --added by jbrodsky 11/02/01
2362
2363 PROCEDURE fxo_calculator(p_date_args IN SYSTEM.QRM_DATE_TABLE,
2364 p_varchar_args IN OUT NOCOPY SYSTEM.QRM_VARCHAR_TABLE,
2365 p_num_args IN OUT NOCOPY xtr_md_num_table) IS
2366
2367 p_spot_date date := p_date_args(1);
2368 p_exp_date date := p_date_args(2);
2369 p_indicator varchar2(1) := p_varchar_args(1);
2370 p_foreign_ccy varchar2(15) := p_varchar_args(2);
2371 p_domestic_ccy varchar2(15) := p_varchar_args(3);
2372 p_currency_quote varchar2(20) := p_varchar_args(4);
2373 p_interest_quote varchar2(20) := p_varchar_args(5);
2374 p_foreign_curve varchar2(20) := p_varchar_args(6);
2375 p_domestic_curve varchar2(20) := p_varchar_args(7);
2376 p_volatility_curve varchar2(20) := p_varchar_args(8);
2377 p_foreign_interpolation varchar2(20) := p_varchar_args(9);
2378 p_domestic_interpolation varchar2(20) := p_varchar_args(10);
2379 p_volatility_interpolation varchar2(20) := p_varchar_args(11);
2380 p_foreign_quote_usd varchar2(1) := p_varchar_args(12);
2381 p_domestic_quote_usd varchar2(1) := p_varchar_args(13);
2382 p_foreign_day_count varchar2(15) := p_varchar_args(14);
2383 p_domestic_day_count varchar2(15) := p_varchar_args(15);
2384 p_implied_vol_call_put varchar2(20):= p_varchar_args(16);
2385 p_calc_type_indicator varchar2(1):= p_varchar_args(17);
2386 p_implied_vol_price number := p_num_args(1);
2387 p_foreign_ccy_amt number := p_num_args(2);
2388 p_strike_price number:= p_num_args(3);
2389 p_volatility number:= p_num_args(4);
2390 p_for_spot_rate_bid number := p_num_args(5);
2391 p_for_spot_rate_ask number := p_num_args(6);
2392 p_dom_spot_rate_bid number := p_num_args(7);
2393 p_dom_spot_rate_ask number := p_num_args(8);
2394 p_for_int_rate_bid number := p_num_args(9);
2395 p_for_int_rate_ask number := p_num_args(10);
2396 p_dom_int_rate_bid number := p_num_args(11);
2397 p_dom_int_rate_ask number := p_num_args(12);
2398 p_vol_bid number := p_num_args(13);
2399 p_vol_ask number := p_num_args(14);
2400
2401
2402 p_res_impl_vol number;
2403
2404
2405 p_res_call_bid number;
2406 p_res_call_ask number;
2407 p_res_put_bid number;
2408 p_res_put_ask number;
2409 p_res_fxforward_bid number;
2410 p_res_fxforward_ask number;
2411 p_res_call_fair_value_bid number;
2412 p_res_call_fair_value_ask number;
2413 p_res_put_fair_value_bid number;
2414 p_res_put_fair_value_ask number;
2415
2416 p_res_delta_call_bid number;
2417 p_res_delta_call_ask number;
2418 p_res_delta_put_bid number;
2419 p_res_delta_put_ask number;
2420 p_res_gamma_bid number;
2421 p_res_gamma_ask number;
2422 p_res_theta_call_bid number;
2423 p_res_theta_call_ask number;
2424 p_res_theta_put_bid number;
2425 p_res_theta_put_ask number;
2426 p_res_vega_bid number;
2427 p_res_vega_ask number;
2428 p_res_rho_dom_call_bid number;
2429 p_res_rho_dom_call_ask number;
2430 p_res_rho_dom_put_bid number;
2431 p_res_rho_dom_put_ask number;
2432 p_res_rho_for_call_bid number;
2433 p_res_rho_for_call_ask number;
2434 p_res_rho_for_put_bid number;
2435 p_res_rho_for_put_ask number;
2436
2437 --Inputs for implied volatility calculation
2438 p_rates_table XTR_MD_NUM_TABLE;
2439 p_interest_rates XTR_MD_NUM_TABLE;
2440 p_day_count_bases SYSTEM.QRM_VARCHAR_TABLE;
2441 p_rate_types SYSTEM.QRM_VARCHAR_TABLE;
2442 p_compound_freq XTR_MD_NUM_TABLE;
2443 p_spot_rates XTR_MD_NUM_TABLE;
2444 p_curve_types SYSTEM.QRM_VARCHAR_TABLE;
2445 p_curve_codes SYSTEM.QRM_VARCHAR_TABLE;
2446 p_base_currencies SYSTEM.QRM_VARCHAR_TABLE;
2447 p_contra_currencies SYSTEM.QRM_VARCHAR_TABLE;
2448 p_quote_bases SYSTEM.QRM_VARCHAR_TABLE;
2449 p_interp_methods SYSTEM.QRM_VARCHAR_TABLE;
2450 p_data_sides SYSTEM.QRM_VARCHAR_TABLE;
2451
2452 --indicator of whether either currency is USD
2453 p_neither_usd boolean := (p_foreign_ccy<>'USD' AND p_domestic_ccy<>'USD');
2454 -- indicator of whether to overwrite quotation basis against usd
2455 -- if one currency is USD
2456 p_ow_spot_rates boolean := false;
2457
2458 p_unit_price number;
2459 p_days number;
2460 p_years number;
2461 p_option_indicator varchar2(1);
2462 p_spot_rate number;
2463
2464 p_rate_type varchar2(1);
2465
2466
2467 --Continuous version of rates
2468 p_for_cint_rate_bid number;
2469 p_for_cint_rate_ask number;
2470 p_dom_cint_rate_bid number;
2471 p_dom_cint_rate_ask number;
2472
2473 fx_option_price_in XTR_FX_FORMULAS.GK_OPTION_CV_IN_REC_TYPE;
2474 fx_option_price_out XTR_FX_FORMULAS.GK_OPTION_CV_OUT_REC_TYPE;
2475
2476 BEGIN
2477
2478
2479
2480 IF (g_proc_level>=g_debug_level) THEN
2481 xtr_risk_debug_pkg.dpush(null,'QRM_CALCULATORS_P.fxo_calculator');
2482 END IF;
2483
2484
2485
2486 IF fnd_msg_pub.count_msg > 0 THEN
2487 fnd_msg_pub.Initialize;
2488 END IF;
2489
2490
2491 if (p_exp_date-p_spot_date > 365) THEN
2492 p_rate_type := 'P';
2493 ELSE
2494 p_rate_type := 'S';
2495 END IF;
2496
2497
2498
2499
2500 IF (p_calc_type_indicator = 'V') THEN
2501
2502 --Default Curve Data
2503 IF (p_indicator = 'D') THEN
2504
2505
2506 IF (g_proc_level>=g_debug_level) THEN
2507 xtr_risk_debug_pkg.dpush('fxo_calculator: ' || 'Calculation Based On Defaults');
2508 END IF;
2509
2510 p_volatility_curve:='';
2511 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD','YIELD');
2512 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy,p_domestic_ccy);
2513 p_curve_codes := get_curves_from_base(p_curve_types,p_base_currencies,
2514 p_contra_currencies);
2515
2516 p_foreign_curve := p_curve_codes(1);
2517 p_domestic_curve := p_curve_codes(2);
2518
2519 IF (g_proc_level>=g_debug_level) THEN
2520 xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'foreign curve', p_foreign_curve);
2521 xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'domestic curve', p_domestic_curve);
2522 END IF;
2523
2524
2525 -- since 'Calculate Using Defaults' was pressed, use default interpol.
2526 p_foreign_interpolation := 'DEFAULT';
2527 p_domestic_interpolation := 'DEFAULT';
2528
2529 -- assume interest rate quote to be bid/ask;
2530 p_interest_quote := 'BID/ASK';
2531
2532 -- calculate Rates
2533 -- this follows the calculator table across each row
2534 -- first do Spot Rates
2535
2536 -- get quotation basis versus usd for our currencies
2537
2538 p_quote_bases:=GET_SPOT_QUOTATION_BASIS(p_foreign_ccy, p_domestic_ccy, p_ow_spot_rates);
2539 p_foreign_quote_usd:= p_quote_bases(1);
2540 p_domestic_quote_usd:= p_quote_bases(2);
2541
2542 if (p_foreign_ccy = 'USD' AND p_domestic_ccy <> 'USD') then
2543 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
2544 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy, p_domestic_ccy);
2545 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_quote_usd,
2546 p_domestic_quote_usd);
2547 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
2548 elsif (p_domestic_ccy = 'USD' AND p_foreign_ccy <> 'USD') then
2549 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
2550 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy, p_foreign_ccy);
2551 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd,p_foreign_quote_usd);
2552 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
2553 elsif (p_foreign_ccy <> 'USD' AND p_domestic_ccy <> 'USD') then
2554 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT','SPOT','SPOT');
2555 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy,p_foreign_ccy,
2556 p_domestic_ccy, p_domestic_ccy);
2557 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd, p_foreign_quote_usd,
2558 p_domestic_quote_usd,p_domestic_quote_usd);
2559 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
2560 end if;
2561
2562 p_rates_table := get_rates_from_base(p_rate_types, p_base_currencies,
2563 p_contra_currencies, p_quote_bases,
2564 p_interp_methods, p_data_sides,
2565 p_day_count_bases,p_interest_quote,
2566 p_currency_quote,p_spot_date,
2567 p_exp_date);
2568
2569 if (p_foreign_ccy = 'USD' AND p_domestic_ccy <> 'USD') then
2570 p_for_spot_rate_bid := 1;
2571 p_for_spot_rate_ask := 1;
2572 p_dom_spot_rate_bid := p_rates_table(1);
2573 p_dom_spot_rate_ask := p_rates_table(2);
2574 elsif (p_domestic_ccy = 'USD' AND p_foreign_ccy <> 'USD') then
2575 p_for_spot_rate_bid := p_rates_table(1);
2576 p_for_spot_rate_ask := p_rates_table(2);
2577 p_dom_spot_rate_bid := 1;
2578 p_dom_spot_rate_ask := 1;
2579 elsif (p_neither_usd) then
2580 p_for_spot_rate_bid := p_rates_table(1);
2581 p_for_spot_rate_ask := p_rates_table(2);
2582 p_dom_spot_rate_bid := p_rates_table(3);
2583 p_dom_spot_rate_ask := p_rates_table(4);
2584 end if;
2585
2586
2587
2588
2589 -- now do Interest Rates
2590 p_rate_types.delete;
2591 p_base_currencies.delete;
2592 p_data_sides.delete;
2593 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT','DEFAULT',
2594 'DEFAULT','DEFAULT');
2595 p_quote_bases := null;
2596 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD','YIELD','YIELD','YIELD');
2597 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy, p_foreign_ccy,
2598 p_domestic_ccy, p_domestic_ccy);
2599 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
2600 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE('ACTUAL365', 'ACTUAL365',
2601 'ACTUAL365',
2602 'ACTUAL365'); -- bug 3611158
2603
2604
2605
2606 --Call to get interest rates
2607 p_rates_table := get_rates_from_base(p_rate_types, p_base_currencies,
2608 p_contra_currencies, p_quote_bases,
2609 p_interp_methods, p_data_sides,
2610 p_day_count_bases,p_interest_quote,
2611 p_currency_quote,p_spot_date,
2612 p_exp_date);
2613 p_for_int_rate_bid := p_rates_table(1);
2614 p_for_int_rate_ask := p_rates_table(2);
2615 p_dom_int_rate_bid := p_rates_table(3);
2616 p_dom_int_rate_ask := p_rates_table(4);
2617
2618
2619 --Values set to be passed back as default used
2620 p_domestic_day_count:='ACTUAL365';
2621 p_foreign_day_count:='ACTUAL365';
2622
2623
2624
2625 IF (g_proc_level>=g_debug_level) THEN
2626 xtr_risk_debug_pkg.dpop('fxo_calculator: ' || 'Calculation Based On Defaults');
2627 END IF;
2628
2629
2630
2631 --Optional Curve Data
2632 ELSIF (p_indicator = 'C') THEN
2633 IF (g_proc_level>=g_debug_level) THEN
2634 xtr_risk_debug_pkg.dpush('fxo_calculator: ' || 'Calculation Based On Curves');
2635 END IF;
2636 -- GET DEFAULT CURVES
2637
2638
2639 --If all curves are not input, defaults are gotten
2640 if (p_foreign_curve IS null) then
2641 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2642 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
2643 p_curve_codes := get_curves_from_base(p_curve_types,
2644 p_base_currencies,
2645 p_contra_currencies);
2646 p_foreign_curve := p_curve_codes(1);
2647 end if;
2648 if (p_domestic_curve IS null) then
2649 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2650 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
2651 p_curve_codes := get_curves_from_base(p_curve_types,
2652 p_base_currencies,
2653 p_contra_currencies);
2654 p_domestic_curve := p_curve_codes(1);
2655 end if;
2656
2657 -- GET DEFAULT RATES based on CURVES
2658 -- first do SPOT RATES
2659
2660
2661 --curve codes are null on spot rates
2662 p_curve_codes := null;
2663 p_base_currencies := null;
2664 -- calculate Rates
2665 -- this follows the calculator table across each row
2666 -- first do Spot Rates
2667 p_quote_bases:=GET_SPOT_QUOTATION_BASIS(p_foreign_ccy, p_domestic_ccy, p_ow_spot_rates);
2668 p_foreign_quote_usd:= p_quote_bases(1);
2669 p_domestic_quote_usd:= p_quote_bases(2);
2670
2671 if (p_foreign_ccy = 'USD' AND p_domestic_ccy <> 'USD') then
2672 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
2673 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy, p_domestic_ccy);
2674 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_quote_usd,
2675 p_domestic_quote_usd);
2676 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
2677 elsif (p_domestic_ccy = 'USD' AND p_foreign_ccy <> 'USD') then
2678 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
2679 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy, p_foreign_ccy);
2680 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd,p_foreign_quote_usd);
2681 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
2682 elsif (p_foreign_ccy <> 'USD' AND p_domestic_ccy <> 'USD') then
2683 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT','SPOT','SPOT');
2684 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy,p_foreign_ccy,
2685 p_domestic_ccy, p_domestic_ccy);
2686 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd, p_foreign_quote_usd,
2687 p_domestic_quote_usd,p_domestic_quote_usd);
2688 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
2689 end if;
2690
2691
2692 --Gets spot rates
2693 p_rates_table := get_rates_from_curves(p_rate_types, p_curve_codes, p_base_currencies,
2694 p_contra_currencies, p_quote_bases,
2695 p_interp_methods, p_data_sides,
2696 p_day_count_bases,p_interest_quote,
2697 p_currency_quote,p_spot_date,
2698 p_exp_date);
2699
2700 if (p_foreign_ccy = 'USD' AND p_domestic_ccy <> 'USD') then
2701 p_for_spot_rate_bid := 1;
2702 p_for_spot_rate_ask := 1;
2703 p_dom_spot_rate_bid := p_rates_table(1);
2704 p_dom_spot_rate_ask := p_rates_table(2);
2705 elsif (p_domestic_ccy = 'USD' AND p_foreign_ccy <> 'USD') then
2706 p_for_spot_rate_bid := p_rates_table(1);
2707 p_for_spot_rate_ask := p_rates_table(2);
2708 p_dom_spot_rate_bid := 1;
2709 p_dom_spot_rate_ask := 1;
2710 elsif (p_neither_usd) then
2711 p_for_spot_rate_bid := p_rates_table(1);
2712 p_for_spot_rate_ask := p_rates_table(2);
2713 p_dom_spot_rate_bid := p_rates_table(3);
2714 p_dom_spot_rate_ask := p_rates_table(4);
2715 end if;
2716
2717
2718
2719
2720 -- now get INTEREST RATES
2721 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD','YIELD','YIELD','YIELD');
2722 p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_curve,p_foreign_curve,
2723 p_domestic_curve,p_domestic_curve);
2724 p_base_currencies.delete;
2725 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy,p_foreign_ccy,
2726 p_domestic_ccy,p_domestic_ccy);
2727 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_interpolation,
2728 p_foreign_interpolation, p_domestic_interpolation, p_domestic_interpolation);
2729
2730 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
2731 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE('ACTUAL365',
2732 'ACTUAL365','ACTUAL365','ACTUAL365');
2736 p_base_currencies,
2733 p_quote_bases := null;
2734
2735 p_rates_table := get_rates_from_curves(p_rate_types,p_curve_codes,
2737 p_contra_currencies,
2738 p_quote_bases,p_interp_methods,
2739 p_data_sides,p_day_count_bases,
2740 p_interest_quote,p_currency_quote,
2741 p_spot_date,
2742 p_exp_date);
2743 p_for_int_rate_bid := p_rates_table(1);
2744 p_for_int_rate_ask := p_rates_table(2);
2745 p_dom_int_rate_bid := p_rates_table(3);
2746 p_dom_int_rate_ask := p_rates_table(4);
2747
2748
2749 --Values set to be passed back as default used
2750 p_domestic_day_count:='ACTUAL365'; -- bug 3611158
2751 p_foreign_day_count:='ACTUAL365';
2752
2753 IF (g_proc_level>=g_debug_level) THEN
2754 xtr_risk_debug_pkg.dpop('fxo_calculator: ' || 'Calculation Based On Curves');
2755 END IF;
2756
2757
2758
2759
2760
2761
2762 --Optional Rates Data
2763 ELSIF (p_indicator = 'R') THEN
2764 IF (g_proc_level>=g_debug_level) THEN
2765 xtr_risk_debug_pkg.dpush('fxo_calculator: ' || 'Calculation Based On Rates');
2766 END IF;
2767 -- if a spot rate is missing, go to base(defaults) section
2768 if (p_for_spot_rate_bid IS null) then
2769 if (p_foreign_ccy <> 'USD') then
2770 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
2771 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
2772 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd);
2773 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
2774 p_rates_table := get_rates_from_curves(p_rate_types,
2775 p_curve_codes,
2776 p_base_currencies,
2777 p_contra_currencies,
2778 p_quote_bases,
2779 p_interp_methods,
2780 p_data_sides,
2781 p_day_count_bases,
2782 p_interest_quote,
2783 p_currency_quote,
2784 p_spot_date, p_exp_date);
2785 p_for_spot_rate_bid := p_rates_table(1);
2786 else
2787 p_for_spot_rate_bid := 1;
2788 end if;
2789 -- get corresponding base ccy curve
2790 end if;
2791 if (p_for_spot_rate_ask IS null) then
2792 if (p_foreign_ccy <> 'USD') then
2793 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
2794 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
2795 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd);
2796 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
2797 p_rates_table := get_rates_from_curves(p_rate_types,
2798 p_curve_codes,
2799 p_base_currencies,
2800 p_contra_currencies,
2801 p_quote_bases,
2802 p_interp_methods,
2803 p_data_sides,
2804 p_day_count_bases,
2805 p_interest_quote,
2806 p_currency_quote,
2807 p_spot_date, p_exp_date);
2808 p_for_spot_rate_ask := p_rates_table(1);
2809 else
2810 p_for_spot_rate_ask := 1;
2811 end if;
2812 end if;
2813 if (p_dom_spot_rate_bid IS null) then
2814 if (p_domestic_ccy <> 'USD') then
2815 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
2816 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
2817 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_quote_usd);
2818 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
2819 p_rates_table := get_rates_from_curves(p_rate_types,
2820 p_curve_codes,
2821 p_base_currencies,
2822 p_contra_currencies,
2823 p_quote_bases,
2824 p_interp_methods,
2825 p_data_sides,
2826 p_day_count_bases,
2827 p_interest_quote,
2828 p_currency_quote,
2829 p_spot_date, p_exp_date);
2830 p_dom_spot_rate_bid := p_rates_table(1);
2831 else
2832 p_dom_spot_rate_bid := 1;
2833 end if;
2834 end if;
2835 if (p_dom_spot_rate_ask IS null) then
2836 if (p_dom_spot_rate_ask <> 'USD') then
2837 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
2838 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
2839 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_quote_usd);
2840 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
2841 p_rates_table := get_rates_from_curves(p_rate_types,
2842 p_curve_codes,
2843 p_base_currencies,
2844 p_contra_currencies,
2845 p_quote_bases,
2846 p_interp_methods,
2847 p_data_sides,
2848 p_day_count_bases,
2849 p_interest_quote,
2850 p_currency_quote,
2851 p_spot_date, p_exp_date);
2852 p_dom_spot_rate_ask := p_rates_table(1);
2853 else
2854 p_dom_spot_rate_ask := 1;
2855 end if;
2856 end if;
2857
2858 -- if INTEREST RATES are missing, first check if curve section is filled
2859 -- if so, use curve;
2860 -- else, go to base(defaults) section and default curve in curves section
2861 if (p_for_int_rate_bid IS null) then
2862 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2863 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
2864 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
2865 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_day_count);
2866 -- if curve section is null, go to defaults
2867 if (p_foreign_curve IS null) then
2871 p_base_currencies,
2868 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2869 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
2870 p_curve_codes := get_curves_from_base(p_curve_types,
2872 p_contra_currencies);
2873 -- default curves section
2874 p_foreign_curve := p_curve_codes(1);
2875 p_foreign_interpolation := p_interp_methods(1);
2876 else
2877 -- curve section not null, use curve
2878 p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_curve);
2879 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_interpolation);
2880 end if;
2881 -- calculate rate
2882 p_rates_table := get_rates_from_curves(p_rate_types,
2883 p_curve_codes,p_base_currencies,p_contra_currencies,
2884 p_quote_bases,p_interp_methods,p_data_sides,
2885 p_day_count_bases,p_interest_quote,p_currency_quote,
2886 p_spot_date,p_exp_date);
2887 p_for_int_rate_bid := p_rates_table(1);
2888 IF (g_proc_level>=g_debug_level) THEN
2889 xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'defaulted foreign bid rate',p_for_int_rate_bid);
2890 END IF;
2891 end if;
2892
2893 if (p_for_int_rate_ask IS null) then
2894 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2895 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
2896 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
2897 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_day_count);
2898 -- if curve section is null, go to defaults
2899 if (p_foreign_curve IS null) then
2900 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2901 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
2902 p_curve_codes := get_curves_from_base(p_curve_types,
2903 p_base_currencies,
2904 p_contra_currencies);
2905 -- default curves section
2906 p_foreign_curve := p_curve_codes(1);
2907 p_foreign_interpolation := p_interp_methods(1);
2908 else
2909 -- curve section not null, use curve
2910 p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_curve);
2911 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_interpolation);
2912 end if;
2913 -- calculate rate
2914 p_rates_table := get_rates_from_curves(p_rate_types,
2915 p_curve_codes,p_base_currencies,p_contra_currencies,
2916 p_quote_bases,p_interp_methods,p_data_sides,
2917 p_day_count_bases,p_interest_quote,p_currency_quote,
2918 p_spot_date,p_exp_date);
2919 p_for_int_rate_ask := p_rates_table(1);
2920 IF (g_proc_level>=g_debug_level) THEN
2921 xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'defaulted foreign ask rate',p_for_int_rate_ask);
2922 END IF;
2923 end if;
2924 if (p_dom_int_rate_bid IS null) then
2925 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2926 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
2927 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
2928 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_day_count);
2929 -- if curve section is null, go to defaults
2930 if (p_domestic_curve IS null) then
2931 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2932 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
2933 p_curve_codes := get_curves_from_base(p_curve_types,
2934 p_base_currencies,
2935 p_contra_currencies);
2936 -- default curves section
2937 p_domestic_curve := p_curve_codes(1);
2938 p_domestic_interpolation := p_interp_methods(1);
2939 else
2940 -- curve section not null, use curve
2941 p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_curve);
2942 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_interpolation);
2943 end if;
2944 -- calculate rate
2945 p_rates_table := get_rates_from_curves(p_rate_types,
2946 p_curve_codes,p_base_currencies,p_contra_currencies,
2947 p_quote_bases,p_interp_methods,p_data_sides,
2948 p_day_count_bases,p_interest_quote,p_currency_quote,
2949 p_spot_date,p_exp_date);
2950 p_dom_int_rate_bid := p_rates_table(1);
2951 IF (g_proc_level>=g_debug_level) THEN
2952 xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'defaulted domestic bid rate',p_dom_int_rate_bid);
2953 END IF;
2954 end if;
2955 if (p_dom_int_rate_ask IS null) then
2956 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2957 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
2958 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
2959 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_day_count);
2960 -- if curve section is null, go to defaults
2961 if (p_domestic_curve IS null) then
2962 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
2963 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
2964 p_curve_codes := get_curves_from_base(p_curve_types,
2965 p_base_currencies,
2966 p_contra_currencies);
2967 -- default curves section
2968 p_domestic_curve := p_curve_codes(1);
2969 p_domestic_interpolation := p_interp_methods(1);
2970 else
2971 -- curve section not null, use curve
2972 p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_curve);
2973 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_interpolation);
2974 end if;
2975 -- calculate rate
2976 p_rates_table := get_rates_from_curves(p_rate_types,
2977 p_curve_codes,p_base_currencies,p_contra_currencies,
2978 p_quote_bases,p_interp_methods,p_data_sides,
2979 p_day_count_bases,p_interest_quote,p_currency_quote,
2983 xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'defaulted domestic ask rate',p_dom_int_rate_bid);
2980 p_spot_date,p_exp_date);
2981 p_dom_int_rate_ask := p_rates_table(1);
2982 IF (g_proc_level>=g_debug_level) THEN
2984 END IF;
2985 end if;
2986
2987
2988
2989
2990 IF (g_proc_level>=g_debug_level) THEN
2991 xtr_risk_debug_pkg.dpop('fxo_calculator: ' || 'Calculation Based On Rates');
2992 END IF;
2993
2994
2995 END IF;
2996 p_day_count_bases:=SYSTEM.QRM_VARCHAR_TABLE(p_domestic_day_count, p_foreign_day_count);
2997
2998 --Interest rates needed to calculate implied volatility. Need to verify which
2999 --side we want bid and ask on.
3000
3001
3002 --Gets Spot rate
3003 if (p_domestic_ccy = 'USD') THEN
3004 p_spot_rates:=XTR_FX_FORMULAS.FX_SPOT_RATE_CV(p_domestic_ccy, p_foreign_ccy,
3005 p_dom_spot_rate_bid, p_dom_spot_rate_ask, p_for_spot_rate_bid,
3006 p_for_spot_rate_ask, 'C', p_foreign_quote_usd);
3007 elsif (p_foreign_ccy = 'USD') THEN
3008 p_spot_rates:=XTR_FX_FORMULAS.FX_SPOT_RATE_CV(p_domestic_ccy, p_foreign_ccy,
3009 p_dom_spot_rate_bid, p_dom_spot_rate_ask, p_for_spot_rate_bid,
3010 p_for_spot_rate_ask, p_domestic_quote_usd, 'C');
3011 else
3012 p_spot_rates:=XTR_FX_FORMULAS.FX_SPOT_RATE_CV(p_domestic_ccy, p_foreign_ccy,
3013 p_dom_spot_rate_bid, p_dom_spot_rate_ask, p_for_spot_rate_bid,
3014 p_for_spot_rate_ask, p_domestic_quote_usd, p_foreign_quote_usd);
3015 end if;
3016
3017
3018
3019
3020
3021
3022 if (p_implied_vol_call_put = 'BUYCALL') THEN
3023 p_interest_rates:=xtr_md_num_table(p_dom_int_rate_ask, p_for_int_rate_bid);
3024 p_spot_rate:=p_spot_rates(2);
3025 p_option_indicator:='C';
3026 elsif (p_implied_vol_call_put = 'BUYPUT') THEN
3027 p_interest_rates:=xtr_md_num_table(p_dom_int_rate_bid, p_for_int_rate_ask);
3028 p_spot_rate:=p_spot_rates(1);
3029 p_option_indicator:='P';
3030 elsif (p_implied_vol_call_put = 'SELLCALL') THEN
3031 p_interest_rates:=xtr_md_num_table(p_dom_int_rate_bid, p_for_int_rate_ask);
3032 p_spot_rate:=p_spot_rates(1);
3033 p_option_indicator:='C';
3034 elsif (p_implied_vol_call_put = 'SELLPUT') THEN
3035 p_interest_rates:=xtr_md_num_table(p_dom_int_rate_ask, p_for_int_rate_bid);
3036 p_spot_rate:=p_spot_rates(2);
3037 p_option_indicator:='P';
3038 END IF;
3039
3040 -- sets up rate type for calculate_implied_volatility ('S' for simple)
3041 p_rate_types:= SYSTEM.QRM_VARCHAR_TABLE(p_rate_type, p_rate_type);
3042
3043
3044 --Must give dummy values to compound freq
3045 p_compound_freq:=XTR_MD_NUM_TABLE(1, 1);
3046
3047
3048
3049
3050
3051 p_res_impl_vol := QRM_MM_FORMULAS.calculate_implied_volatility('FXO', p_spot_date, p_exp_date, p_interest_rates, p_day_count_bases, p_rate_types, p_compound_freq, p_spot_rate, p_strike_price, p_implied_vol_price, p_option_indicator, null, null);
3052
3053
3054
3055 p_vol_ask:=p_res_impl_vol;
3056 p_vol_bid:=p_res_impl_vol;
3057
3058
3059 p_volatility:= p_res_impl_vol;
3060
3061 ELSIF (p_calc_type_indicator = 'P') THEN
3062 --Default Curve Data
3063 IF (p_indicator = 'D') THEN
3064
3065 IF (g_proc_level>=g_debug_level) THEN
3066 xtr_risk_debug_pkg.dpush('fxo_calculator: ' || 'Calculation Based On Defaults');
3067 END IF;
3068
3069 p_volatility_curve:='';
3070 --Only want to set volatility curve if volatility has not been input
3071 if (p_volatility IS null) THEN
3072 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD','YIELD', 'FXVOL');
3073 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy,p_domestic_ccy, p_foreign_ccy);
3074 p_contra_currencies:= SYSTEM.QRM_VARCHAR_TABLE(null, null, p_domestic_ccy);
3075 p_interp_methods:= SYSTEM.QRM_VARCHAR_TABLE('DEFAULT','DEFAULT', 'DEFAULT');
3076 p_curve_codes := get_curves_from_base(p_curve_types,p_base_currencies,
3077 p_contra_currencies);
3078
3079 p_foreign_curve := p_curve_codes(1);
3080 p_domestic_curve := p_curve_codes(2);
3081 p_volatility_curve := p_curve_codes(3);
3082 else
3083 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD','YIELD');
3084 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy,p_domestic_ccy);
3085 p_contra_currencies:= SYSTEM.QRM_VARCHAR_TABLE(null, null);
3086 p_interp_methods:= SYSTEM.QRM_VARCHAR_TABLE('DEFAULT','DEFAULT');
3087 p_curve_codes := get_curves_from_base(p_curve_types,p_base_currencies,
3088 p_contra_currencies);
3089
3090 p_foreign_curve := p_curve_codes(1);
3091 p_domestic_curve := p_curve_codes(2);
3092 end if;
3093
3094
3095 IF (g_proc_level>=g_debug_level) THEN
3096 xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'foreign curve', p_foreign_curve);
3097 xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'domestic curve', p_domestic_curve);
3098 xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'volatility curve', p_volatility_curve);
3099 END IF;
3100
3101 -- since 'Calculate Using Defaults' was pressed, use default interpol.
3102 p_foreign_interpolation := 'DEFAULT';
3103 p_domestic_interpolation := 'DEFAULT';
3104 p_volatility_interpolation:= 'DEFAULT';
3105
3106 -- assume interest rate quote to be bid/ask;
3107 p_interest_quote := 'BID/ASK';
3108
3109 -- calculate Rates
3110 -- this follows the calculator table across each row
3111 -- first do Spot Rates
3115
3112 p_quote_bases:=GET_SPOT_QUOTATION_BASIS(p_foreign_ccy, p_domestic_ccy, p_ow_spot_rates);
3113 p_foreign_quote_usd:= p_quote_bases(1);
3114 p_domestic_quote_usd:= p_quote_bases(2);
3116 if (p_foreign_ccy = 'USD' AND p_domestic_ccy <> 'USD') then
3117 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
3118 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy, p_domestic_ccy);
3119 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_quote_usd,
3120 p_domestic_quote_usd);
3121 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
3122 p_interp_methods:=SYSTEM.QRM_VARCHAR_TABLE('DEFAULT', 'DEFAULT');
3123 p_contra_currencies:=SYSTEM.QRM_VARCHAR_TABLE(null, null);
3124 elsif (p_domestic_ccy = 'USD' AND p_foreign_ccy <> 'USD') then
3125 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
3126 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy, p_foreign_ccy);
3127 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd,p_foreign_quote_usd);
3128 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
3129 p_interp_methods:=SYSTEM.QRM_VARCHAR_TABLE('DEFAULT', 'DEFAULT');
3130 p_contra_currencies:=SYSTEM.QRM_VARCHAR_TABLE(null, null);
3131 elsif (p_foreign_ccy <> 'USD' AND p_domestic_ccy <> 'USD') then
3132 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT','SPOT','SPOT');
3133 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy,p_foreign_ccy,
3134 p_domestic_ccy, p_domestic_ccy);
3135 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd, p_foreign_quote_usd,
3136 p_domestic_quote_usd,p_domestic_quote_usd);
3137 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
3138 p_interp_methods:=SYSTEM.QRM_VARCHAR_TABLE('DEFAULT', 'DEFAULT', 'DEFAULT', 'DEFAULT');
3139 p_contra_currencies:=SYSTEM.QRM_VARCHAR_TABLE(null, null, null, null);
3140 end if;
3141
3142
3143 p_rates_table := get_rates_from_base(p_rate_types, p_base_currencies,
3144 p_contra_currencies, p_quote_bases,
3145 p_interp_methods, p_data_sides,
3146 p_day_count_bases,p_interest_quote,
3147 p_currency_quote,p_spot_date,
3148 p_exp_date);
3149
3150 if (p_foreign_ccy = 'USD' AND p_domestic_ccy <> 'USD') then
3151 p_for_spot_rate_bid := 1;
3152 p_for_spot_rate_ask := 1;
3153 p_dom_spot_rate_bid := p_rates_table(1);
3154 p_dom_spot_rate_ask := p_rates_table(2);
3155 elsif (p_domestic_ccy = 'USD' AND p_foreign_ccy <> 'USD') then
3156 p_for_spot_rate_bid := p_rates_table(1);
3157 p_for_spot_rate_ask := p_rates_table(2);
3158 p_dom_spot_rate_bid := 1;
3159 p_dom_spot_rate_ask := 1;
3160 elsif (p_neither_usd) then
3161 p_for_spot_rate_bid := p_rates_table(1);
3162 p_for_spot_rate_ask := p_rates_table(2);
3163 p_dom_spot_rate_bid := p_rates_table(3);
3164 p_dom_spot_rate_ask := p_rates_table(4);
3165 end if;
3166
3167
3168
3169
3170 -- now do Interest Rates
3171 p_rate_types.delete;
3172 p_base_currencies.delete;
3173 p_data_sides.delete;
3174 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT','DEFAULT',
3175 'DEFAULT','DEFAULT');
3176 p_quote_bases := null;
3177 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD','YIELD','YIELD','YIELD');
3178 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy, p_foreign_ccy,
3179 p_domestic_ccy, p_domestic_ccy);
3180 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
3181 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE('ACTUAL365',
3182 'ACTUAL365', 'ACTUAL365', 'ACTUAL365');
3183
3184 p_contra_currencies:=SYSTEM.QRM_VARCHAR_TABLE(null, null, null, null);
3185
3186 --Call to get interest rates
3187 p_rates_table := get_rates_from_base(p_rate_types, p_base_currencies,
3188 p_contra_currencies, p_quote_bases,
3189 p_interp_methods, p_data_sides,
3190 p_day_count_bases,p_interest_quote,
3191 p_currency_quote,p_spot_date,
3192 p_exp_date);
3193 p_for_int_rate_bid := p_rates_table(1);
3194 p_for_int_rate_ask := p_rates_table(2);
3195 p_dom_int_rate_bid := p_rates_table(3);
3196 p_dom_int_rate_ask := p_rates_table(4);
3197
3198
3199
3200 --Call to get implied volatility from curve if needed
3201 if (p_volatility IS null) THEN
3202 p_rate_types.delete;
3203 p_base_currencies.delete;
3204 p_data_sides.delete;
3205 p_contra_currencies.delete;
3206 p_interp_methods:= SYSTEM.QRM_VARCHAR_TABLE('DEFAULT','DEFAULT');
3207 p_rate_types:=SYSTEM.QRM_VARCHAR_TABLE('FXVOL', 'FXVOL');
3208 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy, p_foreign_ccy);
3209 p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy, p_domestic_ccy);
3210 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID', 'ASK');
3211 p_day_count_bases:=SYSTEM.QRM_VARCHAR_TABLE('ACTUAL365',
3212 'ACTUAL365');
3213
3214
3215 --Call to get volatility values
3216 p_rates_table := get_rates_from_base(p_rate_types, p_base_currencies,
3217 p_contra_currencies, p_quote_bases,
3218 p_interp_methods, p_data_sides,
3219 p_day_count_bases,p_interest_quote,
3220 p_currency_quote,p_spot_date,
3221 p_exp_date);
3222 p_vol_bid:= p_rates_table(1);
3223 p_volatility:=p_rates_table(1);
3224 p_vol_ask:= p_rates_table(2);
3225
3226 else
3227 p_vol_bid:=p_volatility;
3228 p_vol_ask:=p_volatility;
3229 end if;
3230
3231 --Values set to be passed back as default used
3232 p_domestic_day_count:='ACTUAL365';
3233 p_foreign_day_count:='ACTUAL365';
3234
3235
3236 IF (g_proc_level>=g_debug_level) THEN
3240
3237 xtr_risk_debug_pkg.dpop('fxo_calculator: ' || 'Calculation Based On Defaults');
3238 END IF;
3239
3241
3242
3243
3244
3245
3246
3247
3248 --Optional Curve Data
3249 ELSIF (p_indicator = 'C') THEN
3250 IF (g_proc_level>=g_debug_level) THEN
3251 xtr_risk_debug_pkg.dpush('fxo_calculator: ' || 'Calculation Based On Curves');
3252 END IF;
3253 -- GET DEFAULT CURVES
3254
3255 --need dummy table of contra currencies
3256 p_contra_currencies:= SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3257 --If all curves are not input, defaults are gotten
3258 if (p_foreign_curve IS null) then
3259 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
3260 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
3261 p_curve_codes := get_curves_from_base(p_curve_types,
3262 p_base_currencies,
3263 p_contra_currencies);
3264 p_foreign_curve := p_curve_codes(1);
3265 end if;
3266 if (p_domestic_curve IS null) then
3267 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
3268 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
3269 p_curve_codes := get_curves_from_base(p_curve_types,
3270 p_base_currencies,
3271 p_contra_currencies);
3272 p_domestic_curve := p_curve_codes(1);
3273 end if;
3274 if (p_volatility_curve IS null AND p_volatility IS null) then
3275 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('FXVOL');
3276 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
3277 p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
3278 p_curve_codes := get_curves_from_base(p_curve_types,
3279 p_base_currencies,
3280 p_contra_currencies);
3281 p_volatility_curve := p_curve_codes(1);
3282
3283 end if;
3284
3285 -- GET DEFAULT RATES based on CURVES
3286 -- first do SPOT RATES
3287 p_quote_bases:=GET_SPOT_QUOTATION_BASIS(p_foreign_ccy, p_domestic_ccy, p_ow_spot_rates);
3288 p_foreign_quote_usd:= p_quote_bases(1);
3289 p_domestic_quote_usd:= p_quote_bases(2);
3290
3291
3292 --curve codes are null on spot rates
3293 p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE('DUMMY', 'DUMMY');
3294 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE('DUMMY', 'DUMMY');
3295 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT', 'DEFAULT');
3296 p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE('DUMMY', 'DUMMY');
3297 -- calculate Rates
3298 -- this follows the calculator table across each row
3299 -- first do Spot Rates
3300 if (p_foreign_ccy = 'USD' AND p_domestic_ccy <> 'USD') then
3301 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
3302 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy, p_domestic_ccy);
3303 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_quote_usd,
3304 p_domestic_quote_usd);
3305 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
3306 elsif (p_domestic_ccy = 'USD' AND p_foreign_ccy <> 'USD') then
3307 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT');
3308 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy, p_foreign_ccy);
3309 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd,p_foreign_quote_usd);
3310 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK');
3311 elsif (p_foreign_ccy <> 'USD' AND p_domestic_ccy <> 'USD') then
3312 p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE('DUMMY', 'DUMMY', 'DUMMY', 'DUMMY');
3313 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT','SPOT','SPOT','SPOT');
3314 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy,p_foreign_ccy,
3315 p_domestic_ccy, p_domestic_ccy);
3316 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd, p_foreign_quote_usd,
3317 p_domestic_quote_usd,p_domestic_quote_usd);
3318 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
3319 p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE('DUMMY', 'DUMMY', 'DUMMY', 'DUMMY');
3320 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE('DUMMY', 'DUMMY', 'DUMMY', 'DUMMY');
3321 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT', 'DEFAULT', 'DEFAULT', 'DEFAULT');
3322 end if;
3323
3324
3325 --Gets spot rates
3326 p_rates_table := get_rates_from_curves(p_rate_types, p_curve_codes, p_base_currencies,
3327 p_contra_currencies, p_quote_bases,
3328 p_interp_methods, p_data_sides,
3329 p_day_count_bases,p_interest_quote,
3330 p_currency_quote,p_spot_date,
3331 p_exp_date);
3332
3333 if (p_foreign_ccy = 'USD' AND p_domestic_ccy <> 'USD') then
3334 p_for_spot_rate_bid := 1;
3335 p_for_spot_rate_ask := 1;
3336 p_dom_spot_rate_bid := p_rates_table(1);
3337 p_dom_spot_rate_ask := p_rates_table(2);
3338 elsif (p_domestic_ccy = 'USD' AND p_foreign_ccy <> 'USD') then
3339 p_for_spot_rate_bid := p_rates_table(1);
3340 p_for_spot_rate_ask := p_rates_table(2);
3341 p_dom_spot_rate_bid := 1;
3342 p_dom_spot_rate_ask := 1;
3343 elsif (p_neither_usd) then
3344 p_for_spot_rate_bid := p_rates_table(1);
3345 p_for_spot_rate_ask := p_rates_table(2);
3346 p_dom_spot_rate_bid := p_rates_table(3);
3347 p_dom_spot_rate_ask := p_rates_table(4);
3348 end if;
3349
3350
3351
3352
3353 -- now get INTEREST RATES
3354 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD','YIELD','YIELD','YIELD');
3355 p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_curve,p_foreign_curve,
3356 p_domestic_curve,p_domestic_curve);
3357 p_base_currencies.delete;
3358 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy,p_foreign_ccy,
3359 p_domestic_ccy,p_domestic_ccy);
3363 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID','ASK','BID','ASK');
3360 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_interpolation,
3361 p_foreign_interpolation, p_domestic_interpolation, p_domestic_interpolation);
3362
3364 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE('ACTUAL365',
3365 'ACTUAL365','ACTUAL365','ACTUAL365');
3366 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE('DUMMY', 'DUMMY', 'DUMMY', 'DUMMY');
3367 p_contra_currencies:=SYSTEM.QRM_VARCHAR_TABLE('DUMMY', 'DUMMY', 'DUMMY', 'DUMMY');
3368
3369 p_rates_table := get_rates_from_curves(p_rate_types,p_curve_codes,
3370 p_base_currencies,
3371 p_contra_currencies,
3372 p_quote_bases,p_interp_methods,
3373 p_data_sides,p_day_count_bases,
3374 p_interest_quote,p_currency_quote,
3375 p_spot_date,
3376 p_exp_date);
3377 p_for_int_rate_bid := p_rates_table(1);
3378 p_for_int_rate_ask := p_rates_table(2);
3379 p_dom_int_rate_bid := p_rates_table(3);
3380 p_dom_int_rate_ask := p_rates_table(4);
3381
3382
3383 --Call to get implied volatility from curve if needed
3384 if (p_volatility_curve IS null) THEN
3385 p_vol_bid:=p_volatility;
3386 p_vol_ask:=p_volatility;
3387
3388
3389 else
3390
3391 p_rate_types.delete;
3392 p_base_currencies.delete;
3393 p_data_sides.delete;
3394 p_contra_currencies.delete;
3395 p_interp_methods:= SYSTEM.QRM_VARCHAR_TABLE('DEFAULT','DEFAULT');
3396 p_rate_types:=SYSTEM.QRM_VARCHAR_TABLE('FXVOL', 'FXVOL');
3397 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy, p_foreign_ccy);
3398 p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy, p_domestic_ccy);
3399 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID', 'ASK');
3400 p_day_count_bases:=SYSTEM.QRM_VARCHAR_TABLE('30/360', '30/360');
3401 p_curve_codes:=SYSTEM.QRM_VARCHAR_TABLE(p_volatility_curve, p_volatility_curve);
3402 p_quote_bases:= SYSTEM.QRM_VARCHAR_TABLE('DUMMY', 'DUMMY');
3403
3404 --Call to get volatility values
3405 p_rates_table := get_rates_from_curves(p_rate_types, p_curve_codes,
3406 p_base_currencies,
3407 p_contra_currencies, p_quote_bases,
3408 p_interp_methods, p_data_sides,
3409 p_day_count_bases,p_interest_quote,
3410 p_currency_quote,p_spot_date,
3411 p_exp_date);
3412 p_vol_bid:= p_rates_table(1);
3413 p_volatility:=p_rates_table(1);
3414 p_vol_ask:= p_rates_table(2);
3415 end if;
3416
3417 --Values set to be passed back as default used
3418 p_domestic_day_count:='ACTUAL365';
3419 p_foreign_day_count:='ACTUAL365';
3420
3421
3422 IF (g_proc_level>=g_debug_level) THEN
3423 xtr_risk_debug_pkg.dpop('fxo_calculator: ' || 'Calculation Based On Curves');
3424 END IF;
3425
3426
3427
3428
3429
3430 --Optional Rates Data
3431 ELSIF (p_indicator = 'R') THEN
3432 IF (g_proc_level>=g_debug_level) THEN
3433 xtr_risk_debug_pkg.dpush('fxo_calculator: ' || 'Calculation Based On Rates');
3434 END IF;
3435 -- if a spot rate is missing, go to base(defaults) section
3436 p_curve_codes:=SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3437 p_contra_currencies:=SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3438 p_interp_methods:=SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3439 if (p_for_spot_rate_bid IS null) then
3440 if (p_foreign_ccy <> 'USD') then
3441 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
3442 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
3443 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd);
3444 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
3445 p_rates_table := get_rates_from_curves(p_rate_types,
3446 p_curve_codes,
3447 p_base_currencies,
3448 p_contra_currencies,
3449 p_quote_bases,
3450 p_interp_methods,
3451 p_data_sides,
3452 p_day_count_bases,
3453 p_interest_quote,
3454 p_currency_quote,
3455 p_spot_date, p_exp_date);
3456 p_for_spot_rate_bid := p_rates_table(1);
3457 else
3458 p_for_spot_rate_bid := 1;
3459 end if;
3460 -- get corresponding base ccy curve
3461 end if;
3462 if (p_for_spot_rate_ask IS null) then
3463 if (p_foreign_ccy <> 'USD') then
3464 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
3465 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
3466 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd);
3467 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
3468 p_rates_table := get_rates_from_curves(p_rate_types,
3469 p_curve_codes,
3470 p_base_currencies,
3471 p_contra_currencies,
3472 p_quote_bases,
3473 p_interp_methods,
3474 p_data_sides,
3475 p_day_count_bases,
3476 p_interest_quote,
3477 p_currency_quote,
3478 p_spot_date, p_exp_date);
3479 p_for_spot_rate_ask := p_rates_table(1);
3480 else
3481 p_for_spot_rate_ask := 1;
3482 end if;
3483 end if;
3484 if (p_dom_spot_rate_bid IS null) then
3485 if (p_domestic_ccy <> 'USD') then
3486 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
3487 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
3488 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_quote_usd);
3489 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
3490 p_rates_table := get_rates_from_curves(p_rate_types,
3491 p_curve_codes,
3492 p_base_currencies,
3493 p_contra_currencies,
3497 p_day_count_bases,
3494 p_quote_bases,
3495 p_interp_methods,
3496 p_data_sides,
3498 p_interest_quote,
3499 p_currency_quote,
3500 p_spot_date, p_exp_date);
3501 p_dom_spot_rate_bid := p_rates_table(1);
3502 else
3503 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
3504 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
3505 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd);
3506 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
3507 p_dom_spot_rate_bid := 1;
3508 end if;
3509 end if;
3510 if (p_dom_spot_rate_ask IS null) then
3511 if (p_domestic_ccy <> 'USD') then
3512 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
3513 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
3514 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_quote_usd);
3515 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
3516 p_rates_table := get_rates_from_curves(p_rate_types,
3517 p_curve_codes,
3518 p_base_currencies,
3519 p_contra_currencies,
3520 p_quote_bases,
3521 p_interp_methods,
3522 p_data_sides,
3523 p_day_count_bases,
3524 p_interest_quote,
3525 p_currency_quote,
3526 p_spot_date, p_exp_date);
3527 p_dom_spot_rate_ask := p_rates_table(1);
3528 else
3529 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('SPOT');
3530 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
3531 p_quote_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_quote_usd);
3532 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
3533 p_dom_spot_rate_ask := 1;
3534 end if;
3535 end if;
3536
3537 -- if INTEREST RATES are missing, first check if curve section is filled
3538 -- if so, use curve;
3539 -- else, go to base(defaults) section and default curve in curves section
3540 if (p_for_int_rate_bid IS null) then
3541 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
3542 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
3543 p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3544 p_quote_bases:= SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3545 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
3546 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_day_count);
3547 -- if curve section is null, go to defaults
3548 if (p_foreign_curve IS null) then
3549 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
3550 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
3551 p_curve_codes := get_curves_from_base(p_curve_types,
3552 p_base_currencies,
3553 p_contra_currencies);
3554 -- default curves section
3555 p_foreign_curve := p_curve_codes(1);
3556 p_foreign_interpolation := p_interp_methods(1);
3557 else
3558 -- curve section not null, use curve
3559 p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_curve);
3560 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_interpolation);
3561 end if;
3562 -- calculate rate
3563 p_rates_table := get_rates_from_curves(p_rate_types,
3564 p_curve_codes,p_base_currencies,p_contra_currencies,
3565 p_quote_bases,p_interp_methods,p_data_sides,
3566 p_day_count_bases,p_interest_quote,p_currency_quote,
3567 p_spot_date,p_exp_date);
3568 p_for_int_rate_bid := p_rates_table(1);
3569 IF (g_proc_level>=g_debug_level) THEN
3570 xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'defaulted foreign bid rate',p_for_int_rate_bid);
3571 END IF;
3572 end if;
3573
3574 if (p_for_int_rate_ask IS null) then
3575 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
3576 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
3577 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
3578 p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3579 p_quote_bases:= SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3580 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_day_count);
3581 -- if curve section is null, go to defaults
3582 if (p_foreign_curve IS null) then
3583 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
3584 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
3585 p_curve_codes := get_curves_from_base(p_curve_types,
3586 p_base_currencies,
3587 p_contra_currencies);
3588 -- default curves section
3589 p_foreign_curve := p_curve_codes(1);
3590 p_foreign_interpolation := p_interp_methods(1);
3591 else
3592 -- curve section not null, use curve
3593 p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_curve);
3594 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_interpolation);
3595 end if;
3596 -- calculate rate
3597 p_rates_table := get_rates_from_curves(p_rate_types,
3598 p_curve_codes,p_base_currencies,p_contra_currencies,
3599 p_quote_bases,p_interp_methods,p_data_sides,
3600 p_day_count_bases,p_interest_quote,p_currency_quote,
3601 p_spot_date,p_exp_date);
3602 p_for_int_rate_ask := p_rates_table(1);
3603 IF (g_proc_level>=g_debug_level) THEN
3604 xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'defaulted foreign ask rate',p_for_int_rate_ask);
3605 END IF;
3606 end if;
3607 if (p_dom_int_rate_bid IS null) then
3608 p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3609 p_quote_bases:= SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3610 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
3611 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
3615 if (p_domestic_curve IS null) then
3612 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID');
3613 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_day_count);
3614 -- if curve section is null, go to defaults
3616 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
3617 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
3618 p_curve_codes := get_curves_from_base(p_curve_types,
3619 p_base_currencies,
3620 p_contra_currencies);
3621 -- default curves section
3622 p_domestic_curve := p_curve_codes(1);
3623 p_domestic_interpolation := p_interp_methods(1);
3624 else
3625 -- curve section not null, use curve
3626 p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_curve);
3627 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_interpolation);
3628 end if;
3629 -- calculate rate
3630 p_rates_table := get_rates_from_curves(p_rate_types,
3631 p_curve_codes,p_base_currencies,p_contra_currencies,
3632 p_quote_bases,p_interp_methods,p_data_sides,
3633 p_day_count_bases,p_interest_quote,p_currency_quote,
3634 p_spot_date,p_exp_date);
3635 p_dom_int_rate_bid := p_rates_table(1);
3636 IF (g_proc_level>=g_debug_level) THEN
3637 xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'defaulted domestic bid rate',p_dom_int_rate_bid);
3638 END IF;
3639 end if;
3640 if (p_dom_int_rate_ask IS null) then
3641 p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3642 p_quote_bases:= SYSTEM.QRM_VARCHAR_TABLE('DUMMY');
3643 p_rate_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
3644 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
3645 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('ASK');
3646 p_day_count_bases := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_day_count);
3647 -- if curve section is null, go to defaults
3648 if (p_domestic_curve IS null) then
3649 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('YIELD');
3650 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE('DEFAULT');
3651 p_curve_codes := get_curves_from_base(p_curve_types,
3652 p_base_currencies,
3653 p_contra_currencies);
3654 -- default curves section
3655 p_domestic_curve := p_curve_codes(1);
3656 p_domestic_interpolation := p_interp_methods(1);
3657 else
3658 -- curve section not null, use curve
3659 p_curve_codes := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_curve);
3660 p_interp_methods := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_interpolation);
3661 end if;
3662 -- calculate rate
3663 p_rates_table := get_rates_from_curves(p_rate_types,
3664 p_curve_codes,p_base_currencies,p_contra_currencies,
3665 p_quote_bases,p_interp_methods,p_data_sides,
3666 p_day_count_bases,p_interest_quote,p_currency_quote,
3667 p_spot_date,p_exp_date);
3668 p_dom_int_rate_ask := p_rates_table(1);
3669 IF (g_proc_level>=g_debug_level) THEN
3670 xtr_risk_debug_pkg.dlog('fxo_calculator: ' || 'defaulted domestic ask rate',p_dom_int_rate_bid);
3671 END IF;
3672 end if;
3673
3674 if (p_vol_bid IS null OR p_vol_ask IS null) THEN
3675
3676 if (p_volatility_curve IS null) THEN
3677 if (p_volatility IS null) THEN
3678 p_curve_types := SYSTEM.QRM_VARCHAR_TABLE('FXVOL');
3679 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy);
3680 p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy);
3681 p_curve_codes := get_curves_from_base(p_curve_types,
3682 p_base_currencies,
3683 p_contra_currencies);
3684 p_volatility_curve := p_curve_codes(1);
3685
3686
3687 else
3688
3689 if (p_vol_bid IS null) THEN
3690 p_vol_bid:=p_volatility;
3691 end if;
3692 if (p_vol_ask IS null) THEN
3693 p_vol_ask:=p_volatility;
3694 end if;
3695 end if;
3696
3697 end if;
3698 if (p_volatility_curve IS NOT null) THEN
3699 p_interp_methods:= SYSTEM.QRM_VARCHAR_TABLE('DEFAULT','DEFAULT');
3700 p_rate_types:=SYSTEM.QRM_VARCHAR_TABLE('FXVOL', 'FXVOL');
3701 p_base_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_foreign_ccy, p_foreign_ccy);
3702 p_contra_currencies := SYSTEM.QRM_VARCHAR_TABLE(p_domestic_ccy, p_domestic_ccy);
3703 p_quote_bases:= SYSTEM.QRM_VARCHAR_TABLE('DUMMY', 'DUMMY');
3704 p_data_sides := SYSTEM.QRM_VARCHAR_TABLE('BID', 'ASK');
3705 p_day_count_bases:=SYSTEM.QRM_VARCHAR_TABLE('30/360', '30/360');
3706 p_curve_codes:=SYSTEM.QRM_VARCHAR_TABLE(p_volatility_curve, p_volatility_curve);
3707
3708 --Call to get volatility values
3709 p_rates_table := get_rates_from_curves(p_rate_types, p_curve_codes,
3710 p_base_currencies,
3711 p_contra_currencies, p_quote_bases,
3712 p_interp_methods, p_data_sides,
3713 p_day_count_bases,p_interest_quote,
3714 p_currency_quote,p_spot_date,
3715 p_exp_date);
3716
3717 if (p_vol_bid IS null) THEN
3718 p_vol_bid:= p_rates_table(1);
3719 end if;
3720 if (p_vol_ask IS null) THEN
3721 p_vol_ask:= p_rates_table(2);
3722 end if;
3723 p_volatility:=p_rates_table(1);
3724 end if;
3725 else
3726 p_volatility:=p_vol_bid;
3727
3728 end if;
3729 IF (g_proc_level>=g_debug_level) THEN
3730 xtr_risk_debug_pkg.dpop('fxo_calculator: ' || 'Calculation Based On Rates');
3731 END IF;
3732
3733 END IF;
3734
3735
3736
3737
3738
3739 --Gets Spot rate
3740 if (p_domestic_ccy = 'USD') THEN
3741 p_spot_rates:=XTR_FX_FORMULAS.FX_SPOT_RATE_CV(p_domestic_ccy, p_foreign_ccy,
3742 p_dom_spot_rate_bid, p_dom_spot_rate_ask, p_for_spot_rate_bid,
3743 p_for_spot_rate_ask, 'C', p_foreign_quote_usd);
3744 elsif (p_foreign_ccy = 'USD') THEN
3745 p_spot_rates:=XTR_FX_FORMULAS.FX_SPOT_RATE_CV(p_domestic_ccy, p_foreign_ccy,
3746 p_dom_spot_rate_bid, p_dom_spot_rate_ask, p_for_spot_rate_bid,
3747 p_for_spot_rate_ask, p_domestic_quote_usd, 'C');
3748 else
3749 p_spot_rates:=XTR_FX_FORMULAS.FX_SPOT_RATE_CV(p_domestic_ccy, p_foreign_ccy,
3750 p_dom_spot_rate_bid, p_dom_spot_rate_ask, p_for_spot_rate_bid,
3751 p_for_spot_rate_ask, p_domestic_quote_usd, p_foreign_quote_usd);
3752 end if;
3753
3754
3755
3756 fx_option_price_in.p_SPOT_DATE:= p_spot_date;
3757 fx_option_price_in.p_MATURITY_DATE := p_exp_date;
3758 fx_option_price_in.p_RATE_DOM:=p_dom_int_rate_bid;
3759 fx_option_price_in.p_RATE_TYPE_DOM:=p_rate_type;
3760 fx_option_price_in.p_COMPOUND_FREQ_DOM:= 1;
3761 fx_option_price_in.p_DAY_COUNT_BASIS_DOM:=p_domestic_day_count;
3762 fx_option_price_in.p_RATE_FOR:=p_for_int_rate_ask;
3763 fx_option_price_in.p_RATE_TYPE_FOR:=p_rate_type;
3764 fx_option_price_in.p_COMPOUND_FREQ_FOR:= 1;
3765 fx_option_price_in.p_DAY_COUNT_BASIS_FOR:=p_foreign_day_count;
3766 fx_option_price_in.p_SPOT_RATE:=p_spot_rates(1);
3767 fx_option_price_in.p_STRIKE_RATE:=p_strike_price;
3768 fx_option_price_in.p_VOLATILITY:= p_vol_bid;
3769
3770
3771
3772
3773
3774
3775
3776 XTR_FX_FORMULAS.FX_GK_OPTION_PRICE_CV(fx_option_price_in, fx_option_price_out);
3777 p_res_call_bid:=fx_option_price_out.p_CALL_PRICE;
3778 p_res_fxforward_bid:=fx_option_price_out.p_FX_FWD_RATE;
3779
3780
3781 fx_option_price_in.p_SPOT_RATE:=p_spot_rates(2);
3782 fx_option_price_in.p_RATE_DOM:=p_dom_int_rate_ask;
3783 fx_option_price_in.p_RATE_FOR:=p_for_int_rate_bid;
3784 XTR_FX_FORMULAS.FX_GK_OPTION_PRICE_CV(fx_option_price_in, fx_option_price_out);
3785 p_res_put_bid:=fx_option_price_out.p_PUT_PRICE;
3786
3787
3788
3789
3790
3791
3792 /* need to find what bid/ask sides are needed to calculate different prices */
3793 fx_option_price_in.p_volatility:= p_vol_ask;
3794 XTR_FX_FORMULAS.FX_GK_OPTION_PRICE_CV(fx_option_price_in, fx_option_price_out);
3795 p_res_call_ask:=fx_option_price_out.p_CALL_PRICE;
3796 p_res_fxforward_ask:=fx_option_price_out.p_FX_FWD_RATE;
3797
3798 fx_option_price_in.p_SPOT_RATE:=p_spot_rates(1);
3799 fx_option_price_in.p_RATE_DOM:=p_dom_int_rate_bid;
3800 fx_option_price_in.p_RATE_FOR:=p_for_int_rate_ask;
3801 XTR_FX_FORMULAS.FX_GK_OPTION_PRICE_CV(fx_option_price_in, fx_option_price_out);
3802 p_res_put_ask:=fx_option_price_out.p_PUT_PRICE;
3803
3804
3805
3806
3807
3808 if (p_foreign_ccy_amt IS null) THEN
3809 p_foreign_ccy_amt:=1;
3810 end if;
3811
3812 p_res_call_fair_value_bid:=p_res_call_bid*p_foreign_ccy_amt;
3813 p_res_call_fair_value_ask:=p_res_call_ask*p_foreign_ccy_amt;
3814 p_res_put_fair_value_bid:=p_res_put_bid*p_foreign_ccy_amt;
3815 p_res_put_fair_value_ask:=p_res_put_ask*p_foreign_ccy_amt;
3816
3817 --Get number of days for sensitivities function
3818 --p_days := p_exp_date- p_spot_date;
3819 XTR_CALC_P.calc_days_run_c(p_spot_date,p_exp_date,p_foreign_day_count,
3820 null,p_days,p_years);
3821 --Gets number of years
3822 p_years:=p_days/p_years;
3823
3824
3825
3826 --Must convert interest rates into continuous for sensitivities calculations
3827
3828 if (p_rate_type = 'P') THEN
3829 XTR_RATE_CONVERSION.COMPOUND_TO_CONTINUOUS_RATE(
3830 p_for_int_rate_bid, 1, p_for_cint_rate_bid);
3831 XTR_RATE_CONVERSION.COMPOUND_TO_CONTINUOUS_RATE(
3832 p_for_int_rate_ask, 1, p_for_cint_rate_ask);
3833 XTR_RATE_CONVERSION.COMPOUND_TO_CONTINUOUS_RATE(
3834 p_dom_int_rate_bid, 1, p_dom_cint_rate_bid);
3835 XTR_RATE_CONVERSION.COMPOUND_TO_CONTINUOUS_RATE(
3836 p_dom_int_rate_ask, 1, p_dom_cint_rate_ask);
3837 ELSE
3838 XTR_RATE_CONVERSION.SIMPLE_TO_CONTINUOUS_RATE(
3839 p_for_int_rate_bid, p_years, p_for_cint_rate_bid);
3840 XTR_RATE_CONVERSION.SIMPLE_TO_CONTINUOUS_RATE(
3841 p_for_int_rate_ask, p_years, p_for_cint_rate_ask);
3842 XTR_RATE_CONVERSION.SIMPLE_TO_CONTINUOUS_RATE(
3843 p_dom_int_rate_bid, p_years, p_dom_cint_rate_bid);
3844 XTR_RATE_CONVERSION.SIMPLE_TO_CONTINUOUS_RATE(
3845 p_dom_int_rate_ask, p_years, p_dom_cint_rate_ask);
3846 END IF;
3847
3848
3849
3850 QRM_FX_FORMULAS.FX_GK_OPTION_SENS(p_days, p_for_cint_rate_bid, p_dom_cint_rate_bid,
3851 p_spot_rates(1), p_strike_price, p_vol_bid,
3852 p_res_delta_call_bid, p_res_delta_put_bid,
3853 p_res_theta_call_bid, p_res_theta_put_bid,
3854 p_res_rho_dom_call_bid, p_res_rho_dom_put_bid,
3855 p_res_rho_for_call_bid, p_res_rho_for_put_bid,
3856 p_res_gamma_bid, p_res_vega_bid);
3857
3858 QRM_FX_FORMULAS.FX_GK_OPTION_SENS(p_days, p_for_cint_rate_ask, p_dom_cint_rate_ask,
3859 p_spot_rates(2), p_strike_price, p_vol_ask,
3860 p_res_delta_call_ask, p_res_delta_put_ask,
3861 p_res_theta_call_ask, p_res_theta_put_ask,
3862 p_res_rho_dom_call_ask, p_res_rho_dom_put_ask,
3863 p_res_rho_for_call_ask, p_res_rho_for_put_ask,
3864 p_res_gamma_ask, p_res_vega_ask);
3865
3866
3867
3868
3869
3870
3871 END IF;
3872 p_varchar_args(5):= p_interest_quote;
3873 p_varchar_args(6):= p_foreign_curve;
3874 p_varchar_args(7):= p_domestic_curve;
3875 p_varchar_args(8):= p_volatility_curve;
3876 p_varchar_args(9):=p_foreign_interpolation;
3877 p_varchar_args(10):= p_domestic_interpolation;
3878 p_varchar_args(11):=p_volatility_interpolation;
3879 p_varchar_args(12):=p_foreign_quote_usd;
3880 p_varchar_args(13):=p_domestic_quote_usd;
3881 p_varchar_args(14):=p_foreign_day_count;
3882 p_varchar_args(15):=p_domestic_day_count;
3883 p_num_args(1):=p_implied_vol_price;
3884 p_num_args(2):=p_foreign_ccy_amt;
3885 p_num_args(3):=p_strike_price;
3886 p_num_args(4):=p_volatility;
3887 p_num_args(5):=p_for_spot_rate_bid;
3888 p_num_args(6):=p_for_spot_rate_ask;
3889 p_num_args(7):=p_dom_spot_rate_bid;
3890 p_num_args(8):=p_dom_spot_rate_ask;
3891 p_num_args(9):=p_for_int_rate_bid;
3892 p_num_args(10):=p_for_int_rate_ask;
3893 p_num_args(11):=p_dom_int_rate_bid;
3894 p_num_args(12):=p_dom_int_rate_ask;
3895 p_num_args(13):=p_vol_bid;
3896 p_num_args(14):=p_vol_ask;
3897 p_num_args(15):=p_res_impl_vol;
3898
3899
3900 p_num_args(16):=p_res_call_bid;
3901 p_num_args(17):=p_res_call_ask;
3902 p_num_args(18):=p_res_put_bid;
3903 p_num_args(19):=p_res_put_ask;
3904 p_num_args(20):=p_res_fxforward_bid;
3905 p_num_args(21):=p_res_fxforward_ask;
3906 p_num_args(22):=p_res_call_fair_value_bid;
3907 p_num_args(23):=p_res_call_fair_value_ask;
3908 p_num_args(24):=p_res_put_fair_value_bid;
3909 p_num_args(25):=p_res_put_fair_value_ask;
3910
3911 p_num_args(26):=p_res_delta_call_bid;
3912 p_num_args(27):=p_res_delta_call_ask;
3913 p_num_args(28):=p_res_delta_put_bid;
3914 p_num_args(29):=p_res_delta_put_ask;
3915 p_num_args(30):=p_res_gamma_bid;
3916 p_num_args(31):=p_res_gamma_ask;
3917 p_num_args(32):=p_res_theta_call_bid;
3918 p_num_args(33):=p_res_theta_call_ask;
3919 p_num_args(34):=p_res_theta_put_bid;
3920 p_num_args(35):=p_res_theta_put_ask;
3921 p_num_args(36):=p_res_vega_bid;
3922 p_num_args(37):=p_res_vega_ask;
3923 p_num_args(38):=p_res_rho_dom_call_bid;
3924 p_num_args(39):=p_res_rho_dom_call_ask;
3925 p_num_args(40):=p_res_rho_dom_put_bid;
3926 p_num_args(41):=p_res_rho_dom_put_ask;
3927 p_num_args(42):=p_res_rho_for_call_bid;
3928 p_num_args(43):=p_res_rho_for_call_ask;
3929 p_num_args(44):=p_res_rho_for_put_bid;
3930 p_num_args(45):=p_res_rho_for_put_ask;
3931
3932 EXCEPTION
3933 WHEN e_no_int_rates THEN
3934 fnd_msg_pub.add;
3935 IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
3936 xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_INT_RATES',
3937 'QRM_CALCULATORS_P.FXO_CALCULATOR',G_ERROR_LEVEL);
3938 END IF;
3939 WHEN e_no_rate_curve THEN
3940 fnd_msg_pub.add;
3941 IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
3942 xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_RATE_CURVE',
3943 'QRM_CALCULATORS_P.FXO_CALCULATOR',G_ERROR_LEVEL);
3944 END IF;
3945 WHEN e_no_spot_rates THEN
3946 IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
3947 xtr_risk_debug_pkg.dlog('EXCEPTION','E_NO_SPOT_RATES',
3948 'QRM_CALCULATORS_P.FXO_CALCULATOR',G_ERROR_LEVEL);
3949 END IF;
3950 fnd_msg_pub.add;
3951 WHEN QRM_MM_FORMULAS.e_exceed_vol_upper_bound THEN
3952 IF (g_ERROR_level>=g_debug_level) THEN --BUG 3236479
3953 xtr_risk_debug_pkg.dlog('EXCEPTION','E_EXCEED_VOL_UPPER_BOUND',
3954 'QRM_CALCULATORS_P.FXO_CALCULATOR',G_ERROR_LEVEL);
3955 END IF;
3956 fnd_msg_pub.add;
3957
3958 IF (g_proc_level>=g_debug_level) THEN
3959 xtr_risk_debug_pkg.dpop(null,'QRM_CALCULATORS_P.fxo_calculator');
3960 END IF;
3961
3962 END fxo_calculator;
3963
3964 END;