The arguments we have used so far have been simple scalar values. Most add-in functions also need to be able to handle array values. In the following sections we are going to use the Function Wizard to create a function with a vector input.
We are going to add a function to calculate the historical volatility of a series of daily prices. The function will be implemented as a stand-alone pure C function, with no awareness of Excel.
Add the following code to Tutorial1.cpp:
// Calculates historical volatility of daily price data
// Returns 1 for success, 0 for failure
int CalcHistVol(double* adValues, int cPoints, double dDaysInYear, double* pdVol)
{
double *adReturns = 0;
double *pdOut, *pdIn;
double dSum = 0.0, dSumSq = 0.0, dSD, dRatio;
int i;
int rc = 1;
#define DAYS_IN_YEAR 250
if (cPoints < 2)
return 0;
// Calculate the returns
adReturns = (double*)malloc(sizeof(double) * (cPoints - 1));
for (i = 0, pdIn = adValues, pdOut = adReturns; i < cPoints - 1; i++, pdIn++, pdOut++) {
if (*pdIn == 0.0) {
rc = 0;
goto cleanup;
}
dRatio = pdIn[1] / pdIn[0];
if (dRatio < 0.0) {
rc = 0;
goto cleanup;
}
*pdOut = log(dRatio);
}
// Calculate the standard deviation of the returns
for (i = 0, pdIn = adReturns; i < cPoints - 1; i++, pdIn++) {
dSum += *pdIn;
dSumSq += *pdIn * *pdIn;
}
dSD = sqrt((dSumSq - (dSum * dSum / (double)(cPoints - 1)))
/ ((double)(cPoints - 1)));
// Calculate the historic volatility
if (dDaysInYear <= 0.0) {
rc = 0;
goto cleanup;
}
*pdVol = dSD * sqrt(dDaysInYear);
cleanup:
free(adReturns);
return rc;
}
The function returns 0 if it fails and 1 if it succeeds. If it succeeds, the value of *pdVol is set to the historical volatility of the series.