I wrote c++ code to do the Black Scholes calculation. It works in a command window. A Borland c++ compiler is available for free download at http://community.borland.com/article/0,1410,20633,00.html
Here is the code:
==========================
#include <fstream.h>
#define Pi 3.141592653589793238462643
char CallPutFlag;
double S,T,X,r,v;
double BlackScholes(char, double, double, double, double, double);
double CND(double);
/////////////////////////////////////////////////////////////////////////////////
// The Black and Scholes (1973) Stock option formula
double BlackScholes(char CallPutFlag, double S, double X, double T, double r, double v)
{
double d1, d2;
d1=(log(S/X)+(r+v*v/2)*T)/(v*sqrt(T));
d2=d1-v*sqrt(T);
if(CallPutFlag == 'c')
return S *CND(d1)-X * exp(-r*T)*CND(d2);
else if(CallPutFlag == 'p')
return X * exp(-r * T) * CND(-d2) - S * CND(-d1);
return 0;
}
/////////////////////////////////////////////////////////////////////////////////
// The cumulative normal distribution function
double CND( double X )
{
double L, K, w ;
double const a1 = 0.31938153, a2 = -0.356563782, a3 = 1.781477937;
double const a4 = -1.821255978, a5 = 1.330274429;
L = fabs(X);
K = 1.0 / (1.0 + 0.2316419 * L);
w = 1.0 - 1.0 / sqrt(2 * Pi) * exp(-L *L / 2) * (a1 * K + a2 * K *K + a3 * pow(K,3) + a4 * pow(K,4) + a5 * pow(K,5));
if (X < 0 )
w= 1.0 - w;
return w;
}
/////////////////////////////////////////////////////////////////////////////////
void main(void)
{
cout << "\nElite Trader Black Scholes Option Pricer\n\n";
cout << "Enter c for call option, p for put option ";
cin >> CallPutFlag;
if (CallPutFlag != 'c' && CallPutFlag != 'p')
{
cout << "Let's try again, enter c for call option, p for put option\n\n";
exit(0);
}
cout << "Enter stock price ";
cin >> S;
cout << "Enter strike price ";
cin >> X;
cout << "Enter risk free rate ";
cin >> r;
cout << "Enter years to maturity ";
cin >> T;
cout << "Enter volatility ";
cin >> v;
if ( CallPutFlag == 'c' )
cout << "\nCall price is " << BlackScholes(CallPutFlag, S, X, T, r, v);
if ( CallPutFlag == 'p' )
cout << "\nPut price is " << BlackScholes(CallPutFlag, S, X, T, r, v);
cout << "\n";
}
===============
The zipped executable is attached.
Here is the code:
==========================
#include <fstream.h>
#define Pi 3.141592653589793238462643
char CallPutFlag;
double S,T,X,r,v;
double BlackScholes(char, double, double, double, double, double);
double CND(double);
/////////////////////////////////////////////////////////////////////////////////
// The Black and Scholes (1973) Stock option formula
double BlackScholes(char CallPutFlag, double S, double X, double T, double r, double v)
{
double d1, d2;
d1=(log(S/X)+(r+v*v/2)*T)/(v*sqrt(T));
d2=d1-v*sqrt(T);
if(CallPutFlag == 'c')
return S *CND(d1)-X * exp(-r*T)*CND(d2);
else if(CallPutFlag == 'p')
return X * exp(-r * T) * CND(-d2) - S * CND(-d1);
return 0;
}
/////////////////////////////////////////////////////////////////////////////////
// The cumulative normal distribution function
double CND( double X )
{
double L, K, w ;
double const a1 = 0.31938153, a2 = -0.356563782, a3 = 1.781477937;
double const a4 = -1.821255978, a5 = 1.330274429;
L = fabs(X);
K = 1.0 / (1.0 + 0.2316419 * L);
w = 1.0 - 1.0 / sqrt(2 * Pi) * exp(-L *L / 2) * (a1 * K + a2 * K *K + a3 * pow(K,3) + a4 * pow(K,4) + a5 * pow(K,5));
if (X < 0 )
w= 1.0 - w;
return w;
}
/////////////////////////////////////////////////////////////////////////////////
void main(void)
{
cout << "\nElite Trader Black Scholes Option Pricer\n\n";
cout << "Enter c for call option, p for put option ";
cin >> CallPutFlag;
if (CallPutFlag != 'c' && CallPutFlag != 'p')
{
cout << "Let's try again, enter c for call option, p for put option\n\n";
exit(0);
}
cout << "Enter stock price ";
cin >> S;
cout << "Enter strike price ";
cin >> X;
cout << "Enter risk free rate ";
cin >> r;
cout << "Enter years to maturity ";
cin >> T;
cout << "Enter volatility ";
cin >> v;
if ( CallPutFlag == 'c' )
cout << "\nCall price is " << BlackScholes(CallPutFlag, S, X, T, r, v);
if ( CallPutFlag == 'p' )
cout << "\nPut price is " << BlackScholes(CallPutFlag, S, X, T, r, v);
cout << "\n";
}
===============
The zipped executable is attached.