/* nag_binary_aon_greeks (s30cdc) Example Program. * * Copyright 2009, Numerical Algorithms Group. * * Mark 9, 2009. */ /* Pre-processor includes */ #include #include #include #include #include #include #include int main(int argc, char *argv[]) { FILE *fpin, *fpout; /*Integer scalar and array declarations */ Integer exit_status = 0; Integer i, j, m, n; NagError fail; Nag_CallPut putnum; /*Double scalar and array declarations */ double q, r, s, sigma; double *charm = 0, *colour = 0, *delta = 0, *gamma = 0, *p = 0; double *rho = 0, *rhoq = 0, *speed = 0, *t = 0, *theta = 0; double *vanna = 0, *vega = 0, *vomma = 0, *x = 0, *zomma = 0; /*Character scalar and array declarations */ char put[8+1]; Nag_OrderType order; INIT_FAIL(fail); /* Check for command-line IO options */ fpin = nag_example_file_io(argc, argv, "-data", NULL); fpout = nag_example_file_io(argc, argv, "-results", NULL); fprintf(fpout, "nag_binary_aon_greeks (s30cdc) Example Program Results\n"); fprintf(fpout, "Binary (Digital): Asset-or-Nothing\n\n"); /* Skip heading in data file*/ fscanf(fpin, "%*[^\n] "); /* Read put*/ fscanf(fpin, "%s%*[^\n] ", put); /* * nag_enum_name_to_value (x04nac). * Converts NAG enum member name to value */ putnum = (Nag_CallPut) nag_enum_name_to_value(put); /* Read s, sigma, r, q*/ fscanf(fpin, "%lf%lf%lf%lf%*[^\n] ", &s, &sigma, &r, &q); /* Read m, n*/ fscanf(fpin, "%ld%ld%*[^\n] ", &m, &n); #ifdef NAG_COLUMN_MAJOR #define CHARM(I, J) charm[(J-1)*m + I-1] #define COLOUR(I, J) colour[(J-1)*m + I-1] #define DELTA(I, J) delta[(J-1)*m + I-1] #define GAMMA(I, J) gamma[(J-1)*m + I-1] #define P(I, J) p[(J-1)*m + I-1] #define RHO(I, J) rho[(J-1)*m + I-1] #define RHOQ(I, J) rhoq[(J-1)*m + I-1] #define SPEED(I, J) speed[(J-1)*m + I-1] #define THETA(I, J) theta[(J-1)*m + I-1] #define VANNA(I, J) vanna[(J-1)*m + I-1] #define VEGA(I, J) vega[(J-1)*m + I-1] #define VOMMA(I, J) vomma[(J-1)*m + I-1] #define ZOMMA(I, J) zomma[(J-1)*m + I-1] order = Nag_ColMajor; #else #define CHARM(I, J) charm[(I-1)*n + J-1] #define COLOUR(I, J) colour[(I-1)*n + J-1] #define DELTA(I, J) delta[(I-1)*n + J-1] #define GAMMA(I, J) gamma[(I-1)*n + J-1] #define P(I, J) p[(I-1)*n + J-1] #define RHO(I, J) rho[(I-1)*n + J-1] #define RHOQ(I, J) rhoq[(I-1)*n + J-1] #define SPEED(I, J) speed[(I-1)*n + J-1] #define THETA(I, J) theta[(I-1)*n + J-1] #define VANNA(I, J) vanna[(I-1)*n + J-1] #define VEGA(I, J) vega[(I-1)*n + J-1] #define VOMMA(I, J) vomma[(I-1)*n + J-1] #define ZOMMA(I, J) zomma[(I-1)*n + J-1] order = Nag_RowMajor; #endif if ( !(charm = NAG_ALLOC(m*n, double)) || !(colour = NAG_ALLOC(m*n, double)) || !(delta = NAG_ALLOC(m*n, double)) || !(gamma = NAG_ALLOC(m*n, double)) || !(p = NAG_ALLOC(m*n, double)) || !(rho = NAG_ALLOC(m*n, double)) || !(rhoq = NAG_ALLOC(m*n, double)) || !(speed = NAG_ALLOC(m*n, double)) || !(t = NAG_ALLOC(n, double)) || !(theta = NAG_ALLOC(m*n, double)) || !(vanna = NAG_ALLOC(m*n, double)) || !(vega = NAG_ALLOC(m*n, double)) || !(vomma = NAG_ALLOC(m*n, double)) || !(x = NAG_ALLOC(m, double)) || !(zomma = NAG_ALLOC(m*n, double))) { fprintf(fpout, "Allocation failure\n"); exit_status = -1; goto END; } /* Read array of strike/exercise prices, X*/ for (i = 0; i < m; i++) fscanf(fpin, "%lf ", &x[i]); fscanf(fpin, "%*[^\n] "); /* Read array of times to expiry*/ for (i = 0; i < n; i++) fscanf(fpin, "%lf ", &t[i]); fscanf(fpin, "%*[^\n] "); /* * nag_binary_aon_greeks (s30cdc) * Binary option: asset-or-nothing pricing formula with Greeks */ nag_binary_aon_greeks(order, putnum, m, n, x, s, t, sigma, r, q, p, delta, gamma, vega, theta, rho, rhoq, vanna, charm, speed, colour, zomma, vomma, &fail); if (fail.code != NE_NOERROR) { fprintf(fpout, "Error from nag_binary_aon_greeks (s30cdc).\n%s\n", fail.message); exit_status = 1; goto END; } if (putnum == Nag_Call) { fprintf(fpout, "European Call :\n\n"); } else if (putnum == Nag_Put) { fprintf(fpout, "European Put :\n\n"); } fprintf(fpout, "%s%8.4f\n", " Spot = ", s); fprintf(fpout, "%s%8.4f\n", " Volatility = ", sigma); fprintf(fpout, "%s%8.4f\n", " Rate = ", r); fprintf(fpout, "%s%8.4f\n", " Dividend = ", q); fprintf(fpout, "\n"); for (j = 1; j <= n; j++) { fprintf(fpout, "\n"); fprintf(fpout, " Time to Expiry : %8.4f\n", t[j-1]); fprintf(fpout, " Strike Price Delta Gamma Vega" " Theta Rho Rhoq\n"); for (i = 1; i <= m; i++) fprintf(fpout, "%9.4f %9.4f %9.4f %9.4f %9.4f %9.4f %9.4f %9.4f\n", x[i-1], P(i, j), DELTA(i, j), GAMMA(i, j), VEGA(i, j), THETA(i, j), RHO(i, j), RHOQ(i, j)); fprintf(fpout, " Vanna Charm Speed" " Colour Zomma Vomma\n"); for (i = 1; i <= m; i++) fprintf(fpout, "%29.4f %9.4f %9.4f %9.4f %9.4f %9.4f\n", VANNA(i, j), CHARM(i, j), SPEED(i, j), COLOUR(i, j), ZOMMA(i, j), VOMMA(i, j)); } END: if (fpin != stdin) fclose(fpin); if (fpout != stdout) fclose(fpout); if (charm) NAG_FREE(charm); if (colour) NAG_FREE(colour); if (delta) NAG_FREE(delta); if (gamma) NAG_FREE(gamma); if (p) NAG_FREE(p); if (rho) NAG_FREE(rho); if (rhoq) NAG_FREE(rhoq); if (speed) NAG_FREE(speed); if (t) NAG_FREE(t); if (theta) NAG_FREE(theta); if (vanna) NAG_FREE(vanna); if (vega) NAG_FREE(vega); if (vomma) NAG_FREE(vomma); if (x) NAG_FREE(x); if (zomma) NAG_FREE(zomma); return exit_status; }