6093 lines
204 KiB
JavaScript
6093 lines
204 KiB
JavaScript
/*
|
|
* (c) Copyright Ascensio System SIA 2010-2015
|
|
*
|
|
* This program is a free software product. You can redistribute it and/or
|
|
* modify it under the terms of the GNU Affero General Public License (AGPL)
|
|
* version 3 as published by the Free Software Foundation. In accordance with
|
|
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
|
|
* that Ascensio System SIA expressly excludes the warranty of non-infringement
|
|
* of any third-party rights.
|
|
*
|
|
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
|
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
|
|
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
|
*
|
|
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
|
|
* EU, LV-1021.
|
|
*
|
|
* The interactive user interfaces in modified source and object code versions
|
|
* of the Program must display Appropriate Legal Notices, as required under
|
|
* Section 5 of the GNU AGPL version 3.
|
|
*
|
|
* Pursuant to Section 7(b) of the License you must retain the original Product
|
|
* logo when distributing the program. Pursuant to Section 7(e) we decline to
|
|
* grant you any rights under trademark law for use of our trademarks.
|
|
*
|
|
* All the Product's GUI elements, including illustrations and icon sets, as
|
|
* well as technical writing content are licensed under the terms of the
|
|
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
|
|
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
|
*
|
|
*/
|
|
"use strict";
|
|
var startRangeCurrentDateSystem = 1;
|
|
function getPMT(rate, nper, pv, fv, flag) {
|
|
var res, part;
|
|
if (rate === 0) {
|
|
res = (pv + fv) / nper;
|
|
} else {
|
|
part = Math.pow(1 + rate, nper);
|
|
if (flag > 0) {
|
|
res = (fv * rate / (part - 1) + pv * rate / (1 - 1 / part)) / (1 + rate);
|
|
} else {
|
|
res = fv * rate / (part - 1) + pv * rate / (1 - 1 / part);
|
|
}
|
|
}
|
|
return -res;
|
|
}
|
|
function getFV(rate, nper, pmt, pv, type) {
|
|
var res, part;
|
|
if (rate === 0) {
|
|
res = pv + pmt * nper;
|
|
} else {
|
|
part = Math.pow(1 + rate, nper);
|
|
if (type > 0) {
|
|
res = pv * part + pmt * (1 + rate) * (part - 1) / rate;
|
|
} else {
|
|
res = pv * part + pmt * (part - 1) / rate;
|
|
}
|
|
}
|
|
return -res;
|
|
}
|
|
function getDDB(cost, salvage, life, period, factor) {
|
|
var ddb, ipmt, oldCost, newCost;
|
|
ipmt = factor / life;
|
|
if (ipmt >= 1) {
|
|
ipmt = 1;
|
|
if (period === 1) {
|
|
oldCost = cost;
|
|
} else {
|
|
oldCost = 0;
|
|
}
|
|
} else {
|
|
oldCost = cost * Math.pow(1 - ipmt, period - 1);
|
|
}
|
|
newCost = cost * Math.pow(1 - ipmt, period);
|
|
if (newCost < salvage) {
|
|
ddb = oldCost - salvage;
|
|
} else {
|
|
ddb = oldCost - newCost;
|
|
}
|
|
if (ddb < 0) {
|
|
ddb = 0;
|
|
}
|
|
return ddb;
|
|
}
|
|
function getIPMT(rate, per, pv, type, pmt) {
|
|
var ipmt;
|
|
if (per === 1) {
|
|
if (type > 0) {
|
|
ipmt = 0;
|
|
} else {
|
|
ipmt = -pv;
|
|
}
|
|
} else {
|
|
if (type > 0) {
|
|
ipmt = getFV(rate, per - 2, pmt, pv, 1) - pmt;
|
|
} else {
|
|
ipmt = getFV(rate, per - 1, pmt, pv, 0);
|
|
}
|
|
}
|
|
return ipmt * rate;
|
|
}
|
|
function RateIteration(nper, payment, pv, fv, payType, guess) {
|
|
var valid = true,
|
|
found = false,
|
|
x, xnew, term, termDerivation, geoSeries, geoSeriesDerivation, iterationMax = 150,
|
|
nCount = 0,
|
|
minEps = 1e-14,
|
|
eps = 1e-07,
|
|
powN, powNminus1;
|
|
fv = fv - payment * payType;
|
|
pv = pv + payment * payType;
|
|
if (nper === Math.round(nper)) {
|
|
x = guess;
|
|
while (!found && nCount < iterationMax) {
|
|
powNminus1 = Math.pow(1 + x, nper - 1);
|
|
powN = powNminus1 * (1 + x);
|
|
if (Math.approxEqual(Math.abs(x), 0)) {
|
|
geoSeries = nper;
|
|
geoSeriesDerivation = nper * (nper - 1) / 2;
|
|
} else {
|
|
geoSeries = (powN - 1) / x;
|
|
geoSeriesDerivation = (nper * powNminus1 - geoSeries) / x;
|
|
}
|
|
term = fv + pv * powN + payment * geoSeries;
|
|
termDerivation = pv * nper * powNminus1 + payment * geoSeriesDerivation;
|
|
if (Math.abs(term) < minEps) {
|
|
found = true;
|
|
} else {
|
|
if (Math.approxEqual(Math.abs(termDerivation), 0)) {
|
|
xnew = x + 1.1 * eps;
|
|
} else {
|
|
xnew = x - term / termDerivation;
|
|
}
|
|
nCount++;
|
|
found = (Math.abs(xnew - x) < eps);
|
|
x = xnew;
|
|
}
|
|
}
|
|
valid = (x >= -1);
|
|
} else {
|
|
x = (guess < -1) ? -1 : guess;
|
|
while (valid && !found && nCount < iterationMax) {
|
|
if (Math.approxEqual(Math.abs(x), 0)) {
|
|
geoSeries = nper;
|
|
geoSeriesDerivation = nper * (nper - 1) / 2;
|
|
} else {
|
|
geoSeries = (Math.pow(1 + x, nper) - 1) / x;
|
|
geoSeriesDerivation = nper * Math.pow(1 + x, nper - 1) / x - geoSeries / x;
|
|
}
|
|
term = fv + pv * Math.pow(1 + x, nper) + payment * geoSeries;
|
|
termDerivation = pv * nper * Math.pow(1 + x, nper - 1) + payment * geoSeriesDerivation;
|
|
if (Math.abs(term) < minEps) {
|
|
found = true;
|
|
} else {
|
|
if (Math.approxEqual(Math.abs(termDerivation), 0)) {
|
|
xnew = x + 1.1 * eps;
|
|
} else {
|
|
xnew = x - term / termDerivation;
|
|
}
|
|
nCount++;
|
|
found = (Math.abs(xnew - x) < eps);
|
|
x = xnew;
|
|
valid = (x >= -1);
|
|
}
|
|
}
|
|
}
|
|
if (valid && found) {
|
|
return new cNumber(x);
|
|
} else {
|
|
return new cError(cErrorType.not_numeric);
|
|
}
|
|
}
|
|
function lcl_GetCouppcd(settl, matur, freq) {
|
|
var n = new Date(matur);
|
|
n.setUTCFullYear(settl.getUTCFullYear());
|
|
if (n < settl) {
|
|
n.addYears(1);
|
|
}
|
|
while (n > settl) {
|
|
n.addMonths(-12 / freq);
|
|
}
|
|
return n;
|
|
}
|
|
function lcl_GetCoupncd(settl, matur, freq) {
|
|
matur.setUTCFullYear(settl.getUTCFullYear());
|
|
if (matur > settl) {
|
|
matur.addYears(-1);
|
|
}
|
|
while (matur < settl) {
|
|
matur.addMonths(12 / freq);
|
|
}
|
|
}
|
|
function getcoupdaybs(settl, matur, frequency, basis) {
|
|
var n = lcl_GetCouppcd(settl, matur, frequency);
|
|
return diffDate(n, settl, basis);
|
|
}
|
|
function getcoupdays(settl, matur, frequency, basis) {
|
|
if (basis == DayCountBasis.ActualActual) {
|
|
var m = lcl_GetCouppcd(settl, matur, frequency),
|
|
n = new Date(m);
|
|
n.addMonths(12 / frequency);
|
|
return diffDate(m, n, basis);
|
|
}
|
|
return new cNumber(daysInYear(0, basis) / frequency);
|
|
}
|
|
function getcoupnum(settl, matur, frequency) {
|
|
var n = lcl_GetCouppcd(settl, matur, frequency),
|
|
months = (matur.getUTCFullYear() - n.getUTCFullYear()) * 12 + matur.getUTCMonth() - n.getUTCMonth();
|
|
return Math.ceil(months * frequency / 12);
|
|
}
|
|
function getcoupdaysnc(settl, matur, frequency, basis) {
|
|
if ((basis !== 0) && (basis !== 4)) {
|
|
lcl_GetCoupncd(settl, matur, frequency);
|
|
return diffDate(settl, matur, basis);
|
|
}
|
|
return getcoupdays(new Date(settl), new Date(matur), frequency, basis) - getcoupdaybs(new Date(settl), new Date(matur), frequency, basis);
|
|
}
|
|
function getcoupncd(settl, matur, frequency) {
|
|
var s = new Date(settl),
|
|
m = new Date(matur);
|
|
lcl_GetCoupncd(s, m, frequency);
|
|
return m;
|
|
}
|
|
function getprice(settle, mat, rate, yld, redemp, freq, base) {
|
|
var cdays = getcoupdays(new Date(settle), new Date(mat), freq, base),
|
|
cnum = getcoupnum(new Date(settle), new Date(mat), freq),
|
|
cdaybs = getcoupdaybs(new Date(settle), new Date(mat), freq, base),
|
|
cdaysnc = (cdays - cdaybs) / cdays,
|
|
fT1 = 100 * rate / freq,
|
|
fT2 = 1 + yld / freq,
|
|
res = redemp / (Math.pow(1 + yld / freq, cnum - 1 + cdaysnc));
|
|
if (cnum == 1) {
|
|
return (redemp + fT1) / (1 + cdaysnc * yld / freq) - 100 * rate / freq * cdaybs / cdays;
|
|
}
|
|
res -= 100 * rate / freq * cdaybs / cdays;
|
|
for (var i = 0; i < cnum; i++) {
|
|
res += fT1 / Math.pow(fT2, i + cdaysnc);
|
|
}
|
|
return res;
|
|
}
|
|
function getYield(settle, mat, coup, price, redemp, freq, base) {
|
|
var priceN = 0,
|
|
yield1 = 0,
|
|
yield2 = 1,
|
|
price1 = getprice(settle, mat, coup, yield1, redemp, freq, base),
|
|
price2 = getprice(settle, mat, coup, yield2, redemp, freq, base),
|
|
yieldN = (yield2 - yield1) * 0.5;
|
|
for (var i = 0; i < 100 && priceN != price; i++) {
|
|
priceN = getprice(settle, mat, coup, yieldN, redemp, freq, base);
|
|
if (price == price1) {
|
|
return yield1;
|
|
} else {
|
|
if (price == price2) {
|
|
return yield2;
|
|
} else {
|
|
if (price == priceN) {
|
|
return yieldN;
|
|
} else {
|
|
if (price < price2) {
|
|
yield2 *= 2;
|
|
price2 = getprice(settle, mat, coup, yield2, redemp, freq, base);
|
|
yieldN = (yield2 - yield1) * 0.5;
|
|
} else {
|
|
if (price < priceN) {
|
|
yield1 = yieldN;
|
|
price1 = priceN;
|
|
} else {
|
|
yield2 = yieldN;
|
|
price2 = priceN;
|
|
}
|
|
yieldN = yield2 - (yield2 - yield1) * ((price - price2) / (price1 - price2));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (Math.abs(price - priceN) > price / 100) {
|
|
return new cError(cErrorType.not_numeric);
|
|
}
|
|
return new cNumber(yieldN);
|
|
}
|
|
function getyieldmat(settle, mat, issue, rate, price, base) {
|
|
var issMat = yearFrac(issue, mat, base);
|
|
var issSet = yearFrac(issue, settle, base);
|
|
var setMat = yearFrac(settle, mat, base);
|
|
var y = (1 + issMat * rate) / (price / 100 + issSet * rate) - 1;
|
|
y /= setMat;
|
|
return y;
|
|
}
|
|
function getduration(settlement, maturity, coupon, yld, frequency, basis) {
|
|
var dbc = getcoupdaybs(new Date(settlement), new Date(maturity), frequency, basis),
|
|
coupD = getcoupdays(new Date(settlement), new Date(maturity), frequency, basis),
|
|
numCoup = getcoupnum(new Date(settlement), new Date(maturity), frequency);
|
|
var duration = 0,
|
|
p = 0;
|
|
var dsc = coupD - dbc;
|
|
var diff = dsc / coupD - 1;
|
|
yld = yld / frequency + 1;
|
|
coupon *= 100 / frequency;
|
|
for (var index = 1; index <= numCoup; index++) {
|
|
var di = index + diff;
|
|
var yldPOW = Math.pow(yld, di);
|
|
duration += di * coupon / yldPOW;
|
|
p += coupon / yldPOW;
|
|
}
|
|
duration += (diff + numCoup) * 100 / Math.pow(yld, diff + numCoup);
|
|
p += 100 / Math.pow(yld, diff + numCoup);
|
|
return duration / p / frequency;
|
|
}
|
|
function oddFPrice(settl, matur, iss, firstCoup, rate, yld, redemption, frequency, basis) {
|
|
function positiveDaysBetween(d1, d2, b) {
|
|
var res = diffDate(d1, d2, b).getValue();
|
|
return res > 0 ? res : 0;
|
|
}
|
|
function addMonth(orgDate, numMonths, returnLastDay) {
|
|
var newDate = new Date(orgDate);
|
|
newDate.addMonths(numMonths);
|
|
if (returnLastDay) {
|
|
newDate.setUTCDate(newDate.getDaysInMonth());
|
|
}
|
|
return newDate;
|
|
}
|
|
function coupNumber(startDate, endDate, countMonths, isWholeNumber) {
|
|
var my = startDate.getUTCFullYear(),
|
|
mm = startDate.getUTCMonth(),
|
|
md = startDate.getUTCDate(),
|
|
endOfMonthTemp = startDate.lastDayOfMonth(),
|
|
endOfMonth = (!endOfMonthTemp && mm != 1 && md > 28 && md < new Date(my, mm).getDaysInMonth()) ? endDate.lastDayOfMonth() : endOfMonthTemp,
|
|
startDate = addMonth(endDate, 0, endOfMonth),
|
|
coupons = (isWholeNumber - 0) + (endDate < startDate),
|
|
frontDate = addMonth(startDate, countMonths, endOfMonth);
|
|
while (! (countMonths > 0 ? frontDate >= endDate : frontDate <= endDate)) {
|
|
frontDate = addMonth(frontDate, countMonths, endOfMonth);
|
|
coupons++;
|
|
}
|
|
return coupons;
|
|
}
|
|
var res = 0,
|
|
DSC, numMonths = 12 / frequency,
|
|
numMonthsNeg = -numMonths,
|
|
E = getcoupdays(settl, new Date(firstCoup), frequency, basis).getValue(),
|
|
coupNums = getcoupnum(settl, new Date(matur), frequency),
|
|
dfc = positiveDaysBetween(new Date(iss), new Date(firstCoup), basis);
|
|
if (dfc < E) {
|
|
DSC = positiveDaysBetween(settl, firstCoup, basis);
|
|
rate *= 100 / frequency;
|
|
yld /= frequency;
|
|
yld++;
|
|
DSC /= E;
|
|
res = redemption / Math.pow(yld, (coupNums - 1 + DSC));
|
|
res += rate * dfc / E / Math.pow(yld, DSC);
|
|
res -= rate * positiveDaysBetween(iss, settl, basis) / E;
|
|
for (var i = 1; i < coupNums; i++) {
|
|
res += rate / Math.pow(yld, (i + DSC));
|
|
}
|
|
} else {
|
|
var nc = getcoupnum(iss, firstCoup, frequency),
|
|
lateCoupon = new Date(firstCoup),
|
|
DCdivNL = 0,
|
|
AdivNL = 0,
|
|
startDate,
|
|
endDate,
|
|
earlyCoupon,
|
|
NLi,
|
|
DCi;
|
|
for (var index = nc; index >= 1; index--) {
|
|
earlyCoupon = addMonth(lateCoupon, numMonthsNeg, false);
|
|
NLi = basis == DayCountBasis.ActualActual ? positiveDaysBetween(earlyCoupon, lateCoupon, basis) : E;
|
|
DCi = index > 1 ? NLi : positiveDaysBetween(iss, lateCoupon, basis);
|
|
startDate = iss > earlyCoupon ? iss : earlyCoupon;
|
|
endDate = settl < lateCoupon ? settl : lateCoupon;
|
|
lateCoupon = new Date(earlyCoupon);
|
|
DCdivNL += DCi / NLi;
|
|
AdivNL += positiveDaysBetween(startDate, endDate, basis) / NLi;
|
|
}
|
|
if (basis == DayCountBasis.Actual360 || basis == DayCountBasis.Actual365) {
|
|
DSC = positiveDaysBetween(settl, getcoupncd(settl, firstCoup, frequency), basis);
|
|
} else {
|
|
DSC = E - diffDate(lcl_GetCouppcd(settl, firstCoup, frequency), settl, basis);
|
|
}
|
|
var Nq = coupNumber(firstCoup, settl, numMonths, true);
|
|
coupNums = getcoupnum(firstCoup, matur, frequency);
|
|
yld /= frequency;
|
|
yld++;
|
|
DSC /= E;
|
|
rate *= 100 / frequency;
|
|
for (var i = 1; i <= coupNums; i++) {
|
|
res += 1 / Math.pow(yld, (i + Nq + DSC));
|
|
}
|
|
res *= rate;
|
|
res += redemption / Math.pow(yld, (DSC + Nq + coupNums));
|
|
res += rate * DCdivNL / Math.pow(yld, (Nq + DSC));
|
|
res -= rate * AdivNL;
|
|
}
|
|
return res;
|
|
}
|
|
cFormulaFunction.Financial = {
|
|
"groupName": "Financial",
|
|
"ACCRINT": cACCRINT,
|
|
"ACCRINTM": cACCRINTM,
|
|
"AMORDEGRC": cAMORDEGRC,
|
|
"AMORLINC": cAMORLINC,
|
|
"COUPDAYBS": cCOUPDAYBS,
|
|
"COUPDAYS": cCOUPDAYS,
|
|
"COUPDAYSNC": cCOUPDAYSNC,
|
|
"COUPNCD": cCOUPNCD,
|
|
"COUPNUM": cCOUPNUM,
|
|
"COUPPCD": cCOUPPCD,
|
|
"CUMIPMT": cCUMIPMT,
|
|
"CUMPRINC": cCUMPRINC,
|
|
"DB": cDB,
|
|
"DDB": cDDB,
|
|
"DISC": cDISC,
|
|
"DOLLARDE": cDOLLARDE,
|
|
"DOLLARFR": cDOLLARFR,
|
|
"DURATION": cDURATION,
|
|
"EFFECT": cEFFECT,
|
|
"FV": cFV,
|
|
"FVSCHEDULE": cFVSCHEDULE,
|
|
"INTRATE": cINTRATE,
|
|
"IPMT": cIPMT,
|
|
"IRR": cIRR,
|
|
"ISPMT": cISPMT,
|
|
"MDURATION": cMDURATION,
|
|
"MIRR": cMIRR,
|
|
"NOMINAL": cNOMINAL,
|
|
"NPER": cNPER,
|
|
"NPV": cNPV,
|
|
"ODDFPRICE": cODDFPRICE,
|
|
"ODDFYIELD": cODDFYIELD,
|
|
"ODDLPRICE": cODDLPRICE,
|
|
"ODDLYIELD": cODDLYIELD,
|
|
"PMT": cPMT,
|
|
"PPMT": cPPMT,
|
|
"PRICE": cPRICE,
|
|
"PRICEDISC": cPRICEDISC,
|
|
"PRICEMAT": cPRICEMAT,
|
|
"PV": cPV,
|
|
"RATE": cRATE,
|
|
"RECEIVED": cRECEIVED,
|
|
"SLN": cSLN,
|
|
"SYD": cSYD,
|
|
"TBILLEQ": cTBILLEQ,
|
|
"TBILLPRICE": cTBILLPRICE,
|
|
"TBILLYIELD": cTBILLYIELD,
|
|
"VDB": cVDB,
|
|
"XIRR": cXIRR,
|
|
"XNPV": cXNPV,
|
|
"YIELD": cYIELD,
|
|
"YIELDDISC": cYIELDDISC,
|
|
"YIELDMAT": cYIELDMAT
|
|
};
|
|
function cACCRINT() {
|
|
this.name = "ACCRINT";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 6;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 8;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cACCRINT.prototype = Object.create(cBaseFunction.prototype);
|
|
cACCRINT.prototype.Calculate = function (arg) {
|
|
var issue = arg[0],
|
|
firstInterest = arg[1],
|
|
settlement = arg[2],
|
|
rate = arg[3],
|
|
par = arg[4] && !(arg[4] instanceof cEmpty) ? arg[4] : new cNumber(1000),
|
|
frequency = arg[5],
|
|
basis = arg[6] && !(arg[6] instanceof cEmpty) ? arg[6] : new cNumber(0),
|
|
calcMethod = arg[7] && !(arg[7] instanceof cEmpty) ? arg[7] : new cBool(true);
|
|
if (issue instanceof cArea || issue instanceof cArea3D) {
|
|
issue = issue.cross(arguments[1].first);
|
|
} else {
|
|
if (issue instanceof cArray) {
|
|
issue = issue.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (firstInterest instanceof cArea || firstInterest instanceof cArea3D) {
|
|
firstInterest = firstInterest.cross(arguments[1].first);
|
|
} else {
|
|
if (firstInterest instanceof cArray) {
|
|
firstInterest = firstInterest.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (par instanceof cArea || par instanceof cArea3D) {
|
|
par = par.cross(arguments[1].first);
|
|
} else {
|
|
if (par instanceof cArray) {
|
|
par = par.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (frequency instanceof cArea || frequency instanceof cArea3D) {
|
|
frequency = frequency.cross(arguments[1].first);
|
|
} else {
|
|
if (frequency instanceof cArray) {
|
|
frequency = frequency.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (calcMethod instanceof cArea || calcMethod instanceof cArea3D) {
|
|
calcMethod = calcMethod.cross(arguments[1].first);
|
|
} else {
|
|
if (calcMethod instanceof cArray) {
|
|
calcMethod = calcMethod.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
issue = issue.tocNumber();
|
|
firstInterest = firstInterest.tocNumber();
|
|
settlement = settlement.tocNumber();
|
|
rate = rate.tocNumber();
|
|
par = par.tocNumber();
|
|
frequency = frequency.tocNumber();
|
|
basis = basis.tocNumber();
|
|
calcMethod = calcMethod.tocBool();
|
|
if (issue instanceof cError) {
|
|
return this.value = issue;
|
|
}
|
|
if (firstInterest instanceof cError) {
|
|
return this.value = firstInterest;
|
|
}
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (par instanceof cError) {
|
|
return this.value = par;
|
|
}
|
|
if (frequency instanceof cError) {
|
|
return this.value = frequency;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
if (calcMethod instanceof cError) {
|
|
return this.value = calcMethod;
|
|
}
|
|
issue = Math.floor(issue.getValue());
|
|
firstInterest = Math.floor(firstInterest.getValue());
|
|
settlement = Math.floor(settlement.getValue());
|
|
rate = rate.getValue();
|
|
par = par.getValue();
|
|
frequency = Math.floor(frequency.getValue());
|
|
basis = Math.floor(basis.getValue());
|
|
calcMethod = calcMethod.toBool();
|
|
if (issue < startRangeCurrentDateSystem || firstInterest < startRangeCurrentDateSystem || settlement < startRangeCurrentDateSystem || issue >= settlement || rate <= 0 || par <= 0 || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4)) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
function addMonth(orgDate, numMonths, returnLastDay) {
|
|
var newDate = new Date(orgDate);
|
|
newDate.addMonths(numMonths);
|
|
if (returnLastDay) {
|
|
newDate.setUTCDate(newDate.getDaysInMonth());
|
|
}
|
|
return newDate;
|
|
}
|
|
var iss = Date.prototype.getDateFromExcel(issue),
|
|
fInter = Date.prototype.getDateFromExcel(firstInterest),
|
|
settl = Date.prototype.getDateFromExcel(settlement),
|
|
numMonths = 12 / frequency,
|
|
numMonthsNeg = -numMonths,
|
|
endMonth = fInter.lastDayOfMonth(),
|
|
coupPCD,
|
|
firstDate,
|
|
startDate,
|
|
endDate,
|
|
res,
|
|
days,
|
|
coupDays;
|
|
if (settl > fInter && calcMethod) {
|
|
coupPCD = new Date(fInter);
|
|
startDate = endDate = new Date(settl);
|
|
while (! (numMonths > 0 ? coupPCD >= startDate : coupPCD <= startDate)) {
|
|
endDate = coupPCD;
|
|
coupPCD = addMonth(coupPCD, numMonths, endMonth);
|
|
}
|
|
} else {
|
|
coupPCD = addMonth(fInter, numMonthsNeg, endMonth);
|
|
}
|
|
firstDate = new Date(iss > coupPCD ? iss : coupPCD);
|
|
days = days360(firstDate, settl, basis);
|
|
coupDays = getcoupdays(coupPCD, fInter, frequency, basis).getValue();
|
|
res = days / coupDays;
|
|
startDate = new Date(coupPCD);
|
|
endDate = iss;
|
|
while (! (numMonthsNeg > 0 ? startDate >= iss : startDate <= iss)) {
|
|
endDate = startDate;
|
|
startDate = addMonth(startDate, numMonthsNeg, endMonth);
|
|
firstDate = iss > startDate ? iss : startDate;
|
|
if (basis == DayCountBasis.UsPsa30_360) {
|
|
days = days360(firstDate, endDate, !(iss > startDate));
|
|
coupDays = getcoupdays(startDate, endDate, frequency, basis).getValue();
|
|
} else {
|
|
days = diffDate(firstDate, endDate, basis).getValue();
|
|
coupDays = (basis == DayCountBasis.Actual365) ? (365 / frequency) : diffDate(startDate, endDate, basis).getValue();
|
|
}
|
|
res += (iss <= startDate) ? calcMethod : days / coupDays;
|
|
}
|
|
res *= par * rate / frequency;
|
|
return this.value = new cNumber(res);
|
|
};
|
|
cACCRINT.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( issue , first-interest , settlement , rate , [ par ] , frequency [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cACCRINTM() {
|
|
this.name = "ACCRINTM";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 3;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 5;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cACCRINTM.prototype = Object.create(cBaseFunction.prototype);
|
|
cACCRINTM.prototype.Calculate = function (arg) {
|
|
var issue = arg[0],
|
|
settlement = arg[1],
|
|
rate = arg[2],
|
|
par = arg[3] && !(arg[3] instanceof cEmpty) ? arg[3] : new cNumber(1000),
|
|
basis = arg[4] && !(arg[4] instanceof cEmpty) ? arg[4] : new cNumber(0);
|
|
if (issue instanceof cArea || issue instanceof cArea3D) {
|
|
issue = issue.cross(arguments[1].first);
|
|
} else {
|
|
if (issue instanceof cArray) {
|
|
issue = issue.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (par instanceof cArea || par instanceof cArea3D) {
|
|
par = par.cross(arguments[1].first);
|
|
} else {
|
|
if (par instanceof cArray) {
|
|
par = par.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
issue = issue.tocNumber();
|
|
settlement = settlement.tocNumber();
|
|
rate = rate.tocNumber();
|
|
par = par.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (issue instanceof cError) {
|
|
return this.value = issue;
|
|
}
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (par instanceof cError) {
|
|
return this.value = par;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
issue = Math.floor(issue.getValue());
|
|
settlement = Math.floor(settlement.getValue());
|
|
rate = rate.getValue();
|
|
par = par.getValue();
|
|
basis = Math.floor(basis.getValue());
|
|
if (settlement < startRangeCurrentDateSystem || issue < startRangeCurrentDateSystem || issue >= settlement || rate <= 0 || par <= 0 || basis < 0 || basis > 4) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var res = yearFrac(Date.prototype.getDateFromExcel(issue), Date.prototype.getDateFromExcel(settlement), basis);
|
|
res *= rate * par;
|
|
return this.value = new cNumber(res);
|
|
};
|
|
cACCRINTM.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( issue , settlement , rate , [ [ par ] [ , [ basis ] ] ] )"
|
|
};
|
|
};
|
|
function cAMORDEGRC() {
|
|
this.name = "AMORDEGRC";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 6;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 7;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cAMORDEGRC.prototype = Object.create(cBaseFunction.prototype);
|
|
cAMORDEGRC.prototype.Calculate = function (arg) {
|
|
var cost = arg[0],
|
|
datePurch = arg[1],
|
|
firstPer = arg[2],
|
|
salvage = arg[3],
|
|
period = arg[4],
|
|
rate = arg[5],
|
|
basis = arg[6] && !(arg[6] instanceof cEmpty) ? arg[6] : new cNumber(0);
|
|
if (cost instanceof cArea || cost instanceof cArea3D) {
|
|
cost = cost.cross(arguments[1].first);
|
|
} else {
|
|
if (cost instanceof cArray) {
|
|
cost = cost.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (datePurch instanceof cArea || datePurch instanceof cArea3D) {
|
|
datePurch = datePurch.cross(arguments[1].first);
|
|
} else {
|
|
if (datePurch instanceof cArray) {
|
|
datePurch = datePurch.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (firstPer instanceof cArea || firstPer instanceof cArea3D) {
|
|
firstPer = firstPer.cross(arguments[1].first);
|
|
} else {
|
|
if (firstPer instanceof cArray) {
|
|
firstPer = firstPer.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (salvage instanceof cArea || salvage instanceof cArea3D) {
|
|
salvage = salvage.cross(arguments[1].first);
|
|
} else {
|
|
if (salvage instanceof cArray) {
|
|
salvage = salvage.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (period instanceof cArea || period instanceof cArea3D) {
|
|
period = period.cross(arguments[1].first);
|
|
} else {
|
|
if (period instanceof cArray) {
|
|
period = period.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
cost = cost.tocNumber();
|
|
datePurch = datePurch.tocNumber();
|
|
firstPer = firstPer.tocNumber();
|
|
salvage = salvage.tocNumber();
|
|
period = period.tocNumber();
|
|
rate = rate.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (cost instanceof cError) {
|
|
return this.value = cost;
|
|
}
|
|
if (datePurch instanceof cError) {
|
|
return this.value = datePurch;
|
|
}
|
|
if (firstPer instanceof cError) {
|
|
return this.value = firstPer;
|
|
}
|
|
if (salvage instanceof cError) {
|
|
return this.value = salvage;
|
|
}
|
|
if (period instanceof cError) {
|
|
return this.value = period;
|
|
}
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
rate = rate.getValue();
|
|
cost = cost.getValue();
|
|
salvage = salvage.getValue();
|
|
period = period.getValue();
|
|
basis = Math.floor(basis.getValue());
|
|
datePurch = datePurch.getValue();
|
|
firstPer = firstPer.getValue();
|
|
if (cost < 0 || salvage < 0 || period < 0 || rate <= 0 || basis == 2 || basis < 0 || basis > 4 || firstPer < 0 || datePurch < 0 || datePurch > firstPer || cost < salvage) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
if (cost == salvage) {
|
|
return this.value = new cNumber(0);
|
|
}
|
|
datePurch = Date.prototype.getDateFromExcel(datePurch);
|
|
firstPer = Date.prototype.getDateFromExcel(firstPer);
|
|
function findDepr(countedPeriod, depr, rate, cost) {
|
|
if (countedPeriod > period) {
|
|
return new cNumber(Math.round(depr));
|
|
} else {
|
|
countedPeriod++;
|
|
}
|
|
var calcT = assetLife - countedPeriod,
|
|
deprTemp = calcT == 2 ? cost * 0.5 : rate * cost;
|
|
rate = (calcT == 2 ? 1 : rate);
|
|
if (cost < salvage) {
|
|
if (cost - salvage < 0) {
|
|
depr = 0;
|
|
} else {
|
|
depr = cost - salvage;
|
|
}
|
|
} else {
|
|
depr = deprTemp;
|
|
}
|
|
cost -= depr;
|
|
return findDepr(countedPeriod, depr, rate, cost);
|
|
}
|
|
function firstDeprLinc(cost, datePurch, firstP, salvage, rate, per, basis) {
|
|
function fix29February(d) {
|
|
if ((basis == DayCountBasis.ActualActual || basis == DayCountBasis.Actual365) && d.isLeapYear() && d.getUTCMonth() == 2 && d.getUTCDate() >= 28) {
|
|
return new Date(d.getUTCFullYear(), d.getUTCMonth(), 28);
|
|
} else {
|
|
return d;
|
|
}
|
|
}
|
|
var firstLen = diffDate(fix29February(datePurch), fix29February(firstP), basis),
|
|
firstDeprTemp = firstLen / daysInYear(datePurch, basis) * rate * cost,
|
|
firstDepr = firstDeprTemp == 0 ? cost * rate : firstDeprTemp,
|
|
period = firstDeprTemp == 0 ? per : per + 1,
|
|
availDepr = cost - salvage;
|
|
if (firstDepr > availDepr) {
|
|
return [availDepr, period];
|
|
} else {
|
|
return [firstDepr, period];
|
|
}
|
|
}
|
|
var per = Math.ceil(1 / rate),
|
|
coeff;
|
|
if (cost == salvage || period > per) {
|
|
this.value = new cNumber(0);
|
|
} else {
|
|
if (per >= 3 && per < 5) {
|
|
coeff = 1.5;
|
|
} else {
|
|
if (per >= 5 && per < 6) {
|
|
coeff = 2;
|
|
} else {
|
|
if (per >= 6) {
|
|
coeff = 2.5;
|
|
} else {
|
|
this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
}
|
|
}
|
|
var deprR = rate * coeff,
|
|
o = firstDeprLinc(cost, datePurch, firstPer, salvage, deprR, per, basis);
|
|
var firstDeprLinc = o[0],
|
|
assetLife = o[1],
|
|
firstDepr = Math.round(firstDeprLinc);
|
|
if (period == 0) {
|
|
this.value = new cNumber(firstDepr);
|
|
} else {
|
|
this.value = findDepr(1, 0, deprR, (cost - firstDepr));
|
|
}
|
|
}
|
|
return this.value;
|
|
};
|
|
cAMORDEGRC.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( cost , date-purchased , first-period , salvage , period , rate [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cAMORLINC() {
|
|
this.name = "AMORLINC";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 6;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 7;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cAMORLINC.prototype = Object.create(cBaseFunction.prototype);
|
|
cAMORLINC.prototype.Calculate = function (arg) {
|
|
var cost = arg[0],
|
|
datePurch = arg[1],
|
|
firstPer = arg[2],
|
|
salvage = arg[3],
|
|
period = arg[4],
|
|
rate = arg[5],
|
|
basis = arg[6] && !(arg[6] instanceof cEmpty) ? arg[6] : new cNumber(0);
|
|
if (cost instanceof cArea || cost instanceof cArea3D) {
|
|
cost = cost.cross(arguments[1].first);
|
|
} else {
|
|
if (cost instanceof cArray) {
|
|
cost = cost.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (datePurch instanceof cArea || datePurch instanceof cArea3D) {
|
|
datePurch = datePurch.cross(arguments[1].first);
|
|
} else {
|
|
if (datePurch instanceof cArray) {
|
|
datePurch = datePurch.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (firstPer instanceof cArea || firstPer instanceof cArea3D) {
|
|
firstPer = firstPer.cross(arguments[1].first);
|
|
} else {
|
|
if (firstPer instanceof cArray) {
|
|
firstPer = firstPer.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (salvage instanceof cArea || salvage instanceof cArea3D) {
|
|
salvage = salvage.cross(arguments[1].first);
|
|
} else {
|
|
if (salvage instanceof cArray) {
|
|
salvage = salvage.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (period instanceof cArea || period instanceof cArea3D) {
|
|
period = period.cross(arguments[1].first);
|
|
} else {
|
|
if (period instanceof cArray) {
|
|
period = period.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
cost = cost.tocNumber();
|
|
datePurch = datePurch.tocNumber();
|
|
firstPer = firstPer.tocNumber();
|
|
salvage = salvage.tocNumber();
|
|
period = period.tocNumber();
|
|
rate = rate.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (cost instanceof cError) {
|
|
return this.value = cost;
|
|
}
|
|
if (datePurch instanceof cError) {
|
|
return this.value = datePurch;
|
|
}
|
|
if (firstPer instanceof cError) {
|
|
return this.value = firstPer;
|
|
}
|
|
if (salvage instanceof cError) {
|
|
return this.value = salvage;
|
|
}
|
|
if (period instanceof cError) {
|
|
return this.value = period;
|
|
}
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
cost = cost.getValue();
|
|
datePurch = datePurch.getValue();
|
|
firstPer = firstPer.getValue();
|
|
salvage = salvage.getValue();
|
|
period = period.getValue();
|
|
rate = rate.getValue();
|
|
basis = Math.floor(basis.getValue());
|
|
var val0 = Date.prototype.getDateFromExcel(datePurch),
|
|
val1 = Date.prototype.getDateFromExcel(firstPer);
|
|
if (cost < 0 || salvage < 0 || period < 0 || rate <= 0 || basis == 2 || basis < 0 || basis > 4 || datePurch < 0 || firstPer < 0 || datePurch > firstPer || cost < salvage) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var fDepTime = yearFrac(val0, val1, basis).getValue() * rate * cost,
|
|
fDep,
|
|
depr = rate * cost,
|
|
availDepr,
|
|
availDeprTemp,
|
|
countedPeriod = 1,
|
|
c = 0,
|
|
maxIter = 10000;
|
|
fDep = fDepTime == 0 ? cost * rate : fDepTime;
|
|
availDepr = (cost - salvage - fDep);
|
|
rate = Math.ceil(1 / rate);
|
|
if (cost == salvage || period > rate) {
|
|
return new cNumber(0);
|
|
} else {
|
|
if (period == 0) {
|
|
return new cNumber(fDep);
|
|
} else {
|
|
while (countedPeriod <= period && c < maxIter) {
|
|
depr = depr > availDepr ? availDepr : depr;
|
|
availDeprTemp = availDepr - depr;
|
|
availDepr = availDeprTemp < 0 ? 0 : availDeprTemp;
|
|
countedPeriod++;
|
|
c++;
|
|
}
|
|
return new cNumber(Math.floor(depr));
|
|
}
|
|
}
|
|
};
|
|
cAMORLINC.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( cost , date-purchased , first-period , salvage , period , rate [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cCOUPDAYBS() {
|
|
this.name = "COUPDAYBS";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 3;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 4;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cCOUPDAYBS.prototype = Object.create(cBaseFunction.prototype);
|
|
cCOUPDAYBS.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
frequency = arg[2],
|
|
basis = arg[3] && !(arg[3] instanceof cEmpty) ? arg[3] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (frequency instanceof cArea || frequency instanceof cArea3D) {
|
|
frequency = frequency.cross(arguments[1].first);
|
|
} else {
|
|
if (frequency instanceof cArray) {
|
|
frequency = frequency.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
frequency = frequency.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (frequency instanceof cError) {
|
|
return this.value = frequency;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
basis = Math.floor(basis.getValue());
|
|
frequency = Math.floor(frequency.getValue());
|
|
if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4)) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var settl = Date.prototype.getDateFromExcel(settlement),
|
|
matur = Date.prototype.getDateFromExcel(maturity);
|
|
return this.value = new cNumber(getcoupdaybs(settl, matur, frequency, basis));
|
|
};
|
|
cCOUPDAYBS.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , frequency [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cCOUPDAYS() {
|
|
this.name = "COUPDAYS";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 3;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 4;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cCOUPDAYS.prototype = Object.create(cBaseFunction.prototype);
|
|
cCOUPDAYS.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
frequency = arg[2],
|
|
basis = arg[3] && !(arg[3] instanceof cEmpty) ? arg[3] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (frequency instanceof cArea || frequency instanceof cArea3D) {
|
|
frequency = frequency.cross(arguments[1].first);
|
|
} else {
|
|
if (frequency instanceof cArray) {
|
|
frequency = frequency.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
frequency = frequency.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (frequency instanceof cError) {
|
|
return this.value = frequency;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
frequency = Math.floor(frequency.getValue());
|
|
basis = Math.floor(basis.getValue());
|
|
if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4)) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var settl = Date.prototype.getDateFromExcel(settlement),
|
|
matur = Date.prototype.getDateFromExcel(maturity);
|
|
return this.value = new cNumber(getcoupdays(settl, matur, frequency, basis));
|
|
};
|
|
cCOUPDAYS.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , frequency [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cCOUPDAYSNC() {
|
|
this.name = "COUPDAYSNC";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 3;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 4;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cCOUPDAYSNC.prototype = Object.create(cBaseFunction.prototype);
|
|
cCOUPDAYSNC.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
frequency = arg[2],
|
|
basis = arg[3] && !(arg[3] instanceof cEmpty) ? arg[3] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (frequency instanceof cArea || frequency instanceof cArea3D) {
|
|
frequency = frequency.cross(arguments[1].first);
|
|
} else {
|
|
if (frequency instanceof cArray) {
|
|
frequency = frequency.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
frequency = frequency.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (frequency instanceof cError) {
|
|
return this.value = frequency;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
frequency = Math.floor(frequency.getValue());
|
|
basis = Math.floor(basis.getValue());
|
|
if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4)) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var settl = Date.prototype.getDateFromExcel(settlement),
|
|
matur = Date.prototype.getDateFromExcel(maturity);
|
|
return this.value = new cNumber(getcoupdaysnc(new Date(settl), new Date(matur), frequency, basis));
|
|
};
|
|
cCOUPDAYSNC.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , frequency [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cCOUPNCD() {
|
|
this.name = "COUPNCD";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 3;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 4;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cCOUPNCD.prototype = Object.create(cBaseFunction.prototype);
|
|
cCOUPNCD.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
frequency = arg[2],
|
|
basis = arg[3] && !(arg[3] instanceof cEmpty) ? arg[3] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (frequency instanceof cArea || frequency instanceof cArea3D) {
|
|
frequency = frequency.cross(arguments[1].first);
|
|
} else {
|
|
if (frequency instanceof cArray) {
|
|
frequency = frequency.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
frequency = frequency.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (frequency instanceof cError) {
|
|
return this.value = frequency;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
frequency = Math.floor(frequency.getValue());
|
|
basis = Math.floor(basis.getValue());
|
|
if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4)) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var settl = Date.prototype.getDateFromExcel(settlement),
|
|
matur = Date.prototype.getDateFromExcel(maturity);
|
|
this.value = new cNumber(getcoupncd(settl, matur, frequency).getExcelDate());
|
|
this.value.numFormat = 14;
|
|
return this.value;
|
|
};
|
|
cCOUPNCD.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , frequency [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cCOUPNUM() {
|
|
this.name = "COUPNUM";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 3;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 4;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cCOUPNUM.prototype = Object.create(cBaseFunction.prototype);
|
|
cCOUPNUM.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
frequency = arg[2],
|
|
basis = arg[3] && !(arg[3] instanceof cEmpty) ? arg[3] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (frequency instanceof cArea || frequency instanceof cArea3D) {
|
|
frequency = frequency.cross(arguments[1].first);
|
|
} else {
|
|
if (frequency instanceof cArray) {
|
|
frequency = frequency.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
frequency = frequency.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (frequency instanceof cError) {
|
|
return this.value = frequency;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
frequency = Math.floor(frequency.getValue());
|
|
basis = Math.floor(basis.getValue());
|
|
if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4)) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var settl = Date.prototype.getDateFromExcel(settlement),
|
|
matur = Date.prototype.getDateFromExcel(maturity);
|
|
var res = getcoupnum(settl, matur, frequency);
|
|
return this.value = new cNumber(res);
|
|
};
|
|
cCOUPNUM.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , frequency [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cCOUPPCD() {
|
|
this.name = "COUPPCD";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 3;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 4;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cCOUPPCD.prototype = Object.create(cBaseFunction.prototype);
|
|
cCOUPPCD.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
frequency = arg[2],
|
|
basis = arg[3] && !(arg[3] instanceof cEmpty) ? arg[3] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (frequency instanceof cArea || frequency instanceof cArea3D) {
|
|
frequency = frequency.cross(arguments[1].first);
|
|
} else {
|
|
if (frequency instanceof cArray) {
|
|
frequency = frequency.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
frequency = frequency.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (frequency instanceof cError) {
|
|
return this.value = frequency;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
frequency = Math.floor(frequency.getValue());
|
|
basis = Math.floor(basis.getValue());
|
|
if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4)) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var settl = Date.prototype.getDateFromExcel(settlement),
|
|
matur = Date.prototype.getDateFromExcel(maturity);
|
|
var n = lcl_GetCouppcd(settl, matur, frequency);
|
|
this.value = new cNumber(n.getExcelDate());
|
|
this.value.numFormat = 14;
|
|
return this.value;
|
|
};
|
|
cCOUPPCD.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , frequency [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cCUMIPMT() {
|
|
this.name = "CUMIPMT";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 6;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 6;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cCUMIPMT.prototype = Object.create(cBaseFunction.prototype);
|
|
cCUMIPMT.prototype.Calculate = function (arg) {
|
|
var rate = arg[0],
|
|
nper = arg[1],
|
|
pv = arg[2],
|
|
startPeriod = arg[3],
|
|
endPeriod = arg[4],
|
|
type = arg[5];
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (nper instanceof cArea || nper instanceof cArea3D) {
|
|
nper = nper.cross(arguments[1].first);
|
|
} else {
|
|
if (nper instanceof cArray) {
|
|
nper = nper.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pv instanceof cArea || pv instanceof cArea3D) {
|
|
pv = pv.cross(arguments[1].first);
|
|
} else {
|
|
if (pv instanceof cArray) {
|
|
pv = pv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (startPeriod instanceof cArea || startPeriod instanceof cArea3D) {
|
|
startPeriod = startPeriod.cross(arguments[1].first);
|
|
} else {
|
|
if (startPeriod instanceof cArray) {
|
|
startPeriod = startPeriod.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (endPeriod instanceof cArea || endPeriod instanceof cArea3D) {
|
|
endPeriod = endPeriod.cross(arguments[1].first);
|
|
} else {
|
|
if (endPeriod instanceof cArray) {
|
|
endPeriod = endPeriod.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (type instanceof cArea || type instanceof cArea3D) {
|
|
type = type.cross(arguments[1].first);
|
|
} else {
|
|
if (type instanceof cArray) {
|
|
type = type.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
rate = rate.tocNumber();
|
|
nper = nper.tocNumber();
|
|
pv = pv.tocNumber();
|
|
startPeriod = startPeriod.tocNumber();
|
|
endPeriod = endPeriod.tocNumber();
|
|
type = type.tocNumber();
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (nper instanceof cError) {
|
|
return this.value = nper;
|
|
}
|
|
if (pv instanceof cError) {
|
|
return this.value = pv;
|
|
}
|
|
if (startPeriod instanceof cError) {
|
|
return this.value = startPeriod;
|
|
}
|
|
if (endPeriod instanceof cError) {
|
|
return this.value = endPeriod;
|
|
}
|
|
if (type instanceof cError) {
|
|
return this.value = type;
|
|
}
|
|
rate = rate.getValue();
|
|
nper = nper.getValue();
|
|
pv = pv.getValue();
|
|
startPeriod = startPeriod.getValue();
|
|
endPeriod = endPeriod.getValue();
|
|
type = type.getValue();
|
|
var fv, ipmt = 0;
|
|
if (startPeriod < 1 || endPeriod < startPeriod || rate <= 0 || endPeriod > nper || nper <= 0 || pv <= 0 || (type != 0 && type != 1)) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
fv = getPMT(rate, nper, pv, 0, type);
|
|
if (startPeriod == 1) {
|
|
if (type <= 0) {
|
|
ipmt = -pv;
|
|
}
|
|
startPeriod++;
|
|
}
|
|
for (var i = startPeriod; i <= endPeriod; i++) {
|
|
if (type > 0) {
|
|
ipmt += getFV(rate, i - 2, fv, pv, 1) - fv;
|
|
} else {
|
|
ipmt += getFV(rate, i - 1, fv, pv, 0);
|
|
}
|
|
}
|
|
ipmt *= rate;
|
|
return this.value = new cNumber(ipmt);
|
|
};
|
|
cCUMIPMT.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( rate , nper , pv , start-period , end-period , type )"
|
|
};
|
|
};
|
|
function cCUMPRINC() {
|
|
this.name = "CUMPRINC";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 6;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 6;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cCUMPRINC.prototype = Object.create(cBaseFunction.prototype);
|
|
cCUMPRINC.prototype.Calculate = function (arg) {
|
|
var rate = arg[0],
|
|
nper = arg[1],
|
|
pv = arg[2],
|
|
startPeriod = arg[3],
|
|
endPeriod = arg[4] && !(arg[4] instanceof cEmpty) ? arg[4] : new cNumber(0),
|
|
type = arg[5] && !(arg[5] instanceof cEmpty) ? arg[5] : new cNumber(0);
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (nper instanceof cArea || nper instanceof cArea3D) {
|
|
nper = nper.cross(arguments[1].first);
|
|
} else {
|
|
if (nper instanceof cArray) {
|
|
nper = nper.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pv instanceof cArea || pv instanceof cArea3D) {
|
|
pv = pv.cross(arguments[1].first);
|
|
} else {
|
|
if (pv instanceof cArray) {
|
|
pv = pv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (startPeriod instanceof cArea || startPeriod instanceof cArea3D) {
|
|
startPeriod = startPeriod.cross(arguments[1].first);
|
|
} else {
|
|
if (startPeriod instanceof cArray) {
|
|
startPeriod = startPeriod.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (endPeriod instanceof cArea || endPeriod instanceof cArea3D) {
|
|
endPeriod = endPeriod.cross(arguments[1].first);
|
|
} else {
|
|
if (endPeriod instanceof cArray) {
|
|
endPeriod = endPeriod.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (type instanceof cArea || type instanceof cArea3D) {
|
|
type = type.cross(arguments[1].first);
|
|
} else {
|
|
if (type instanceof cArray) {
|
|
type = type.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
rate = rate.tocNumber();
|
|
nper = nper.tocNumber();
|
|
pv = pv.tocNumber();
|
|
startPeriod = startPeriod.tocNumber();
|
|
endPeriod = endPeriod.tocNumber();
|
|
type = type.tocNumber();
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (nper instanceof cError) {
|
|
return this.value = nper;
|
|
}
|
|
if (pv instanceof cError) {
|
|
return this.value = pv;
|
|
}
|
|
if (startPeriod instanceof cError) {
|
|
return this.value = startPeriod;
|
|
}
|
|
if (endPeriod instanceof cError) {
|
|
return this.value = endPeriod;
|
|
}
|
|
if (type instanceof cError) {
|
|
return this.value = type;
|
|
}
|
|
rate = rate.getValue();
|
|
nper = nper.getValue();
|
|
pv = pv.getValue();
|
|
startPeriod = startPeriod.getValue();
|
|
endPeriod = endPeriod.getValue();
|
|
type = type.getValue();
|
|
var fv, res = 0,
|
|
nStart = startPeriod;
|
|
if (startPeriod < 1 || endPeriod < startPeriod || endPeriod < 1 || rate <= 0 || nper <= 0 || pv <= 0 || (type != 0 && type != 1)) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
fv = getPMT(rate, nper, pv, 0, type);
|
|
if (nStart == 1) {
|
|
if (type <= 0) {
|
|
res = fv + pv * rate;
|
|
} else {
|
|
res = fv;
|
|
}
|
|
nStart++;
|
|
}
|
|
for (var i = nStart; i <= endPeriod; i++) {
|
|
if (type > 0) {
|
|
res += fv - (getFV(rate, i - 2, fv, pv, 1) - fv) * rate;
|
|
} else {
|
|
res += fv - getFV(rate, i - 1, fv, pv, 0) * rate;
|
|
}
|
|
}
|
|
return this.value = new cNumber(res);
|
|
};
|
|
cCUMPRINC.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( rate , nper , pv , start-period , end-period , type )"
|
|
};
|
|
};
|
|
function cDB() {
|
|
this.name = "DB";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 4;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 5;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cDB.prototype = Object.create(cBaseFunction.prototype);
|
|
cDB.prototype.Calculate = function (arg) {
|
|
var cost = arg[0],
|
|
salvage = arg[1],
|
|
life = arg[2],
|
|
period = arg[3],
|
|
month = arg[4] && !(arg[4] instanceof cEmpty) ? arg[4] : new cNumber(12);
|
|
if (cost instanceof cArea || cost instanceof cArea3D) {
|
|
cost = cost.cross(arguments[1].first);
|
|
} else {
|
|
if (cost instanceof cArray) {
|
|
cost = cost.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (salvage instanceof cArea || salvage instanceof cArea3D) {
|
|
salvage = salvage.cross(arguments[1].first);
|
|
} else {
|
|
if (salvage instanceof cArray) {
|
|
salvage = salvage.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (life instanceof cArea || life instanceof cArea3D) {
|
|
life = life.cross(arguments[1].first);
|
|
} else {
|
|
if (life instanceof cArray) {
|
|
life = life.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (period instanceof cArea || period instanceof cArea3D) {
|
|
period = period.cross(arguments[1].first);
|
|
} else {
|
|
if (period instanceof cArray) {
|
|
period = period.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (month instanceof cArea || month instanceof cArea3D) {
|
|
month = month.cross(arguments[1].first);
|
|
} else {
|
|
if (month instanceof cArray) {
|
|
month = month.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
cost = cost.tocNumber();
|
|
salvage = salvage.tocNumber();
|
|
life = life.tocNumber();
|
|
period = period.tocNumber();
|
|
month = month.tocNumber();
|
|
if (cost instanceof cError) {
|
|
return this.value = cost;
|
|
}
|
|
if (salvage instanceof cError) {
|
|
return this.value = salvage;
|
|
}
|
|
if (life instanceof cError) {
|
|
return this.value = life;
|
|
}
|
|
if (period instanceof cError) {
|
|
return this.value = period;
|
|
}
|
|
if (month instanceof cError) {
|
|
return this.value = month;
|
|
}
|
|
cost = cost.getValue();
|
|
salvage = salvage.getValue();
|
|
life = life.getValue();
|
|
period = period.getValue();
|
|
month = Math.floor(month.getValue());
|
|
if (salvage >= cost) {
|
|
return this.value = new cNumber(0);
|
|
}
|
|
if (month < 1 || month > 12 || salvage < 0 || life < 0 || period < 0 || life + 1 < period || cost < 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var rate = 1 - Math.pow(salvage / cost, 1 / life);
|
|
rate = Math.floor((rate * 1000) + 0.5) / 1000;
|
|
var firstRate = cost * rate * month / 12;
|
|
var res = 0;
|
|
if (Math.floor(period) == 1) {
|
|
res = firstRate;
|
|
} else {
|
|
var sum = firstRate,
|
|
min = life;
|
|
if (min > period) {
|
|
min = period;
|
|
}
|
|
var max = Math.floor(min);
|
|
for (var i = 2; i <= max; i++) {
|
|
res = (cost - sum) * rate;
|
|
sum += res;
|
|
}
|
|
if (period > life) {
|
|
res = ((cost - sum) * rate * (12 - month)) / 12;
|
|
}
|
|
}
|
|
this.value = new cNumber(res);
|
|
return this.value;
|
|
};
|
|
cDB.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( cost , salvage , life , period [ , [ month ] ] )"
|
|
};
|
|
};
|
|
function cDDB() {
|
|
this.name = "DDB";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 4;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 5;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cDDB.prototype = Object.create(cBaseFunction.prototype);
|
|
cDDB.prototype.Calculate = function (arg) {
|
|
var cost = arg[0],
|
|
salvage = arg[1],
|
|
life = arg[2],
|
|
period = arg[3],
|
|
factor = arg[4] && !(arg[4] instanceof cEmpty) ? arg[4] : new cNumber(2);
|
|
if (cost instanceof cArea || cost instanceof cArea3D) {
|
|
cost = cost.cross(arguments[1].first);
|
|
} else {
|
|
if (cost instanceof cArray) {
|
|
cost = cost.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (salvage instanceof cArea || salvage instanceof cArea3D) {
|
|
salvage = salvage.cross(arguments[1].first);
|
|
} else {
|
|
if (salvage instanceof cArray) {
|
|
salvage = salvage.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (life instanceof cArea || life instanceof cArea3D) {
|
|
life = life.cross(arguments[1].first);
|
|
} else {
|
|
if (life instanceof cArray) {
|
|
life = life.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (period instanceof cArea || period instanceof cArea3D) {
|
|
period = period.cross(arguments[1].first);
|
|
} else {
|
|
if (period instanceof cArray) {
|
|
period = period.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (factor instanceof cArea || factor instanceof cArea3D) {
|
|
factor = factor.cross(arguments[1].first);
|
|
} else {
|
|
if (factor instanceof cArray) {
|
|
factor = factor.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
cost = cost.tocNumber();
|
|
salvage = salvage.tocNumber();
|
|
life = life.tocNumber();
|
|
period = period.tocNumber();
|
|
factor = factor.tocNumber();
|
|
if (cost instanceof cError) {
|
|
return this.value = cost;
|
|
}
|
|
if (salvage instanceof cError) {
|
|
return this.value = salvage;
|
|
}
|
|
if (life instanceof cError) {
|
|
return this.value = life;
|
|
}
|
|
if (period instanceof cError) {
|
|
return this.value = period;
|
|
}
|
|
if (factor instanceof cError) {
|
|
return this.value = factor;
|
|
}
|
|
cost = cost.getValue();
|
|
salvage = salvage.getValue();
|
|
life = life.getValue();
|
|
period = period.getValue();
|
|
factor = factor.getValue();
|
|
if (cost == 0 || salvage == 0) {
|
|
return this.value = new cNumber(0);
|
|
}
|
|
if (cost < salvage || cost <= 0 || salvage < 0 || factor <= 0 || life <= 0 || period <= 0 || life < period) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
this.value = new cNumber(getDDB(cost, salvage, life, period, factor));
|
|
return this.value;
|
|
};
|
|
cDDB.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( cost , salvage , life , period [ , factor ] )"
|
|
};
|
|
};
|
|
function cDISC() {
|
|
this.name = "DISC";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 4;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 5;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cDISC.prototype = Object.create(cBaseFunction.prototype);
|
|
cDISC.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
pr = arg[2],
|
|
redemption = arg[3],
|
|
basis = arg[4] && !(arg[4] instanceof cEmpty) ? arg[4] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pr instanceof cArea || pr instanceof cArea3D) {
|
|
pr = pr.cross(arguments[1].first);
|
|
} else {
|
|
if (pr instanceof cArray) {
|
|
pr = pr.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (redemption instanceof cArea || redemption instanceof cArea3D) {
|
|
redemption = redemption.cross(arguments[1].first);
|
|
} else {
|
|
if (redemption instanceof cArray) {
|
|
redemption = redemption.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
pr = pr.tocNumber();
|
|
redemption = redemption.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (pr instanceof cError) {
|
|
return this.value = pr;
|
|
}
|
|
if (redemption instanceof cError) {
|
|
return this.value = redemption;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
pr = pr.getValue();
|
|
redemption = redemption.getValue();
|
|
basis = Math.floor(basis.getValue());
|
|
if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || pr <= 0 || redemption <= 0 || basis < 0 || basis > 4) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var res = (1 - pr / redemption) / yearFrac(Date.prototype.getDateFromExcel(settlement), Date.prototype.getDateFromExcel(maturity), basis);
|
|
this.value = new cNumber(res);
|
|
this.value.numFormat = 9;
|
|
return this.value;
|
|
};
|
|
cDISC.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , pr , redemption [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cDOLLARDE() {
|
|
this.name = "DOLLARDE";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 2;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 2;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cDOLLARDE.prototype = Object.create(cBaseFunction.prototype);
|
|
cDOLLARDE.prototype.Calculate = function (arg) {
|
|
var fractionalDollar = arg[0],
|
|
fraction = arg[1];
|
|
if (fractionalDollar instanceof cArea || fractionalDollar instanceof cArea3D) {
|
|
fractionalDollar = fractionalDollar.cross(arguments[1].first);
|
|
} else {
|
|
if (fractionalDollar instanceof cArray) {
|
|
fractionalDollar = fractionalDollar.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (fraction instanceof cArea || fraction instanceof cArea3D) {
|
|
fraction = fraction.cross(arguments[1].first);
|
|
} else {
|
|
if (fraction instanceof cArray) {
|
|
fraction = fraction.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
fractionalDollar = fractionalDollar.tocNumber();
|
|
fraction = fraction.tocNumber();
|
|
if (fractionalDollar instanceof cError) {
|
|
return this.value = fractionalDollar;
|
|
}
|
|
if (fraction instanceof cError) {
|
|
return this.value = fraction;
|
|
}
|
|
fractionalDollar = fractionalDollar.getValue();
|
|
fraction = fraction.getValue();
|
|
if (fraction < 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
} else {
|
|
if (fraction == 0) {
|
|
return this.value = new cError(cErrorType.division_by_zero);
|
|
}
|
|
}
|
|
fraction = Math.floor(fraction);
|
|
var fInt = Math.floor(fractionalDollar),
|
|
res = fractionalDollar - fInt;
|
|
res /= fraction;
|
|
res *= Math.pow(10, Math.ceil(Math.log10(fraction)));
|
|
res += fInt;
|
|
return this.value = new cNumber(res);
|
|
};
|
|
cDOLLARDE.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( fractional-dollar , fraction )"
|
|
};
|
|
};
|
|
function cDOLLARFR() {
|
|
this.name = "DOLLARFR";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 2;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 2;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cDOLLARFR.prototype = Object.create(cBaseFunction.prototype);
|
|
cDOLLARFR.prototype.Calculate = function (arg) {
|
|
var decimalDollar = arg[0],
|
|
fraction = arg[1];
|
|
if (decimalDollar instanceof cArea || decimalDollar instanceof cArea3D) {
|
|
decimalDollar = decimalDollar.cross(arguments[1].first);
|
|
} else {
|
|
if (decimalDollar instanceof cArray) {
|
|
decimalDollar = decimalDollar.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (fraction instanceof cArea || fraction instanceof cArea3D) {
|
|
fraction = fraction.cross(arguments[1].first);
|
|
} else {
|
|
if (fraction instanceof cArray) {
|
|
fraction = fraction.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
decimalDollar = decimalDollar.tocNumber();
|
|
fraction = fraction.tocNumber();
|
|
if (decimalDollar instanceof cError) {
|
|
return this.value = decimalDollar;
|
|
}
|
|
if (fraction instanceof cError) {
|
|
return this.value = fraction;
|
|
}
|
|
decimalDollar = decimalDollar.getValue();
|
|
fraction = fraction.getValue();
|
|
if (fraction < 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
} else {
|
|
if (fraction == 0) {
|
|
return this.value = new cError(cErrorType.division_by_zero);
|
|
}
|
|
}
|
|
fraction = Math.floor(fraction);
|
|
var fInt = Math.floor(decimalDollar),
|
|
res = decimalDollar - fInt;
|
|
res *= fraction;
|
|
res *= Math.pow(10, -Math.ceil(Math.log10(fraction)));
|
|
res += fInt;
|
|
return this.value = new cNumber(res);
|
|
};
|
|
cDOLLARFR.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( decimal-dollar , fraction )"
|
|
};
|
|
};
|
|
function cDURATION() {
|
|
this.name = "DURATION";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 5;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 6;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cDURATION.prototype = Object.create(cBaseFunction.prototype);
|
|
cDURATION.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
coupon = arg[2],
|
|
yld = arg[3],
|
|
frequency = arg[4],
|
|
basis = arg[5] && !(arg[5] instanceof cEmpty) ? arg[5] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (coupon instanceof cArea || coupon instanceof cArea3D) {
|
|
coupon = coupon.cross(arguments[1].first);
|
|
} else {
|
|
if (coupon instanceof cArray) {
|
|
coupon = coupon.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (yld instanceof cArea || yld instanceof cArea3D) {
|
|
yld = yld.cross(arguments[1].first);
|
|
} else {
|
|
if (yld instanceof cArray) {
|
|
yld = yld.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (frequency instanceof cArea || frequency instanceof cArea3D) {
|
|
frequency = frequency.cross(arguments[1].first);
|
|
} else {
|
|
if (frequency instanceof cArray) {
|
|
frequency = frequency.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
coupon = coupon.tocNumber();
|
|
yld = yld.tocNumber();
|
|
frequency = frequency.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (coupon instanceof cError) {
|
|
return this.value = coupon;
|
|
}
|
|
if (yld instanceof cError) {
|
|
return this.value = yld;
|
|
}
|
|
if (frequency instanceof cError) {
|
|
return this.value = frequency;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
coupon = coupon.getValue();
|
|
yld = yld.getValue();
|
|
frequency = Math.floor(frequency.getValue());
|
|
basis = Math.floor(basis.getValue());
|
|
if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4) || yld < 0 || coupon < 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var settl = Date.prototype.getDateFromExcel(settlement),
|
|
matur = Date.prototype.getDateFromExcel(maturity);
|
|
return this.value = new cNumber(getduration(settl, matur, coupon, yld, frequency, basis));
|
|
};
|
|
cDURATION.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , coupon , yld , frequency [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cEFFECT() {
|
|
this.name = "EFFECT";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 2;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 2;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cEFFECT.prototype = Object.create(cBaseFunction.prototype);
|
|
cEFFECT.prototype.Calculate = function (arg) {
|
|
var nominalRate = arg[0],
|
|
npery = arg[1];
|
|
if (nominalRate instanceof cArea || nominalRate instanceof cArea3D) {
|
|
nominalRate = nominalRate.cross(arguments[1].first);
|
|
} else {
|
|
if (nominalRate instanceof cArray) {
|
|
nominalRate = nominalRate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (npery instanceof cArea || npery instanceof cArea3D) {
|
|
npery = npery.cross(arguments[1].first);
|
|
} else {
|
|
if (npery instanceof cArray) {
|
|
npery = npery.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
nominalRate = nominalRate.tocNumber();
|
|
npery = npery.tocNumber();
|
|
if (nominalRate instanceof cError) {
|
|
return this.value = nominalRate;
|
|
}
|
|
if (npery instanceof cError) {
|
|
return this.value = npery;
|
|
}
|
|
nominalRate = nominalRate.getValue();
|
|
npery = Math.floor(npery.getValue());
|
|
if (nominalRate <= 0 || npery < 1) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
return this.value = new cNumber(Math.pow((1 + nominalRate / npery), npery) - 1);
|
|
};
|
|
cEFFECT.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( nominal-rate , npery )"
|
|
};
|
|
};
|
|
function cFV() {
|
|
this.name = "FV";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 3;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 5;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cFV.prototype = Object.create(cBaseFunction.prototype);
|
|
cFV.prototype.Calculate = function (arg) {
|
|
var rate = arg[0],
|
|
nper = arg[1],
|
|
pmt = arg[2],
|
|
pv = arg[3] ? arg[3] : new cNumber(0),
|
|
type = arg[4] ? arg[4] : new cNumber(0);
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (nper instanceof cArea || nper instanceof cArea3D) {
|
|
nper = nper.cross(arguments[1].first);
|
|
} else {
|
|
if (nper instanceof cArray) {
|
|
nper = nper.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pmt instanceof cArea || pmt instanceof cArea3D) {
|
|
pmt = pmt.cross(arguments[1].first);
|
|
} else {
|
|
if (pmt instanceof cArray) {
|
|
pmt = pmt.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pv instanceof cArea || pv instanceof cArea3D) {
|
|
pv = pv.cross(arguments[1].first);
|
|
} else {
|
|
if (pv instanceof cArray) {
|
|
pv = pv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (type instanceof cArea || type instanceof cArea3D) {
|
|
type = type.cross(arguments[1].first);
|
|
} else {
|
|
if (type instanceof cArray) {
|
|
type = type.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
rate = rate.tocNumber();
|
|
nper = nper.tocNumber();
|
|
pmt = pmt.tocNumber();
|
|
pv = pv.tocNumber();
|
|
type = type.tocNumber();
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (nper instanceof cError) {
|
|
return this.value = nper;
|
|
}
|
|
if (pmt instanceof cError) {
|
|
return this.value = pmt;
|
|
}
|
|
if (pv instanceof cError) {
|
|
return this.value = pv;
|
|
}
|
|
if (type instanceof cError) {
|
|
return this.value = type;
|
|
}
|
|
if (type.getValue() != 1 && type.getValue() != 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var res;
|
|
if (rate.getValue() != 0) {
|
|
res = -1 * (pv.getValue() * Math.pow(1 + rate.getValue(), nper.getValue()) + pmt.getValue() * (1 + rate.getValue() * type.getValue()) * (Math.pow((1 + rate.getValue()), nper.getValue()) - 1) / rate.getValue());
|
|
} else {
|
|
res = -1 * (pv.getValue() + pmt.getValue() * nper.getValue());
|
|
}
|
|
return this.value = new cNumber(res);
|
|
};
|
|
cFV.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( rate , nper , pmt [ , [ pv ] [ ,[ type ] ] ] )"
|
|
};
|
|
};
|
|
function cFVSCHEDULE() {
|
|
this.name = "FVSCHEDULE";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 2;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 2;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cFVSCHEDULE.prototype = Object.create(cBaseFunction.prototype);
|
|
cFVSCHEDULE.prototype.Calculate = function (arg) {
|
|
var principal = arg[0],
|
|
schedule = arg[1],
|
|
shedList = [];
|
|
if (principal instanceof cArea || principal instanceof cArea3D) {
|
|
principal = principal.cross(arguments[1].first);
|
|
} else {
|
|
if (principal instanceof cArray) {
|
|
principal = principal.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (schedule instanceof cArea || schedule instanceof cArea3D) {
|
|
schedule.foreach2(function (v) {
|
|
shedList.push(v.tocNumber());
|
|
});
|
|
} else {
|
|
if (schedule instanceof cArray) {
|
|
schedule.foreach(function (v) {
|
|
shedList.push(v.tocNumber());
|
|
});
|
|
} else {
|
|
shedList.push(schedule.tocNumber());
|
|
}
|
|
}
|
|
principal = principal.tocNumber();
|
|
if (principal instanceof cError) {
|
|
return this.value = principal;
|
|
}
|
|
var princ = principal.getValue();
|
|
for (var i = 0; i < shedList.length; i++) {
|
|
if (shedList[i] instanceof cError) {
|
|
return this.value = new cError(cErrorType.wrong_value_type);
|
|
} else {
|
|
princ *= 1 + shedList[i].getValue();
|
|
}
|
|
}
|
|
return this.value = new cNumber(princ);
|
|
};
|
|
cFVSCHEDULE.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( principal , schedule )"
|
|
};
|
|
};
|
|
function cINTRATE() {
|
|
this.name = "INTRATE";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 4;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 5;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cINTRATE.prototype = Object.create(cBaseFunction.prototype);
|
|
cINTRATE.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
investment = arg[2],
|
|
redemption = arg[3],
|
|
basis = arg[4] && !(arg[4] instanceof cEmpty) ? arg[4] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (investment instanceof cArea || investment instanceof cArea3D) {
|
|
investment = investment.cross(arguments[1].first);
|
|
} else {
|
|
if (investment instanceof cArray) {
|
|
investment = investment.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (redemption instanceof cArea || redemption instanceof cArea3D) {
|
|
redemption = redemption.cross(arguments[1].first);
|
|
} else {
|
|
if (redemption instanceof cArray) {
|
|
redemption = redemption.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
investment = investment.tocNumber();
|
|
redemption = redemption.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (investment instanceof cError) {
|
|
return this.value = investment;
|
|
}
|
|
if (redemption instanceof cError) {
|
|
return this.value = redemption;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
investment = investment.getValue();
|
|
redemption = redemption.getValue();
|
|
basis = Math.floor(basis.getValue());
|
|
if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || investment <= 0 || redemption <= 0 || basis < 0 || basis > 4) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var res = ((redemption / investment) - 1) / yearFrac(Date.prototype.getDateFromExcel(settlement), Date.prototype.getDateFromExcel(maturity), basis);
|
|
this.value = new cNumber(res);
|
|
this.value.numFormat = 9;
|
|
return this.value;
|
|
};
|
|
cINTRATE.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , pr , redemption [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cIPMT() {
|
|
this.name = "IPMT";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 4;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 6;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cIPMT.prototype = Object.create(cBaseFunction.prototype);
|
|
cIPMT.prototype.Calculate = function (arg) {
|
|
var rate = arg[0],
|
|
per = arg[1],
|
|
nper = arg[2],
|
|
pv = arg[3],
|
|
fv = arg[4] ? arg[4] : new cNumber(0),
|
|
type = arg[5] ? arg[5] : new cNumber(0);
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (per instanceof cArea || per instanceof cArea3D) {
|
|
per = per.cross(arguments[1].first);
|
|
} else {
|
|
if (per instanceof cArray) {
|
|
per = per.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (nper instanceof cArea || nper instanceof cArea3D) {
|
|
nper = nper.cross(arguments[1].first);
|
|
} else {
|
|
if (nper instanceof cArray) {
|
|
nper = nper.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pv instanceof cArea || pv instanceof cArea3D) {
|
|
pv = pv.cross(arguments[1].first);
|
|
} else {
|
|
if (pv instanceof cArray) {
|
|
pv = pv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (fv instanceof cArea || fv instanceof cArea3D) {
|
|
fv = fv.cross(arguments[1].first);
|
|
} else {
|
|
if (fv instanceof cArray) {
|
|
fv = fv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (type instanceof cArea || type instanceof cArea3D) {
|
|
type = type.cross(arguments[1].first);
|
|
} else {
|
|
if (type instanceof cArray) {
|
|
type = type.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
rate = rate.tocNumber();
|
|
per = per.tocNumber();
|
|
nper = nper.tocNumber();
|
|
pv = pv.tocNumber();
|
|
fv = fv.tocNumber();
|
|
type = type.tocNumber();
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (per instanceof cError) {
|
|
return this.value = per;
|
|
}
|
|
if (nper instanceof cError) {
|
|
return this.value = nper;
|
|
}
|
|
if (pv instanceof cError) {
|
|
return this.value = pv;
|
|
}
|
|
if (fv instanceof cError) {
|
|
return this.value = fv;
|
|
}
|
|
if (type instanceof cError) {
|
|
return this.value = type;
|
|
}
|
|
rate = rate.getValue();
|
|
per = per.getValue();
|
|
nper = nper.getValue();
|
|
pv = pv.getValue();
|
|
fv = fv.getValue();
|
|
type = type.getValue();
|
|
var res;
|
|
if (per < 1 || per > nper || type != 0 && type != 1) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
res = getPMT(rate, nper, pv, fv, type);
|
|
this.value = new cNumber(getIPMT(rate, per, pv, type, res));
|
|
return this.value;
|
|
};
|
|
cIPMT.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( rate , per , nper , pv [ , [ fv ] [ , [ type ] ] ] )"
|
|
};
|
|
};
|
|
function cIRR() {
|
|
this.name = "IRR";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 1;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 2;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cIRR.prototype = Object.create(cBaseFunction.prototype);
|
|
cIRR.prototype.Calculate = function (arg) {
|
|
var arg0 = arg[0],
|
|
arg1 = arg[1] ? arg[1] : new cNumber(0.1);
|
|
function npv(r, cf) {
|
|
var res = 0;
|
|
for (var i = 1; i <= cf.length; i++) {
|
|
res += cf[i - 1].getValue() / Math.pow(1 + r, i);
|
|
}
|
|
return res;
|
|
}
|
|
function irr2(x, arr) {
|
|
var g_Eps = 1e-07,
|
|
nIM = 500,
|
|
eps = 1,
|
|
nMC = 0,
|
|
xN, guess = x;
|
|
while (eps > g_Eps && nMC < nIM) {
|
|
xN = x - npv(x, arr) / ((npv(x + g_Eps, arr) - npv(x - g_Eps, arr)) / (2 * g_Eps));
|
|
nMC++;
|
|
eps = Math.abs(xN - x);
|
|
x = xN;
|
|
}
|
|
if (isNaN(x) || Infinity == Math.abs(x)) {
|
|
var max = Number.MAX_VALUE,
|
|
min = -Number.MAX_VALUE,
|
|
step = 1.6,
|
|
low = guess - 0.01 <= min ? min + g_Eps : guess - 0.01,
|
|
high = guess + 0.01 >= max ? max - g_Eps : guess + 0.01,
|
|
i,
|
|
xBegin,
|
|
xEnd,
|
|
x,
|
|
y,
|
|
currentIter = 0;
|
|
if (guess <= min || guess >= max) {
|
|
return new cError(cErrorType.not_numeric);
|
|
}
|
|
for (i = 0; i < nIM; i++) {
|
|
xBegin = low <= min ? min + g_Eps : low;
|
|
xEnd = high >= max ? max - g_Eps : high;
|
|
x = npv(xBegin, arr);
|
|
y = npv(xEnd, arr);
|
|
if (x * y <= 0) {
|
|
break;
|
|
} else {
|
|
if (x * y > 0) {
|
|
low = (xBegin + step * (xBegin - xEnd));
|
|
high = (xEnd + step * (xEnd - xBegin));
|
|
} else {
|
|
return new cError(cErrorType.not_numeric);
|
|
}
|
|
}
|
|
}
|
|
if (i == nIM) {
|
|
return new cError(cErrorType.not_numeric);
|
|
}
|
|
var fXbegin = npv(xBegin, arr),
|
|
fXend = npv(xEnd, arr),
|
|
fXi,
|
|
xI;
|
|
if (Math.abs(fXbegin) < g_Eps) {
|
|
return new cNumber(fXbegin);
|
|
}
|
|
if (Math.abs(fXend) < g_Eps) {
|
|
return new cNumber(fXend);
|
|
}
|
|
do {
|
|
xI = xBegin + (xEnd - xBegin) / 2;
|
|
fXi = npv(xI, arr);
|
|
if (fXbegin * fXi < 0) {
|
|
xEnd = xI;
|
|
} else {
|
|
xBegin = xI;
|
|
}
|
|
fXbegin = npv(xBegin, arr);
|
|
currentIter++;
|
|
} while (Math.abs(fXi) > g_Eps && currentIter < nIM);
|
|
return new cNumber(xI);
|
|
} else {
|
|
return new cNumber(x);
|
|
}
|
|
}
|
|
var arr = [];
|
|
if (arg0 instanceof cArray) {
|
|
arg0.foreach(function (v) {
|
|
if (v instanceof cNumber) {
|
|
arr.push(v);
|
|
}
|
|
});
|
|
} else {
|
|
if (arg0 instanceof cArea) {
|
|
arg0.foreach2(function (v) {
|
|
if (v instanceof cNumber) {
|
|
arr.push(v);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
arg1 = arg1.tocNumber();
|
|
if (arg1 instanceof cError) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var wasNeg = false,
|
|
wasPos = false;
|
|
for (var i = 0; i < arr.length; i++) {
|
|
if (arr[i].getValue() > 0) {
|
|
wasNeg = true;
|
|
}
|
|
if (arr[i].getValue() < 0) {
|
|
wasPos = true;
|
|
}
|
|
}
|
|
if (! (wasNeg && wasPos)) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
this.value = irr2(arg1.getValue(), arr);
|
|
this.value.numFormat = 9;
|
|
return this.value;
|
|
};
|
|
cIRR.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( values [ , [ guess ] ] )"
|
|
};
|
|
};
|
|
function cISPMT() {
|
|
this.name = "ISPMT";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 4;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 4;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cISPMT.prototype = Object.create(cBaseFunction.prototype);
|
|
cISPMT.prototype.Calculate = function (arg) {
|
|
var rate = arg[0],
|
|
per = arg[1],
|
|
nper = arg[2],
|
|
pv = arg[3];
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (per instanceof cArea || per instanceof cArea3D) {
|
|
per = per.cross(arguments[1].first);
|
|
} else {
|
|
if (per instanceof cArray) {
|
|
per = per.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (nper instanceof cArea || nper instanceof cArea3D) {
|
|
nper = nper.cross(arguments[1].first);
|
|
} else {
|
|
if (nper instanceof cArray) {
|
|
nper = nper.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pv instanceof cArea || pv instanceof cArea3D) {
|
|
pv = pv.cross(arguments[1].first);
|
|
} else {
|
|
if (pv instanceof cArray) {
|
|
pv = pv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
rate = rate.tocNumber();
|
|
per = per.tocNumber();
|
|
nper = nper.tocNumber();
|
|
pv = pv.tocNumber();
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (per instanceof cError) {
|
|
return this.value = per;
|
|
}
|
|
if (nper instanceof cError) {
|
|
return this.value = nper;
|
|
}
|
|
if (pv instanceof cError) {
|
|
return this.value = pv;
|
|
}
|
|
if (nper.getValue() == 0) {
|
|
return this.value = new cError(cErrorType.division_by_zero);
|
|
}
|
|
return this.value = new cNumber(pv.getValue() * rate.getValue() * (per.getValue() / nper.getValue() - 1));
|
|
};
|
|
cISPMT.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( rate , per , nper , pv )"
|
|
};
|
|
};
|
|
function cMDURATION() {
|
|
this.name = "MDURATION";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 5;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 6;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cMDURATION.prototype = Object.create(cBaseFunction.prototype);
|
|
cMDURATION.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
coupon = arg[2],
|
|
yld = arg[3],
|
|
frequency = arg[4],
|
|
basis = arg[5] && !(arg[5] instanceof cEmpty) ? arg[5] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (coupon instanceof cArea || coupon instanceof cArea3D) {
|
|
coupon = coupon.cross(arguments[1].first);
|
|
} else {
|
|
if (coupon instanceof cArray) {
|
|
coupon = coupon.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (yld instanceof cArea || yld instanceof cArea3D) {
|
|
yld = yld.cross(arguments[1].first);
|
|
} else {
|
|
if (yld instanceof cArray) {
|
|
yld = yld.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (frequency instanceof cArea || frequency instanceof cArea3D) {
|
|
frequency = frequency.cross(arguments[1].first);
|
|
} else {
|
|
if (frequency instanceof cArray) {
|
|
frequency = frequency.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
coupon = coupon.tocNumber();
|
|
yld = yld.tocNumber();
|
|
frequency = frequency.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (coupon instanceof cError) {
|
|
return this.value = coupon;
|
|
}
|
|
if (yld instanceof cError) {
|
|
return this.value = yld;
|
|
}
|
|
if (frequency instanceof cError) {
|
|
return this.value = frequency;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
coupon = coupon.getValue();
|
|
yld = yld.getValue();
|
|
frequency = Math.floor(frequency.getValue());
|
|
basis = Math.floor(basis.getValue());
|
|
if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4) || yld < 0 || coupon < 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var settl = Date.prototype.getDateFromExcel(settlement),
|
|
matur = Date.prototype.getDateFromExcel(maturity);
|
|
var duration = getduration(settl, matur, coupon, yld, frequency, basis);
|
|
duration /= 1 + yld / frequency;
|
|
return this.value = new cNumber(duration);
|
|
};
|
|
cMDURATION.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , coupon , yld , frequency [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cMIRR() {
|
|
this.name = "MIRR";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 3;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 3;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cMIRR.prototype = Object.create(cBaseFunction.prototype);
|
|
cMIRR.prototype.Calculate = function (arg) {
|
|
var arg0 = arg[0],
|
|
invest = arg[1],
|
|
reinvest = arg[2];
|
|
var valueArray = [];
|
|
if (arg0 instanceof cArea) {
|
|
arg0.foreach2(function (c) {
|
|
if (c instanceof cNumber || c instanceof cError) {
|
|
valueArray.push(c);
|
|
}
|
|
});
|
|
} else {
|
|
if (arg0 instanceof cArray) {
|
|
arg0.foreach(function (c) {
|
|
if (c instanceof cNumber || c instanceof cError) {
|
|
valueArray.push(c);
|
|
}
|
|
});
|
|
} else {
|
|
if (arg0 instanceof cArea3D) {
|
|
if (arg0.wsFrom == arg0.wsTo) {
|
|
valueArray = arg0.getMatrix()[0];
|
|
} else {
|
|
return this.value = new cError(cErrorType.wrong_value_type);
|
|
}
|
|
} else {
|
|
if (arg0 instanceof cError) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
} else {
|
|
if (arg0 instanceof cNumber) {
|
|
valueArray.push(arg0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (invest instanceof cArea || invest instanceof cArea3D) {
|
|
invest = invest.cross(arguments[1].first);
|
|
} else {
|
|
if (invest instanceof cArray) {
|
|
invest = invest.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (reinvest instanceof cArea || reinvest instanceof cArea3D) {
|
|
reinvest = reinvest.cross(arguments[1].first);
|
|
} else {
|
|
if (reinvest instanceof cArray) {
|
|
reinvest = reinvest.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
invest = invest.tocNumber();
|
|
reinvest = reinvest.tocNumber();
|
|
if (invest instanceof cError) {
|
|
return this.value = invest;
|
|
}
|
|
if (reinvest instanceof cError) {
|
|
return this.value = reinvest;
|
|
}
|
|
invest = invest.getValue() + 1;
|
|
reinvest = reinvest.getValue() + 1;
|
|
var NPVreinvest = 0,
|
|
POWreinvest = 1,
|
|
NPVinvest = 0,
|
|
POWinvest = 1,
|
|
cellValue, wasNegative = false,
|
|
wasPositive = false;
|
|
for (var i = 0; i < valueArray.length; i++) {
|
|
cellValue = valueArray[i];
|
|
if (cellValue instanceof cError) {
|
|
return this.value = cellValue;
|
|
}
|
|
cellValue = valueArray[i].getValue();
|
|
if (cellValue > 0) {
|
|
wasPositive = true;
|
|
NPVreinvest += cellValue * POWreinvest;
|
|
} else {
|
|
if (cellValue < 0) {
|
|
wasNegative = true;
|
|
NPVinvest += cellValue * POWinvest;
|
|
}
|
|
}
|
|
POWreinvest /= reinvest;
|
|
POWinvest /= invest;
|
|
}
|
|
if (! (wasNegative && wasPositive)) {
|
|
return this.value = new cError(cErrorType.division_by_zero);
|
|
}
|
|
var res = -NPVreinvest / NPVinvest;
|
|
res *= Math.pow(reinvest, valueArray.length - 1);
|
|
res = Math.pow(res, 1 / (valueArray.length - 1));
|
|
this.value = new cNumber(res - 1);
|
|
this.value.numFormat = 9;
|
|
return this.value;
|
|
};
|
|
cMIRR.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( values , finance-rate , reinvest-rate )"
|
|
};
|
|
};
|
|
function cNOMINAL() {
|
|
this.name = "NOMINAL";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 2;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 2;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cNOMINAL.prototype = Object.create(cBaseFunction.prototype);
|
|
cNOMINAL.prototype.Calculate = function (arg) {
|
|
var effectRate = arg[0],
|
|
npery = arg[1];
|
|
if (effectRate instanceof cArea || effectRate instanceof cArea3D) {
|
|
effectRate = effectRate.cross(arguments[1].first);
|
|
} else {
|
|
if (effectRate instanceof cArray) {
|
|
effectRate = effectRate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (npery instanceof cArea || npery instanceof cArea3D) {
|
|
npery = npery.cross(arguments[1].first);
|
|
} else {
|
|
if (npery instanceof cArray) {
|
|
npery = npery.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
effectRate = effectRate.tocNumber();
|
|
npery = npery.tocNumber();
|
|
if (effectRate instanceof cError) {
|
|
return this.value = effectRate;
|
|
}
|
|
if (npery instanceof cError) {
|
|
return this.value = npery;
|
|
}
|
|
effectRate = effectRate.getValue();
|
|
npery = npery.getValue();
|
|
npery = Math.floor(npery);
|
|
if (effectRate <= 0 || npery < 1) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
this.value = new cNumber((Math.pow(effectRate + 1, 1 / npery) - 1) * npery);
|
|
return this.value;
|
|
};
|
|
cNOMINAL.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( effect-rate , npery )"
|
|
};
|
|
};
|
|
function cNPER() {
|
|
this.name = "NPER";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 3;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 5;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cNPER.prototype = Object.create(cBaseFunction.prototype);
|
|
cNPER.prototype.Calculate = function (arg) {
|
|
var rate = arg[0],
|
|
pmt = arg[1],
|
|
pv = arg[2],
|
|
fv = arg[3] ? arg[3] : new cNumber(0),
|
|
type = arg[4] ? arg[4] : new cNumber(0);
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pmt instanceof cArea || pmt instanceof cArea3D) {
|
|
pmt = pmt.cross(arguments[1].first);
|
|
} else {
|
|
if (pmt instanceof cArray) {
|
|
pmt = pmt.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pv instanceof cArea || pv instanceof cArea3D) {
|
|
pv = pv.cross(arguments[1].first);
|
|
} else {
|
|
if (pv instanceof cArray) {
|
|
pv = pv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (fv instanceof cArea || fv instanceof cArea3D) {
|
|
fv = fv.cross(arguments[1].first);
|
|
} else {
|
|
if (fv instanceof cArray) {
|
|
fv = fv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (type instanceof cArea || type instanceof cArea3D) {
|
|
type = type.cross(arguments[1].first);
|
|
} else {
|
|
if (type instanceof cArray) {
|
|
type = type.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
rate = rate.tocNumber();
|
|
pmt = pmt.tocNumber();
|
|
pv = pv.tocNumber();
|
|
fv = fv.tocNumber();
|
|
type = type.tocNumber();
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (pmt instanceof cError) {
|
|
return this.value = pmt;
|
|
}
|
|
if (pmt instanceof cError) {
|
|
return this.value = pv;
|
|
}
|
|
if (fv instanceof cError) {
|
|
return this.value = fv;
|
|
}
|
|
if (type instanceof cError) {
|
|
return this.value = type;
|
|
}
|
|
if (type.getValue() != 1 && type.getValue() != 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var res;
|
|
if (rate.getValue() != 0) {
|
|
rate = rate.getValue();
|
|
pmt = pmt.getValue();
|
|
pv = pv.getValue();
|
|
fv = fv.getValue();
|
|
type = type.getValue();
|
|
res = (-fv * rate + pmt * (1 + rate * type)) / (rate * pv + pmt * (1 + rate * type));
|
|
res = Math.log(res) / Math.log(1 + rate);
|
|
} else {
|
|
res = -pv.getValue() - fv.getValue() / pmt.getValue();
|
|
}
|
|
return this.value = new cNumber(res);
|
|
};
|
|
cNPER.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( rate , pmt , pv [ , [ fv ] [ , [ type ] ] ] )"
|
|
};
|
|
};
|
|
function cNPV() {
|
|
this.name = "NPV";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 2;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 255;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cNPV.prototype = Object.create(cBaseFunction.prototype);
|
|
cNPV.prototype.Calculate = function (arg) {
|
|
var arg0 = arg[0],
|
|
iStart = 1,
|
|
res = 0,
|
|
rate;
|
|
function elemCalc(rate, value, step) {
|
|
return value / Math.pow(1 + rate, step);
|
|
}
|
|
if (arg0 instanceof cArea || arg0 instanceof cArea3D) {
|
|
arg0 = arg0.cross(arguments[1].first);
|
|
} else {
|
|
if (arg0 instanceof cArray) {
|
|
arg0 = arg0.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
arg0 = arg0.tocNumber();
|
|
if (arg0 instanceof cError) {
|
|
return this.value = arg0;
|
|
}
|
|
rate = arg0.getValue();
|
|
if (rate == -1) {
|
|
return this.value = new cError(cErrorType.division_by_zero);
|
|
}
|
|
for (var i = 1; i < this.getArguments(); i++) {
|
|
var argI = arg[i];
|
|
if (argI instanceof cArea || argI instanceof cArea3D) {
|
|
var argIArr = argI.getValue();
|
|
for (var j = 0; j < argIArr.length; j++) {
|
|
if (argIArr[j] instanceof cNumber) {
|
|
res += elemCalc(rate, argIArr[j].getValue(), iStart++);
|
|
}
|
|
}
|
|
continue;
|
|
} else {
|
|
if (argI instanceof cArray) {
|
|
argI.foreach(function (elem) {
|
|
if (elem instanceof cNumber) {
|
|
res += elemCalc(rate, elem.getValue(), iStart++);
|
|
}
|
|
});
|
|
continue;
|
|
}
|
|
}
|
|
argI = argI.tocNumber();
|
|
if (argI instanceof cError) {
|
|
continue;
|
|
}
|
|
res += elemCalc(rate, argI.getValue(), iStart++);
|
|
}
|
|
return this.value = new cNumber(res);
|
|
};
|
|
cNPV.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( rate , argument-list )"
|
|
};
|
|
};
|
|
function cODDFPRICE() {
|
|
this.name = "ODDFPRICE";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 8;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 9;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cODDFPRICE.prototype = Object.create(cBaseFunction.prototype);
|
|
cODDFPRICE.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
issue = arg[2],
|
|
first_coupon = arg[3],
|
|
rate = arg[4],
|
|
yld = arg[5],
|
|
redemption = arg[6],
|
|
frequency = arg[7],
|
|
basis = arg[8] && !(arg[8] instanceof cEmpty) ? arg[8] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (issue instanceof cArea || issue instanceof cArea3D) {
|
|
issue = issue.cross(arguments[1].first);
|
|
} else {
|
|
if (issue instanceof cArray) {
|
|
issue = issue.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (first_coupon instanceof cArea || first_coupon instanceof cArea3D) {
|
|
first_coupon = first_coupon.cross(arguments[1].first);
|
|
} else {
|
|
if (first_coupon instanceof cArray) {
|
|
first_coupon = first_coupon.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (yld instanceof cArea || yld instanceof cArea3D) {
|
|
yld = yld.cross(arguments[1].first);
|
|
} else {
|
|
if (yld instanceof cArray) {
|
|
yld = yld.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (redemption instanceof cArea || redemption instanceof cArea3D) {
|
|
redemption = redemption.cross(arguments[1].first);
|
|
} else {
|
|
if (redemption instanceof cArray) {
|
|
redemption = redemption.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (frequency instanceof cArea || frequency instanceof cArea3D) {
|
|
frequency = frequency.cross(arguments[1].first);
|
|
} else {
|
|
if (frequency instanceof cArray) {
|
|
frequency = frequency.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
issue = issue.tocNumber();
|
|
first_coupon = first_coupon.tocNumber();
|
|
rate = rate.tocNumber();
|
|
yld = yld.tocNumber();
|
|
redemption = redemption.tocNumber();
|
|
frequency = frequency.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (issue instanceof cError) {
|
|
return this.value = issue;
|
|
}
|
|
if (first_coupon instanceof cError) {
|
|
return this.value = first_coupon;
|
|
}
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (yld instanceof cError) {
|
|
return this.value = yld;
|
|
}
|
|
if (redemption instanceof cError) {
|
|
return this.value = redemption;
|
|
}
|
|
if (frequency instanceof cError) {
|
|
return this.value = frequency;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
issue = Math.floor(issue.getValue());
|
|
first_coupon = Math.floor(first_coupon.getValue());
|
|
rate = rate.getValue();
|
|
yld = yld.getValue();
|
|
redemption = redemption.getValue();
|
|
frequency = Math.floor(frequency.getValue());
|
|
basis = Math.floor(basis.getValue());
|
|
if (maturity < startRangeCurrentDateSystem || settlement < startRangeCurrentDateSystem || first_coupon < startRangeCurrentDateSystem || issue < startRangeCurrentDateSystem || maturity <= first_coupon || first_coupon <= settlement || settlement <= issue || basis < 0 || basis > 4 || yld < 0 || rate < 0 || redemption < 0 || frequency != 1 && frequency != 2 && frequency != 4) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var settl = Date.prototype.getDateFromExcel(settlement),
|
|
matur = Date.prototype.getDateFromExcel(maturity),
|
|
iss = Date.prototype.getDateFromExcel(issue),
|
|
firstCoup = Date.prototype.getDateFromExcel(first_coupon);
|
|
this.value = new cNumber(oddFPrice(settl, matur, iss, firstCoup, rate, yld, redemption, frequency, basis));
|
|
return this.value;
|
|
};
|
|
cODDFPRICE.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , issue , first-coupon , rate , yld , redemption , frequency [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cODDFYIELD() {
|
|
this.name = "ODDFYIELD";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 8;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 9;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cODDFYIELD.prototype = Object.create(cBaseFunction.prototype);
|
|
cODDFYIELD.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
issue = arg[2],
|
|
first_coupon = arg[3],
|
|
rate = arg[4],
|
|
pr = arg[5],
|
|
redemption = arg[6],
|
|
frequency = arg[7],
|
|
basis = arg[8] && !(arg[8] instanceof cEmpty) ? arg[8] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (issue instanceof cArea || issue instanceof cArea3D) {
|
|
issue = issue.cross(arguments[1].first);
|
|
} else {
|
|
if (issue instanceof cArray) {
|
|
issue = issue.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (first_coupon instanceof cArea || first_coupon instanceof cArea3D) {
|
|
first_coupon = first_coupon.cross(arguments[1].first);
|
|
} else {
|
|
if (first_coupon instanceof cArray) {
|
|
first_coupon = first_coupon.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pr instanceof cArea || pr instanceof cArea3D) {
|
|
pr = pr.cross(arguments[1].first);
|
|
} else {
|
|
if (pr instanceof cArray) {
|
|
pr = pr.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (redemption instanceof cArea || redemption instanceof cArea3D) {
|
|
redemption = redemption.cross(arguments[1].first);
|
|
} else {
|
|
if (redemption instanceof cArray) {
|
|
redemption = redemption.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (frequency instanceof cArea || frequency instanceof cArea3D) {
|
|
frequency = frequency.cross(arguments[1].first);
|
|
} else {
|
|
if (frequency instanceof cArray) {
|
|
frequency = frequency.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
issue = issue.tocNumber();
|
|
first_coupon = first_coupon.tocNumber();
|
|
rate = rate.tocNumber();
|
|
pr = pr.tocNumber();
|
|
redemption = redemption.tocNumber();
|
|
frequency = frequency.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (issue instanceof cError) {
|
|
return this.value = issue;
|
|
}
|
|
if (first_coupon instanceof cError) {
|
|
return this.value = first_coupon;
|
|
}
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (pr instanceof cError) {
|
|
return this.value = pr;
|
|
}
|
|
if (redemption instanceof cError) {
|
|
return this.value = redemption;
|
|
}
|
|
if (frequency instanceof cError) {
|
|
return this.value = frequency;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
issue = Math.floor(issue.getValue());
|
|
first_coupon = Math.floor(first_coupon.getValue());
|
|
rate = rate.getValue();
|
|
pr = pr.getValue();
|
|
redemption = redemption.getValue();
|
|
frequency = Math.floor(frequency.getValue());
|
|
basis = Math.floor(basis.getValue());
|
|
if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || issue < startRangeCurrentDateSystem || first_coupon < startRangeCurrentDateSystem || maturity <= first_coupon || first_coupon <= settlement || settlement <= issue || basis < 0 || basis > 4 || pr < 0 || rate < 0 || redemption < 0 || frequency != 1 && frequency != 2 && frequency != 4) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var settl = Date.prototype.getDateFromExcel(settlement),
|
|
matur = Date.prototype.getDateFromExcel(maturity),
|
|
iss = Date.prototype.getDateFromExcel(issue),
|
|
firstCoup = Date.prototype.getDateFromExcel(first_coupon);
|
|
var years = diffDate(settl, matur, basis),
|
|
px = pr - 100,
|
|
num = rate * years * 100 - px,
|
|
denum = px * 0.25 * (1 + 2 * years) + years * 100,
|
|
guess = num / denum,
|
|
x = guess,
|
|
g_Eps = 1e-07,
|
|
nIM = 500,
|
|
eps = 1,
|
|
nMC = 0,
|
|
xN;
|
|
function iterF(yld) {
|
|
return pr - oddFPrice(settl, matur, iss, firstCoup, rate, yld, redemption, frequency, basis);
|
|
}
|
|
while (eps > g_Eps && nMC < nIM) {
|
|
xN = x - iterF(x) / ((iterF(x + g_Eps) - iterF(x - g_Eps)) / (2 * g_Eps));
|
|
nMC++;
|
|
eps = Math.abs(xN - x);
|
|
x = xN;
|
|
}
|
|
if (isNaN(x) || Infinity == Math.abs(x)) {
|
|
var max = Number.MAX_VALUE,
|
|
min = -Number.MAX_VALUE,
|
|
step = 1.6,
|
|
low = guess - 0.01 <= min ? min + g_Eps : guess - 0.01,
|
|
high = guess + 0.01 >= max ? max - g_Eps : guess + 0.01,
|
|
i,
|
|
xBegin,
|
|
xEnd,
|
|
x,
|
|
y,
|
|
currentIter = 0;
|
|
if (guess <= min || guess >= max) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
for (i = 0; i < nIM; i++) {
|
|
xBegin = low <= min ? min + g_Eps : low;
|
|
xEnd = high >= max ? max - g_Eps : high;
|
|
x = iterF(xBegin);
|
|
y = iterF(xEnd);
|
|
if (x * y <= 0) {
|
|
break;
|
|
} else {
|
|
if (x * y > 0) {
|
|
low = (xBegin + step * (xBegin - xEnd));
|
|
high = (xEnd + step * (xEnd - xBegin));
|
|
} else {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
}
|
|
}
|
|
if (i == nIM) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var fXbegin = iterF(xBegin),
|
|
fXend = iterF(xEnd),
|
|
fXi,
|
|
xI;
|
|
if (Math.abs(fXbegin) < g_Eps) {
|
|
return this.value = new cNumber(fXbegin);
|
|
}
|
|
if (Math.abs(fXend) < g_Eps) {
|
|
return this.value = new cNumber(fXend);
|
|
}
|
|
do {
|
|
xI = xBegin + (xEnd - xBegin) / 2;
|
|
fXi = iterF(xI);
|
|
if (fXbegin * fXi < 0) {
|
|
xEnd = xI;
|
|
} else {
|
|
xBegin = xI;
|
|
}
|
|
fXbegin = iterF(xBegin);
|
|
currentIter++;
|
|
} while (Math.abs(fXi) > g_Eps && currentIter < nIM);
|
|
this.value = new cNumber(xI);
|
|
} else {
|
|
this.value = new cNumber(x);
|
|
}
|
|
return this.value;
|
|
};
|
|
cODDFYIELD.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , issue , first-coupon , rate , pr , redemption , frequency [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cODDLPRICE() {
|
|
this.name = "ODDLPRICE";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 7;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 8;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cODDLPRICE.prototype = Object.create(cBaseFunction.prototype);
|
|
cODDLPRICE.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
last_interest = arg[2],
|
|
rate = arg[3],
|
|
yld = arg[4],
|
|
redemption = arg[5],
|
|
frequency = arg[6],
|
|
basis = arg[7] && !(arg[7] instanceof cEmpty) ? arg[7] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (last_interest instanceof cArea || last_interest instanceof cArea3D) {
|
|
last_interest = last_interest.cross(arguments[1].first);
|
|
} else {
|
|
if (last_interest instanceof cArray) {
|
|
last_interest = last_interest.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (yld instanceof cArea || yld instanceof cArea3D) {
|
|
yld = yld.cross(arguments[1].first);
|
|
} else {
|
|
if (yld instanceof cArray) {
|
|
yld = yld.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (redemption instanceof cArea || redemption instanceof cArea3D) {
|
|
redemption = redemption.cross(arguments[1].first);
|
|
} else {
|
|
if (redemption instanceof cArray) {
|
|
redemption = redemption.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (frequency instanceof cArea || frequency instanceof cArea3D) {
|
|
frequency = frequency.cross(arguments[1].first);
|
|
} else {
|
|
if (frequency instanceof cArray) {
|
|
frequency = frequency.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
last_interest = last_interest.tocNumber();
|
|
rate = rate.tocNumber();
|
|
yld = yld.tocNumber();
|
|
redemption = redemption.tocNumber();
|
|
frequency = frequency.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (last_interest instanceof cError) {
|
|
return this.value = last_interest;
|
|
}
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (yld instanceof cError) {
|
|
return this.value = yld;
|
|
}
|
|
if (redemption instanceof cError) {
|
|
return this.value = redemption;
|
|
}
|
|
if (frequency instanceof cError) {
|
|
return this.value = frequency;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
last_interest = Math.floor(last_interest.getValue());
|
|
rate = rate.getValue();
|
|
yld = yld.getValue();
|
|
redemption = redemption.getValue();
|
|
frequency = Math.floor(frequency.getValue());
|
|
basis = Math.floor(basis.getValue());
|
|
if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || last_interest < startRangeCurrentDateSystem || maturity <= settlement || settlement <= last_interest || basis < 0 || basis > 4 || yld < 0 || rate < 0 || frequency != 1 && frequency != 2 && frequency != 4 || redemption <= 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var settl = Date.prototype.getDateFromExcel(settlement),
|
|
matur = Date.prototype.getDateFromExcel(maturity),
|
|
lastInt = Date.prototype.getDateFromExcel(last_interest);
|
|
var fDCi = yearFrac(lastInt, matur, basis) * frequency;
|
|
var fDSCi = yearFrac(settl, matur, basis) * frequency;
|
|
var fAi = yearFrac(lastInt, settl, basis) * frequency;
|
|
var res = redemption + fDCi * 100 * rate / frequency;
|
|
res /= fDSCi * yld / frequency + 1;
|
|
res -= fAi * 100 * rate / frequency;
|
|
this.value = new cNumber(res);
|
|
return this.value;
|
|
};
|
|
cODDLPRICE.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , last-interest , rate , yld , redemption , frequency [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cODDLYIELD() {
|
|
this.name = "ODDLYIELD";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 7;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 8;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cODDLYIELD.prototype = Object.create(cBaseFunction.prototype);
|
|
cODDLYIELD.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
last_interest = arg[2],
|
|
rate = arg[3],
|
|
pr = arg[4],
|
|
redemption = arg[5],
|
|
frequency = arg[6],
|
|
basis = arg[7] && !(arg[7] instanceof cEmpty) ? arg[7] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (last_interest instanceof cArea || last_interest instanceof cArea3D) {
|
|
last_interest = last_interest.cross(arguments[1].first);
|
|
} else {
|
|
if (last_interest instanceof cArray) {
|
|
last_interest = last_interest.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pr instanceof cArea || pr instanceof cArea3D) {
|
|
pr = pr.cross(arguments[1].first);
|
|
} else {
|
|
if (pr instanceof cArray) {
|
|
pr = pr.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (redemption instanceof cArea || redemption instanceof cArea3D) {
|
|
redemption = redemption.cross(arguments[1].first);
|
|
} else {
|
|
if (redemption instanceof cArray) {
|
|
redemption = redemption.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (frequency instanceof cArea || frequency instanceof cArea3D) {
|
|
frequency = frequency.cross(arguments[1].first);
|
|
} else {
|
|
if (frequency instanceof cArray) {
|
|
frequency = frequency.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
last_interest = last_interest.tocNumber();
|
|
rate = rate.tocNumber();
|
|
pr = pr.tocNumber();
|
|
redemption = redemption.tocNumber();
|
|
frequency = frequency.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (last_interest instanceof cError) {
|
|
return this.value = last_interest;
|
|
}
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (pr instanceof cError) {
|
|
return this.value = pr;
|
|
}
|
|
if (redemption instanceof cError) {
|
|
return this.value = redemption;
|
|
}
|
|
if (frequency instanceof cError) {
|
|
return this.value = frequency;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
last_interest = Math.floor(last_interest.getValue());
|
|
rate = rate.getValue();
|
|
pr = pr.getValue();
|
|
redemption = redemption.getValue();
|
|
frequency = Math.floor(frequency.getValue());
|
|
basis = Math.floor(basis.getValue());
|
|
if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || last_interest < startRangeCurrentDateSystem || maturity <= settlement || settlement <= last_interest || basis < 0 || basis > 4 || pr < 0 || rate < 0 || frequency != 1 && frequency != 2 && frequency != 4 || redemption <= 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var settl = Date.prototype.getDateFromExcel(settlement),
|
|
matur = Date.prototype.getDateFromExcel(maturity),
|
|
lastInt = Date.prototype.getDateFromExcel(last_interest);
|
|
var fDCi = yearFrac(lastInt, matur, basis) * frequency;
|
|
var fDSCi = yearFrac(settl, matur, basis) * frequency;
|
|
var fAi = yearFrac(lastInt, settl, basis) * frequency;
|
|
var res = redemption + fDCi * 100 * rate / frequency;
|
|
res /= pr + fAi * 100 * rate / frequency;
|
|
res--;
|
|
res *= frequency / fDSCi;
|
|
this.value = new cNumber(res);
|
|
return this.value;
|
|
};
|
|
cODDLYIELD.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , last-interest , rate , pr , redemption , frequency [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cPMT() {
|
|
this.name = "PMT";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 3;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 5;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cPMT.prototype = Object.create(cBaseFunction.prototype);
|
|
cPMT.prototype.Calculate = function (arg) {
|
|
var rate = arg[0],
|
|
nper = arg[1],
|
|
pv = arg[2],
|
|
fv = arg[3] ? arg[3] : new cNumber(0),
|
|
type = arg[4] ? arg[4] : new cNumber(0);
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (nper instanceof cArea || nper instanceof cArea3D) {
|
|
nper = nper.cross(arguments[1].first);
|
|
} else {
|
|
if (nper instanceof cArray) {
|
|
nper = nper.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pv instanceof cArea || pv instanceof cArea3D) {
|
|
pv = pv.cross(arguments[1].first);
|
|
} else {
|
|
if (pv instanceof cArray) {
|
|
pv = pv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (fv instanceof cArea || fv instanceof cArea3D) {
|
|
fv = fv.cross(arguments[1].first);
|
|
} else {
|
|
if (fv instanceof cArray) {
|
|
fv = fv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (type instanceof cArea || type instanceof cArea3D) {
|
|
type = type.cross(arguments[1].first);
|
|
} else {
|
|
if (type instanceof cArray) {
|
|
type = type.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
rate = rate.tocNumber();
|
|
nper = nper.tocNumber();
|
|
pv = pv.tocNumber();
|
|
fv = fv.tocNumber();
|
|
type = type.tocNumber();
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (nper instanceof cError) {
|
|
return this.value = nper;
|
|
}
|
|
if (nper.getValue() == 0) {
|
|
return this.value = new cError(cErrorType.division_by_zero);
|
|
}
|
|
if (pv instanceof cError) {
|
|
return this.value = pv;
|
|
}
|
|
if (fv instanceof cError) {
|
|
return this.value = fv;
|
|
}
|
|
if (type instanceof cError) {
|
|
return this.value = type;
|
|
}
|
|
if (type.getValue() != 1 && type.getValue() != 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
rate = rate.getValue();
|
|
nper = nper.getValue();
|
|
fv = fv.getValue();
|
|
type = type.getValue();
|
|
pv = pv.getValue();
|
|
var res;
|
|
if (rate != 0) {
|
|
res = -1 * (pv * Math.pow(1 + rate, nper) + fv) / ((1 + rate * type) * (Math.pow((1 + rate), nper) - 1) / rate);
|
|
} else {
|
|
res = -1 * (pv + fv) / nper;
|
|
}
|
|
return this.value = new cNumber(res);
|
|
};
|
|
cPMT.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( rate , nper , pv [ , [ fv ] [ ,[ type ] ] ] )"
|
|
};
|
|
};
|
|
function cPPMT() {
|
|
this.name = "PPMT";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 4;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 6;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cPPMT.prototype = Object.create(cBaseFunction.prototype);
|
|
cPPMT.prototype.Calculate = function (arg) {
|
|
var rate = arg[0],
|
|
per = arg[1],
|
|
nper = arg[2],
|
|
pv = arg[3],
|
|
fv = arg[4] ? arg[4] : new cNumber(0),
|
|
type = arg[5] ? arg[5] : new cNumber(0);
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (per instanceof cArea || per instanceof cArea3D) {
|
|
per = per.cross(arguments[1].first);
|
|
} else {
|
|
if (per instanceof cArray) {
|
|
per = per.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (nper instanceof cArea || nper instanceof cArea3D) {
|
|
nper = nper.cross(arguments[1].first);
|
|
} else {
|
|
if (nper instanceof cArray) {
|
|
nper = nper.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pv instanceof cArea || pv instanceof cArea3D) {
|
|
pv = pv.cross(arguments[1].first);
|
|
} else {
|
|
if (pv instanceof cArray) {
|
|
pv = pv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (fv instanceof cArea || fv instanceof cArea3D) {
|
|
fv = fv.cross(arguments[1].first);
|
|
} else {
|
|
if (fv instanceof cArray) {
|
|
fv = fv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (type instanceof cArea || type instanceof cArea3D) {
|
|
type = type.cross(arguments[1].first);
|
|
} else {
|
|
if (type instanceof cArray) {
|
|
type = type.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
rate = rate.tocNumber();
|
|
per = per.tocNumber();
|
|
nper = nper.tocNumber();
|
|
pv = pv.tocNumber();
|
|
fv = fv.tocNumber();
|
|
type = type.tocNumber();
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (per instanceof cError) {
|
|
return this.value = per;
|
|
}
|
|
if (nper instanceof cError) {
|
|
return this.value = nper;
|
|
}
|
|
if (pv instanceof cError) {
|
|
return this.value = pv;
|
|
}
|
|
if (fv instanceof cError) {
|
|
return this.value = fv;
|
|
}
|
|
if (type instanceof cError) {
|
|
return this.value = type;
|
|
}
|
|
rate = rate.getValue();
|
|
per = per.getValue();
|
|
nper = nper.getValue();
|
|
pv = pv.getValue();
|
|
fv = fv.getValue();
|
|
type = type.getValue();
|
|
var res;
|
|
if (per < 1 || per > nper || type != 0 && type != 1) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var fRmz = getPMT(rate, nper, pv, fv, type);
|
|
res = fRmz - getIPMT(rate, per, pv, type, fRmz);
|
|
this.value = new cNumber(res);
|
|
return this.value;
|
|
};
|
|
cPPMT.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( rate , per , nper , pv [ , [ fv ] [ , [ type ] ] ] )"
|
|
};
|
|
};
|
|
function cPRICE() {
|
|
this.name = "PRICE";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 6;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 7;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cPRICE.prototype = Object.create(cBaseFunction.prototype);
|
|
cPRICE.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
rate = arg[2],
|
|
yld = arg[3],
|
|
redemption = arg[4],
|
|
frequency = arg[5],
|
|
basis = arg[6] && !(arg[6] instanceof cEmpty) ? arg[6] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (yld instanceof cArea || yld instanceof cArea3D) {
|
|
yld = yld.cross(arguments[1].first);
|
|
} else {
|
|
if (yld instanceof cArray) {
|
|
yld = yld.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (redemption instanceof cArea || redemption instanceof cArea3D) {
|
|
redemption = redemption.cross(arguments[1].first);
|
|
} else {
|
|
if (redemption instanceof cArray) {
|
|
redemption = redemption.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (frequency instanceof cArea || frequency instanceof cArea3D) {
|
|
frequency = frequency.cross(arguments[1].first);
|
|
} else {
|
|
if (frequency instanceof cArray) {
|
|
frequency = frequency.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
rate = rate.tocNumber();
|
|
yld = yld.tocNumber();
|
|
redemption = redemption.tocNumber();
|
|
frequency = frequency.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (yld instanceof cError) {
|
|
return this.value = yld;
|
|
}
|
|
if (redemption instanceof cError) {
|
|
return this.value = redemption;
|
|
}
|
|
if (frequency instanceof cError) {
|
|
return this.value = frequency;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
rate = rate.getValue();
|
|
yld = yld.getValue();
|
|
redemption = redemption.getValue();
|
|
frequency = Math.floor(frequency.getValue());
|
|
basis = Math.floor(basis.getValue());
|
|
if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4) || rate < 0 || yld < 0 || redemption <= 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var settl = Date.prototype.getDateFromExcel(settlement),
|
|
matur = Date.prototype.getDateFromExcel(maturity);
|
|
return this.value = new cNumber(getprice(settl, matur, rate, yld, redemption, frequency, basis));
|
|
};
|
|
cPRICE.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , rate , yld , redemption , frequency [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cPRICEDISC() {
|
|
this.name = "PRICEDISC";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 4;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 5;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cPRICEDISC.prototype = Object.create(cBaseFunction.prototype);
|
|
cPRICEDISC.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
discount = arg[2],
|
|
redemption = arg[3],
|
|
basis = arg[4] && !(arg[4] instanceof cEmpty) ? arg[4] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (discount instanceof cArea || discount instanceof cArea3D) {
|
|
discount = discount.cross(arguments[1].first);
|
|
} else {
|
|
if (discount instanceof cArray) {
|
|
discount = discount.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (redemption instanceof cArea || redemption instanceof cArea3D) {
|
|
redemption = redemption.cross(arguments[1].first);
|
|
} else {
|
|
if (redemption instanceof cArray) {
|
|
redemption = redemption.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
discount = discount.tocNumber();
|
|
redemption = redemption.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (discount instanceof cError) {
|
|
return this.value = discount;
|
|
}
|
|
if (redemption instanceof cError) {
|
|
return this.value = redemption;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
discount = discount.getValue();
|
|
redemption = redemption.getValue();
|
|
basis = Math.floor(basis.getValue());
|
|
if (settlement >= maturity || settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || basis < 0 || basis > 4 || discount <= 0 || redemption <= 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var settl = Date.prototype.getDateFromExcel(settlement),
|
|
matur = Date.prototype.getDateFromExcel(maturity);
|
|
var res = redemption * (1 - discount * yearFrac(settl, matur, basis));
|
|
return this.value = new cNumber(res);
|
|
};
|
|
cPRICEDISC.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , discount , redemption [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cPRICEMAT() {
|
|
this.name = "PRICEMAT";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 5;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 6;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cPRICEMAT.prototype = Object.create(cBaseFunction.prototype);
|
|
cPRICEMAT.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
issue = arg[2],
|
|
rate = arg[3],
|
|
yld = arg[4],
|
|
basis = arg[5] && !(arg[5] instanceof cEmpty) ? arg[5] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (issue instanceof cArea || issue instanceof cArea3D) {
|
|
issue = issue.cross(arguments[1].first);
|
|
} else {
|
|
if (issue instanceof cArray) {
|
|
issue = issue.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (yld instanceof cArea || yld instanceof cArea3D) {
|
|
yld = yld.cross(arguments[1].first);
|
|
} else {
|
|
if (yld instanceof cArray) {
|
|
yld = yld.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
issue = issue.tocNumber();
|
|
rate = rate.tocNumber();
|
|
yld = yld.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (issue instanceof cError) {
|
|
return this.value = issue;
|
|
}
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (yld instanceof cError) {
|
|
return this.value = yld;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
issue = Math.floor(issue.getValue());
|
|
rate = rate.getValue();
|
|
yld = yld.getValue();
|
|
basis = Math.floor(basis.getValue());
|
|
if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || issue < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || rate < 0 || yld < 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var settl = Date.prototype.getDateFromExcel(settlement),
|
|
matur = Date.prototype.getDateFromExcel(maturity),
|
|
iss = Date.prototype.getDateFromExcel(issue);
|
|
var fIssMat = yearFrac(new Date(iss), new Date(matur), basis);
|
|
var fIssSet = yearFrac(new Date(iss), new Date(settl), basis);
|
|
var fSetMat = yearFrac(new Date(settl), new Date(matur), basis);
|
|
var res = 1 + fIssMat * rate;
|
|
res /= 1 + fSetMat * yld;
|
|
res -= fIssSet * rate;
|
|
res *= 100;
|
|
return this.value = new cNumber(res);
|
|
};
|
|
cPRICEMAT.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , issue , rate , yld [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cPV() {
|
|
this.name = "PV";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 3;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 5;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cPV.prototype = Object.create(cBaseFunction.prototype);
|
|
cPV.prototype.Calculate = function (arg) {
|
|
var rate = arg[0],
|
|
nper = arg[1],
|
|
pmt = arg[2],
|
|
fv = arg[3] ? arg[3] : new cNumber(0),
|
|
type = arg[4] ? arg[4] : new cNumber(0);
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (nper instanceof cArea || nper instanceof cArea3D) {
|
|
nper = nper.cross(arguments[1].first);
|
|
} else {
|
|
if (nper instanceof cArray) {
|
|
nper = nper.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pmt instanceof cArea || pmt instanceof cArea3D) {
|
|
pmt = pmt.cross(arguments[1].first);
|
|
} else {
|
|
if (pmt instanceof cArray) {
|
|
pmt = pmt.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (fv instanceof cArea || fv instanceof cArea3D) {
|
|
fv = fv.cross(arguments[1].first);
|
|
} else {
|
|
if (fv instanceof cArray) {
|
|
fv = fv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (type instanceof cArea || type instanceof cArea3D) {
|
|
type = type.cross(arguments[1].first);
|
|
} else {
|
|
if (type instanceof cArray) {
|
|
type = type.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
rate = rate.tocNumber();
|
|
nper = nper.tocNumber();
|
|
pmt = pmt.tocNumber();
|
|
fv = fv.tocNumber();
|
|
type = type.tocNumber();
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (nper instanceof cError) {
|
|
return this.value = nper;
|
|
}
|
|
if (pmt instanceof cError) {
|
|
return this.value = pmt;
|
|
}
|
|
if (fv instanceof cError) {
|
|
return this.value = fv;
|
|
}
|
|
if (type instanceof cError) {
|
|
return this.value = type;
|
|
}
|
|
if (type.getValue() != 1 && type.getValue() != 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var res;
|
|
if (rate.getValue() != 0) {
|
|
res = -1 * (fv.getValue() + pmt.getValue() * (1 + rate.getValue() * type.getValue()) * ((Math.pow((1 + rate.getValue()), nper.getValue()) - 1) / rate.getValue())) / Math.pow(1 + rate.getValue(), nper.getValue());
|
|
} else {
|
|
res = -1 * (fv.getValue() + pmt.getValue() * nper.getValue());
|
|
}
|
|
return this.value = new cNumber(res);
|
|
};
|
|
cPV.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( rate , nper , pmt [ , [ fv ] [ ,[ type ] ] ] )"
|
|
};
|
|
};
|
|
function cRATE() {
|
|
this.name = "RATE";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 3;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 6;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cRATE.prototype = Object.create(cBaseFunction.prototype);
|
|
cRATE.prototype.Calculate = function (arg) {
|
|
var nper = arg[0],
|
|
pmt = arg[1],
|
|
pv = arg[2],
|
|
fv = arg[3] ? arg[3] : new cNumber(0),
|
|
type = arg[4] ? arg[4] : new cNumber(0),
|
|
quess = arg[5] ? arg[5] : new cNumber(0.1);
|
|
if (nper instanceof cArea || nper instanceof cArea3D) {
|
|
nper = nper.cross(arguments[1].first);
|
|
} else {
|
|
if (nper instanceof cArray) {
|
|
nper = nper.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pmt instanceof cArea || pmt instanceof cArea3D) {
|
|
pmt = pmt.cross(arguments[1].first);
|
|
} else {
|
|
if (pmt instanceof cArray) {
|
|
pmt = pmt.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pv instanceof cArea || pv instanceof cArea3D) {
|
|
pv = pv.cross(arguments[1].first);
|
|
} else {
|
|
if (pv instanceof cArray) {
|
|
pv = pv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (fv instanceof cArea || fv instanceof cArea3D) {
|
|
fv = fv.cross(arguments[1].first);
|
|
} else {
|
|
if (fv instanceof cArray) {
|
|
fv = fv.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (type instanceof cArea || type instanceof cArea3D) {
|
|
type = type.cross(arguments[1].first);
|
|
} else {
|
|
if (type instanceof cArray) {
|
|
type = type.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (quess instanceof cArea || quess instanceof cArea3D) {
|
|
quess = quess.cross(arguments[1].first);
|
|
} else {
|
|
if (quess instanceof cArray) {
|
|
quess = quess.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
nper = nper.tocNumber();
|
|
pmt = pmt.tocNumber();
|
|
pv = pv.tocNumber();
|
|
fv = fv.tocNumber();
|
|
type = type.tocNumber();
|
|
quess = quess.tocNumber();
|
|
if (nper instanceof cError) {
|
|
return this.value = nper;
|
|
}
|
|
if (pmt instanceof cError) {
|
|
return this.value = pmt;
|
|
}
|
|
if (pv instanceof cError) {
|
|
return this.value = pv;
|
|
}
|
|
if (fv instanceof cError) {
|
|
return this.value = fv;
|
|
}
|
|
if (type instanceof cError) {
|
|
return this.value = type;
|
|
}
|
|
if (quess instanceof cError) {
|
|
return this.value = quess;
|
|
}
|
|
nper = nper.getValue();
|
|
pmt = pmt.getValue();
|
|
pv = pv.getValue();
|
|
fv = fv.getValue();
|
|
type = type.getValue();
|
|
quess = quess.getValue();
|
|
if (type != 1 && type != 0 || nper <= 0 || pmt >= 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
this.value = new cNumber(RateIteration(nper, pmt, pv, fv, type, quess));
|
|
this.value.numFormat = 9;
|
|
return this.value;
|
|
};
|
|
cRATE.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( nper , pmt , pv [ , [ [ fv ] [ , [ [ type ] [ , [ guess ] ] ] ] ] ] )"
|
|
};
|
|
};
|
|
function cRECEIVED() {
|
|
this.name = "RECEIVED";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 4;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 5;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cRECEIVED.prototype = Object.create(cBaseFunction.prototype);
|
|
cRECEIVED.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
investment = arg[2],
|
|
discount = arg[3],
|
|
basis = arg[4] && !(arg[4] instanceof cEmpty) ? arg[4] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (investment instanceof cArea || investment instanceof cArea3D) {
|
|
investment = investment.cross(arguments[1].first);
|
|
} else {
|
|
if (investment instanceof cArray) {
|
|
investment = investment.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (discount instanceof cArea || discount instanceof cArea3D) {
|
|
discount = discount.cross(arguments[1].first);
|
|
} else {
|
|
if (discount instanceof cArray) {
|
|
discount = discount.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
investment = investment.tocNumber();
|
|
discount = discount.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (investment instanceof cError) {
|
|
return this.value = investment;
|
|
}
|
|
if (discount instanceof cError) {
|
|
return this.value = discount;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
investment = investment.getValue();
|
|
discount = discount.getValue();
|
|
basis = Math.floor(basis.getValue());
|
|
if (settlement >= maturity || investment <= 0 || discount <= 0 || settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || basis < 0 || basis > 4) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var res = investment / (1 - (discount * yearFrac(Date.prototype.getDateFromExcel(settlement), Date.prototype.getDateFromExcel(maturity), basis)));
|
|
this.value = res >= 0 ? new cNumber(res) : new cError(cErrorType.not_numeric);
|
|
return this.value;
|
|
};
|
|
cRECEIVED.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , investment , discount [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cSLN() {
|
|
this.name = "SLN";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 3;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 3;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cSLN.prototype = Object.create(cBaseFunction.prototype);
|
|
cSLN.prototype.Calculate = function (arg) {
|
|
var cost = arg[0],
|
|
salvage = arg[1],
|
|
life = arg[2];
|
|
if (cost instanceof cArea || cost instanceof cArea3D) {
|
|
cost = cost.cross(arguments[1].first);
|
|
} else {
|
|
if (cost instanceof cArray) {
|
|
cost = cost.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (salvage instanceof cArea || salvage instanceof cArea3D) {
|
|
salvage = salvage.cross(arguments[1].first);
|
|
} else {
|
|
if (salvage instanceof cArray) {
|
|
salvage = salvage.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (life instanceof cArea || life instanceof cArea3D) {
|
|
life = life.cross(arguments[1].first);
|
|
} else {
|
|
if (life instanceof cArray) {
|
|
life = life.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
cost = cost.tocNumber();
|
|
salvage = salvage.tocNumber();
|
|
life = life.tocNumber();
|
|
if (cost instanceof cError) {
|
|
return this.value = cost;
|
|
}
|
|
if (salvage instanceof cError) {
|
|
return this.value = salvage;
|
|
}
|
|
if (life instanceof cError) {
|
|
return this.value = life;
|
|
}
|
|
cost = cost.getValue();
|
|
salvage = salvage.getValue();
|
|
life = life.getValue();
|
|
if (life == 0) {
|
|
return this.value = new cError(cErrorType.division_by_zero);
|
|
}
|
|
this.value = new cNumber((cost - salvage) / life);
|
|
return this.value;
|
|
};
|
|
cSLN.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( cost , salvage , life )"
|
|
};
|
|
};
|
|
function cSYD() {
|
|
this.name = "SYD";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 4;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 4;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cSYD.prototype = Object.create(cBaseFunction.prototype);
|
|
cSYD.prototype.Calculate = function (arg) {
|
|
var cost = arg[0],
|
|
salvage = arg[1],
|
|
life = arg[2],
|
|
per = arg[3];
|
|
if (cost instanceof cArea || cost instanceof cArea3D) {
|
|
cost = cost.cross(arguments[1].first);
|
|
} else {
|
|
if (cost instanceof cArray) {
|
|
cost = cost.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (salvage instanceof cArea || salvage instanceof cArea3D) {
|
|
salvage = salvage.cross(arguments[1].first);
|
|
} else {
|
|
if (salvage instanceof cArray) {
|
|
salvage = salvage.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (life instanceof cArea || life instanceof cArea3D) {
|
|
life = life.cross(arguments[1].first);
|
|
} else {
|
|
if (life instanceof cArray) {
|
|
life = life.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (per instanceof cArea || per instanceof cArea3D) {
|
|
per = per.cross(arguments[1].first);
|
|
} else {
|
|
if (per instanceof cArray) {
|
|
per = per.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
cost = cost.tocNumber();
|
|
salvage = salvage.tocNumber();
|
|
life = life.tocNumber();
|
|
per = per.tocNumber();
|
|
if (cost instanceof cError) {
|
|
return this.value = cost;
|
|
}
|
|
if (salvage instanceof cError) {
|
|
return this.value = salvage;
|
|
}
|
|
if (life instanceof cError) {
|
|
return this.value = life;
|
|
}
|
|
if (per instanceof cError) {
|
|
return this.value = per;
|
|
}
|
|
cost = cost.getValue();
|
|
salvage = salvage.getValue();
|
|
life = life.getValue();
|
|
per = per.getValue();
|
|
if (life == 1 || life <= 0 || salvage < 0 || per < 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var res = 2;
|
|
res *= cost - salvage;
|
|
res *= life + 1 - per;
|
|
res /= (life + 1) * life;
|
|
return this.value = new cNumber(res);
|
|
};
|
|
cSYD.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( cost , salvage , life , per )"
|
|
};
|
|
};
|
|
function cTBILLEQ() {
|
|
this.name = "TBILLEQ";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 3;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 3;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cTBILLEQ.prototype = Object.create(cBaseFunction.prototype);
|
|
cTBILLEQ.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
discount = arg[2];
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (discount instanceof cArea || discount instanceof cArea3D) {
|
|
discount = discount.cross(arguments[1].first);
|
|
} else {
|
|
if (discount instanceof cArray) {
|
|
discount = discount.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
discount = discount.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (discount instanceof cError) {
|
|
return this.value = discount;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
discount = discount.getValue();
|
|
if (settlement >= maturity || settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || discount <= 0 || nDiff > 360) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var nMat = maturity + 1;
|
|
var d1 = Date.prototype.getDateFromExcel(settlement);
|
|
var d2 = Date.prototype.getDateFromExcel(nMat);
|
|
var date1 = d1.getUTCDate(),
|
|
month1 = d1.getUTCMonth(),
|
|
year1 = d1.getUTCFullYear(),
|
|
date2 = d2.getUTCDate(),
|
|
month2 = d2.getUTCMonth(),
|
|
year2 = d2.getUTCFullYear();
|
|
var nDiff = GetDiffDate360(date1, month1, year1, date2, month2, year2, true);
|
|
if (nDiff > 360) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
this.value = new cNumber((365 * discount) / (360 - (discount * nDiff)));
|
|
this.value.numFormat = 9;
|
|
return this.value;
|
|
};
|
|
cTBILLEQ.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , discount )"
|
|
};
|
|
};
|
|
function cTBILLPRICE() {
|
|
this.name = "TBILLPRICE";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 3;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 3;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cTBILLPRICE.prototype = Object.create(cBaseFunction.prototype);
|
|
cTBILLPRICE.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
discount = arg[2];
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (discount instanceof cArea || discount instanceof cArea3D) {
|
|
discount = discount.cross(arguments[1].first);
|
|
} else {
|
|
if (discount instanceof cArray) {
|
|
discount = discount.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
discount = discount.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (discount instanceof cError) {
|
|
return this.value = discount;
|
|
}
|
|
settlement = Math.floor(Math.floor(settlement.getValue()));
|
|
maturity = Math.floor(Math.floor(maturity.getValue()));
|
|
discount = discount.getValue();
|
|
if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || discount <= 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var d1 = Date.prototype.getDateFromExcel(settlement),
|
|
d2 = Date.prototype.getDateFromExcel(maturity),
|
|
d3 = new Date(d1);
|
|
d3.addYears(1);
|
|
if (d2 > d3) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
discount *= diffDate(d1, d2, DayCountBasis.ActualActual);
|
|
this.value = new cNumber(100 * (1 - discount / 360));
|
|
return this.value;
|
|
};
|
|
cTBILLPRICE.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , discount )"
|
|
};
|
|
};
|
|
function cTBILLYIELD() {
|
|
this.name = "TBILLYIELD";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 3;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 3;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cTBILLYIELD.prototype = Object.create(cBaseFunction.prototype);
|
|
cTBILLYIELD.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
pr = arg[2];
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pr instanceof cArea || pr instanceof cArea3D) {
|
|
pr = pr.cross(arguments[1].first);
|
|
} else {
|
|
if (pr instanceof cArray) {
|
|
pr = pr.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
pr = pr.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (pr instanceof cError) {
|
|
return this.value = pr;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
pr = pr.getValue();
|
|
if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || pr <= 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var d1 = Date.prototype.getDateFromExcel(settlement),
|
|
d2 = Date.prototype.getDateFromExcel(maturity),
|
|
date1 = d1.getUTCDate(),
|
|
month1 = d1.getUTCMonth(),
|
|
year1 = d1.getUTCFullYear(),
|
|
date2 = d2.getUTCDate(),
|
|
month2 = d2.getUTCMonth(),
|
|
year2 = d2.getUTCFullYear();
|
|
var nDiff = GetDiffDate360(date1, month1, year1, date2, month2, year2, true);
|
|
nDiff++;
|
|
if (nDiff > 360) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
this.value = new cNumber(((100 - pr) / pr) * (360 / nDiff));
|
|
this.value.numFormat = 9;
|
|
return this.value;
|
|
};
|
|
cTBILLYIELD.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , pr )"
|
|
};
|
|
};
|
|
function cVDB() {
|
|
this.name = "VDB";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 5;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 7;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cVDB.prototype = Object.create(cBaseFunction.prototype);
|
|
cVDB.prototype.Calculate = function (arg) {
|
|
var cost = arg[0],
|
|
salvage = arg[1],
|
|
life = arg[2],
|
|
startPeriod = arg[3],
|
|
endPeriod = arg[4],
|
|
factor = arg[5] && !(arg[5] instanceof cEmpty) ? arg[5] : new cNumber(2),
|
|
flag = arg[6] && !(arg[6] instanceof cEmpty) ? arg[6] : new cBool(false);
|
|
function getVDB(cost, fRest, life, life1, startPeriod, factor) {
|
|
var res = 0,
|
|
loopEnd = end = Math.ceil(startPeriod),
|
|
temp,
|
|
sln = 0,
|
|
rest = cost - fRest,
|
|
sln1 = false,
|
|
ddb;
|
|
for (var i = 1; i <= loopEnd; i++) {
|
|
if (!sln1) {
|
|
ddb = getDDB(cost, fRest, life, i, factor);
|
|
sln = rest / (life1 - (i - 1));
|
|
if (sln > ddb) {
|
|
temp = sln;
|
|
sln1 = true;
|
|
} else {
|
|
temp = ddb;
|
|
rest -= ddb;
|
|
}
|
|
} else {
|
|
temp = sln;
|
|
}
|
|
if (i == loopEnd) {
|
|
temp *= (startPeriod + 1 - end);
|
|
}
|
|
res += temp;
|
|
}
|
|
return res;
|
|
}
|
|
if (cost instanceof cArea || cost instanceof cArea3D) {
|
|
cost = cost.cross(arguments[1].first);
|
|
} else {
|
|
if (cost instanceof cArray) {
|
|
cost = cost.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (salvage instanceof cArea || salvage instanceof cArea3D) {
|
|
salvage = salvage.cross(arguments[1].first);
|
|
} else {
|
|
if (salvage instanceof cArray) {
|
|
salvage = salvage.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (life instanceof cArea || life instanceof cArea3D) {
|
|
life = life.cross(arguments[1].first);
|
|
} else {
|
|
if (life instanceof cArray) {
|
|
life = life.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (startPeriod instanceof cArea || startPeriod instanceof cArea3D) {
|
|
startPeriod = startPeriod.cross(arguments[1].first);
|
|
} else {
|
|
if (startPeriod instanceof cArray) {
|
|
startPeriod = startPeriod.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (endPeriod instanceof cArea || endPeriod instanceof cArea3D) {
|
|
endPeriod = endPeriod.cross(arguments[1].first);
|
|
} else {
|
|
if (endPeriod instanceof cArray) {
|
|
endPeriod = endPeriod.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (factor instanceof cArea || factor instanceof cArea3D) {
|
|
factor = factor.cross(arguments[1].first);
|
|
} else {
|
|
if (factor instanceof cArray) {
|
|
factor = factor.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (flag instanceof cArea || flag instanceof cArea3D) {
|
|
flag = flag.cross(arguments[1].first);
|
|
} else {
|
|
if (flag instanceof cArray) {
|
|
flag = flag.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
cost = cost.tocNumber();
|
|
salvage = salvage.tocNumber();
|
|
life = life.tocNumber();
|
|
startPeriod = startPeriod.tocNumber();
|
|
endPeriod = endPeriod.tocNumber();
|
|
factor = factor.tocNumber();
|
|
flag = flag.tocBool();
|
|
if (cost instanceof cError) {
|
|
return this.value = cost;
|
|
}
|
|
if (salvage instanceof cError) {
|
|
return this.value = salvage;
|
|
}
|
|
if (life instanceof cError) {
|
|
return this.value = life;
|
|
}
|
|
if (startPeriod instanceof cError) {
|
|
return this.value = startPeriod;
|
|
}
|
|
if (endPeriod instanceof cError) {
|
|
return this.value = endPeriod;
|
|
}
|
|
if (factor instanceof cError) {
|
|
return this.value = factor;
|
|
}
|
|
if (flag instanceof cError) {
|
|
return this.value = flag;
|
|
}
|
|
cost = cost.getValue();
|
|
salvage = salvage.getValue();
|
|
life = life.getValue();
|
|
startPeriod = startPeriod.getValue();
|
|
endPeriod = endPeriod.getValue();
|
|
factor = factor.getValue();
|
|
flag = flag.getValue();
|
|
if (cost < salvage || life < 0 || startPeriod < 0 || life < startPeriod || startPeriod > endPeriod || life < endPeriod || factor < 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var start = Math.floor(startPeriod),
|
|
end = Math.ceil(endPeriod);
|
|
var res = 0;
|
|
if (flag) {
|
|
for (var i = start + 1; i <= end; i++) {
|
|
var ddb = getDDB(cost, salvage, life, i, factor);
|
|
if (i == start + 1) {
|
|
ddb *= (Math.min(endPeriod, start + 1) - startPeriod);
|
|
} else {
|
|
if (i == end) {
|
|
ddb *= (endPeriod + 1 - end);
|
|
}
|
|
}
|
|
res += ddb;
|
|
}
|
|
} else {
|
|
var life1 = life;
|
|
if (!Math.approxEqual(startPeriod, Math.floor(startPeriod))) {
|
|
if (factor > 1) {
|
|
if (startPeriod > life / 2 || Math.approxEqual(startPeriod, life / 2)) {
|
|
var fPart = startPeriod - life / 2;
|
|
startPeriod = life / 2;
|
|
endPeriod -= fPart;
|
|
life1 += 1;
|
|
}
|
|
}
|
|
}
|
|
cost -= getVDB(cost, salvage, life, life1, startPeriod, factor);
|
|
res = getVDB(cost, salvage, life, life - startPeriod, endPeriod - startPeriod, factor);
|
|
}
|
|
return this.value = new cNumber(res);
|
|
};
|
|
cVDB.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( cost , salvage , life , start-period , end-period [ , [ [ factor ] [ , [ no-switch-flag ] ] ] ] ] )"
|
|
};
|
|
};
|
|
function cXIRR() {
|
|
this.name = "XIRR";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 2;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 3;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cXIRR.prototype = Object.create(cBaseFunction.prototype);
|
|
cXIRR.prototype.Calculate = function (arg) {
|
|
var arg0 = arg[0],
|
|
arg1 = arg[1],
|
|
arg2 = arg[2] ? arg[2] : new cNumber(0.1);
|
|
function xirrFunction(values, dates, rate) {
|
|
var D_0 = dates[0],
|
|
r = rate + 1,
|
|
res = values[0];
|
|
for (var i = 1, count = values.length; i < count; i++) {
|
|
res += values[i] / Math.pow(r, (dates[i] - D_0) / 365);
|
|
}
|
|
return res;
|
|
}
|
|
function xirrDeriv(values, dates, rate) {
|
|
var D_0 = dates[0],
|
|
r = rate + 1,
|
|
res = 0,
|
|
sumDerivI;
|
|
for (var i = 1, count = values.length; i < count; i++) {
|
|
sumDerivI = (dates[i] - D_0) / 365;
|
|
res -= sumDerivI * values[i] / Math.pow(r, sumDerivI + 1);
|
|
}
|
|
return res;
|
|
}
|
|
function xirr(valueArray, dateArray, rate) {
|
|
var arr0 = valueArray[0],
|
|
arr1 = dateArray[0];
|
|
if (arr0 instanceof cError) {
|
|
return arr0;
|
|
}
|
|
if (arr1 instanceof cError) {
|
|
return arr1;
|
|
}
|
|
if (arr0.getValue() == 0) {
|
|
return new cError(cErrorType.not_numeric);
|
|
}
|
|
if (valueArray.length < 2 || (dateArray.length != valueArray.length)) {
|
|
return new cError(cErrorType.not_numeric);
|
|
}
|
|
var res = rate.getValue();
|
|
if (res <= -1) {
|
|
return new cError(cErrorType.not_numeric);
|
|
}
|
|
var deltaEps = 1e-06,
|
|
maxIter = 100,
|
|
wasNeg = false,
|
|
wasPos = false,
|
|
newXirrRes, eps, xirrRes, bContLoop = true;
|
|
for (var i = 0; i < dateArray.length; i++) {
|
|
dateArray[i] = dateArray[i].tocNumber();
|
|
valueArray[i] = valueArray[i].tocNumber();
|
|
if (dateArray[i] instanceof cError || valueArray[i] instanceof cError) {
|
|
return new cError(cErrorType.wrong_value_type);
|
|
}
|
|
dateArray[i] = Math.floor(dateArray[i].getValue());
|
|
valueArray[i] = valueArray[i].getValue();
|
|
if (dateArray[0] > dateArray[i]) {
|
|
return new cError(cErrorType.not_numeric);
|
|
}
|
|
if (valueArray[i] < 0) {
|
|
wasNeg = true;
|
|
} else {
|
|
wasPos = true;
|
|
}
|
|
}
|
|
if (! (wasNeg && wasPos)) {
|
|
return new cError(cErrorType.not_numeric);
|
|
}
|
|
do {
|
|
xirrRes = xirrFunction(valueArray, dateArray, res);
|
|
newXirrRes = res - xirrRes / xirrDeriv(valueArray, dateArray, res);
|
|
eps = Math.abs(newXirrRes - res);
|
|
res = newXirrRes;
|
|
bContLoop = (eps > deltaEps) && (Math.abs(xirrRes) > deltaEps);
|
|
} while (--maxIter && bContLoop);
|
|
if (bContLoop) {
|
|
return new cError(cErrorType.not_numeric);
|
|
}
|
|
return new cNumber(res);
|
|
}
|
|
var dateArray = [],
|
|
valueArray = [];
|
|
if (arg0 instanceof cArea) {
|
|
arg0.foreach2(function (c) {
|
|
if (c instanceof cNumber) {
|
|
valueArray.push(c);
|
|
} else {
|
|
if (c instanceof cEmpty) {
|
|
valueArray.push(c.tocNumber());
|
|
} else {
|
|
valueArray.push(new cError(cErrorType.wrong_value_type));
|
|
}
|
|
}
|
|
});
|
|
} else {
|
|
if (arg0 instanceof cArray) {
|
|
arg0.foreach(function (c) {
|
|
if (c instanceof cNumber) {
|
|
valueArray.push(c);
|
|
} else {
|
|
if (c instanceof cEmpty) {
|
|
valueArray.push(c.tocNumber());
|
|
} else {
|
|
valueArray.push(new cError(cErrorType.wrong_value_type));
|
|
}
|
|
}
|
|
});
|
|
} else {
|
|
if (arg0 instanceof cArea3D) {
|
|
if (arg0.wsFrom == arg0.wsTo) {
|
|
valueArray = arg0.getMatrix()[0];
|
|
} else {
|
|
return this.value = new cError(cErrorType.wrong_value_type);
|
|
}
|
|
} else {
|
|
if (! (arg0 instanceof cNumber)) {
|
|
return this.value = new cError(cErrorType.wrong_value_type);
|
|
} else {
|
|
valueArray[0] = arg0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (arg1 instanceof cArea) {
|
|
arg1.foreach2(function (c) {
|
|
if (c instanceof cNumber) {
|
|
dateArray.push(c);
|
|
} else {
|
|
if (c instanceof cEmpty) {
|
|
dateArray.push(c.tocNumber());
|
|
} else {
|
|
dateArray.push(new cError(cErrorType.wrong_value_type));
|
|
}
|
|
}
|
|
});
|
|
} else {
|
|
if (arg1 instanceof cArray) {
|
|
arg1.foreach(function (c) {
|
|
if (c instanceof cNumber) {
|
|
dateArray.push(c);
|
|
} else {
|
|
if (c instanceof cEmpty) {
|
|
dateArray.push(c.tocNumber());
|
|
} else {
|
|
dateArray.push(new cError(cErrorType.wrong_value_type));
|
|
}
|
|
}
|
|
});
|
|
} else {
|
|
if (arg1 instanceof cArea3D) {
|
|
if (arg1.wsFrom == arg1.wsTo) {
|
|
dateArray = arg1.getMatrix()[0];
|
|
} else {
|
|
return this.value = new cError(cErrorType.wrong_value_type);
|
|
}
|
|
} else {
|
|
if (! (arg1 instanceof cNumber)) {
|
|
return this.value = new cError(cErrorType.wrong_value_type);
|
|
} else {
|
|
dateArray[0] = arg1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (arg2 instanceof cRef || arg2 instanceof cRef3D) {
|
|
arg2 = arg2.getValue();
|
|
if (! (arg2 instanceof cNumber)) {
|
|
return this.value = new cError(cErrorType.wrong_value_type);
|
|
}
|
|
} else {
|
|
if (arg2 instanceof cArea || arg2 instanceof cArea3D) {
|
|
arg2 = arg2.cross(arguments[1].first);
|
|
if (! (arg2 instanceof cNumber)) {
|
|
return this.value = new cError(cErrorType.wrong_value_type);
|
|
}
|
|
} else {
|
|
if (arg2 instanceof cArray) {
|
|
arg2 = arg2.getElement(0);
|
|
if (! (arg2 instanceof cNumber)) {
|
|
return this.value = new cError(cErrorType.wrong_value_type);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
arg2 = arg2.tocNumber();
|
|
if (arg2 instanceof cError) {
|
|
return this.value = arg2;
|
|
}
|
|
this.value = xirr(valueArray, dateArray, arg2);
|
|
this.value.numFormat = 9;
|
|
return this.value;
|
|
};
|
|
cXIRR.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( values , dates [ , [ guess ] ] )"
|
|
};
|
|
};
|
|
function cXNPV() {
|
|
this.name = "XNPV";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 3;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 3;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cXNPV.prototype = Object.create(cBaseFunction.prototype);
|
|
cXNPV.prototype.Calculate = function (arg) {
|
|
var arg0 = arg[0],
|
|
arg1 = arg[1],
|
|
arg2 = arg[2];
|
|
function xnpv(rate, valueArray, dateArray) {
|
|
var res = 0,
|
|
vaTmp, daTmp, r = rate.getValue();
|
|
if (dateArray.length != valueArray.length) {
|
|
return new cError(cErrorType.not_numeric);
|
|
}
|
|
if (! (dateArray[0] instanceof cNumber) || !(valueArray[0] instanceof cNumber)) {
|
|
return new cError(cErrorType.wrong_value_type);
|
|
}
|
|
var d1 = Math.floor(dateArray[0].getValue()),
|
|
wasNeg = false,
|
|
wasPos = false;
|
|
for (var i = 0; i < dateArray.length; i++) {
|
|
vaTmp = valueArray[i].tocNumber();
|
|
daTmp = dateArray[i].tocNumber();
|
|
if (vaTmp instanceof cError || daTmp instanceof cError) {
|
|
return new cError(cErrorType.not_numeric);
|
|
}
|
|
res += vaTmp.getValue() / (Math.pow((1 + r), (Math.floor(daTmp.getValue()) - d1) / 365));
|
|
}
|
|
return new cNumber(res);
|
|
}
|
|
if (arg0 instanceof cArea || arg0 instanceof cArea3D) {
|
|
arg0 = arg0.cross(arguments[1].first);
|
|
}
|
|
if (arg0 instanceof cArray) {
|
|
arg0 = arg0.getElement(0);
|
|
}
|
|
arg0 = arg0.tocNumber();
|
|
if (arg0 instanceof cError) {
|
|
return this.value = arg0;
|
|
}
|
|
var dateArray = [],
|
|
valueArray = [];
|
|
if (arg1 instanceof cArea) {
|
|
arg1.foreach2(function (c) {
|
|
if (c instanceof cNumber) {
|
|
valueArray.push(c);
|
|
} else {
|
|
valueArray.push(new cError(cErrorType.not_numeric));
|
|
}
|
|
});
|
|
} else {
|
|
if (arg1 instanceof cArray) {
|
|
arg1.foreach(function (c) {
|
|
if (c instanceof cNumber) {
|
|
valueArray.push(c);
|
|
} else {
|
|
valueArray.push(new cError(cErrorType.not_numeric));
|
|
}
|
|
});
|
|
} else {
|
|
if (arg1 instanceof cArea3D) {
|
|
if (arg1.wsFrom == arg1.wsTo) {
|
|
valueArray = arg1.getMatrix()[0];
|
|
} else {
|
|
return this.value = new cError(cErrorType.wrong_value_type);
|
|
}
|
|
} else {
|
|
arg1 = arg1.tocNumber();
|
|
if (arg1 instanceof cError) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
} else {
|
|
valueArray[0] = arg1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (arg2 instanceof cArea) {
|
|
arg2.foreach2(function (c) {
|
|
if (c instanceof cNumber) {
|
|
dateArray.push(c);
|
|
} else {
|
|
dateArray.push(new cError(cErrorType.not_numeric));
|
|
}
|
|
});
|
|
} else {
|
|
if (arg2 instanceof cArray) {
|
|
arg2.foreach(function (c) {
|
|
if (c instanceof cNumber) {
|
|
dateArray.push(c);
|
|
} else {
|
|
dateArray.push(new cError(cErrorType.not_numeric));
|
|
}
|
|
});
|
|
} else {
|
|
if (arg2 instanceof cArea3D) {
|
|
if (arg2.wsFrom == arg2.wsTo) {
|
|
dateArray = arg2.getMatrix()[0];
|
|
} else {
|
|
return this.value = new cError(cErrorType.wrong_value_type);
|
|
}
|
|
} else {
|
|
arg2 = arg2.tocNumber();
|
|
if (arg2 instanceof cError) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
} else {
|
|
dateArray[0] = arg2;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return this.value = xnpv(arg0, valueArray, dateArray);
|
|
};
|
|
cXNPV.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( rate , values , dates )"
|
|
};
|
|
};
|
|
function cYIELD() {
|
|
this.name = "YIELD";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 6;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 7;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cYIELD.prototype = Object.create(cBaseFunction.prototype);
|
|
cYIELD.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
rate = arg[2],
|
|
pr = arg[3],
|
|
redemption = arg[4],
|
|
frequency = arg[5],
|
|
basis = arg[6] && !(arg[6] instanceof cEmpty) ? arg[6] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pr instanceof cArea || pr instanceof cArea3D) {
|
|
pr = pr.cross(arguments[1].first);
|
|
} else {
|
|
if (pr instanceof cArray) {
|
|
pr = pr.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (redemption instanceof cArea || redemption instanceof cArea3D) {
|
|
redemption = redemption.cross(arguments[1].first);
|
|
} else {
|
|
if (redemption instanceof cArray) {
|
|
redemption = redemption.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (frequency instanceof cArea || frequency instanceof cArea3D) {
|
|
frequency = frequency.cross(arguments[1].first);
|
|
} else {
|
|
if (frequency instanceof cArray) {
|
|
frequency = frequency.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
rate = rate.tocNumber();
|
|
pr = pr.tocNumber();
|
|
redemption = redemption.tocNumber();
|
|
frequency = frequency.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (pr instanceof cError) {
|
|
return this.value = pr;
|
|
}
|
|
if (redemption instanceof cError) {
|
|
return this.value = redemption;
|
|
}
|
|
if (frequency instanceof cError) {
|
|
return this.value = frequency;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
rate = rate.getValue();
|
|
pr = pr.getValue();
|
|
redemption = redemption.getValue();
|
|
frequency = Math.floor(frequency.getValue());
|
|
basis = Math.floor(basis.getValue());
|
|
if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || (frequency != 1 && frequency != 2 && frequency != 4) || rate < 0 || pr <= 0 || redemption <= 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var settl = Date.prototype.getDateFromExcel(settlement),
|
|
matur = Date.prototype.getDateFromExcel(maturity);
|
|
this.value = new cNumber(getYield(settl, matur, rate, pr, redemption, frequency, basis));
|
|
return this.value;
|
|
};
|
|
cYIELD.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , rate , pr , redemption , frequency [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cYIELDDISC() {
|
|
this.name = "YIELDDISC";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 4;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 5;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cYIELDDISC.prototype = Object.create(cBaseFunction.prototype);
|
|
cYIELDDISC.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
pr = arg[2],
|
|
redemption = arg[3],
|
|
basis = arg[4] && !(arg[4] instanceof cEmpty) ? arg[4] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pr instanceof cArea || pr instanceof cArea3D) {
|
|
pr = pr.cross(arguments[1].first);
|
|
} else {
|
|
if (pr instanceof cArray) {
|
|
pr = pr.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (redemption instanceof cArea || redemption instanceof cArea3D) {
|
|
redemption = redemption.cross(arguments[1].first);
|
|
} else {
|
|
if (redemption instanceof cArray) {
|
|
redemption = redemption.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
pr = pr.tocNumber();
|
|
redemption = redemption.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (pr instanceof cError) {
|
|
return this.value = pr;
|
|
}
|
|
if (redemption instanceof cError) {
|
|
return this.value = redemption;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
pr = pr.getValue();
|
|
redemption = redemption.getValue();
|
|
basis = Math.floor(basis.getValue());
|
|
if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || pr <= 0 || redemption <= 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var settl = Date.prototype.getDateFromExcel(settlement),
|
|
matur = Date.prototype.getDateFromExcel(maturity);
|
|
var fRet = (redemption / pr) - 1;
|
|
fRet /= yearFrac(settl, matur, basis);
|
|
this.value = new cNumber(fRet);
|
|
this.value.numFormat = 10;
|
|
return this.value;
|
|
};
|
|
cYIELDDISC.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , pr , redemption , [ , [ basis ] ] )"
|
|
};
|
|
};
|
|
function cYIELDMAT() {
|
|
this.name = "YIELDMAT";
|
|
this.type = cElementType.func;
|
|
this.value = null;
|
|
this.argumentsMin = 5;
|
|
this.argumentsCurrent = 0;
|
|
this.argumentsMax = 6;
|
|
this.formatType = {
|
|
def: -1,
|
|
noneFormat: -2
|
|
};
|
|
this.numFormat = this.formatType.noneFormat;
|
|
}
|
|
cYIELDMAT.prototype = Object.create(cBaseFunction.prototype);
|
|
cYIELDMAT.prototype.Calculate = function (arg) {
|
|
var settlement = arg[0],
|
|
maturity = arg[1],
|
|
issue = arg[2],
|
|
rate = arg[3],
|
|
pr = arg[4],
|
|
basis = arg[5] && !(arg[5] instanceof cEmpty) ? arg[5] : new cNumber(0);
|
|
if (settlement instanceof cArea || settlement instanceof cArea3D) {
|
|
settlement = settlement.cross(arguments[1].first);
|
|
} else {
|
|
if (settlement instanceof cArray) {
|
|
settlement = settlement.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (maturity instanceof cArea || maturity instanceof cArea3D) {
|
|
maturity = maturity.cross(arguments[1].first);
|
|
} else {
|
|
if (maturity instanceof cArray) {
|
|
maturity = maturity.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (issue instanceof cArea || issue instanceof cArea3D) {
|
|
issue = issue.cross(arguments[1].first);
|
|
} else {
|
|
if (issue instanceof cArray) {
|
|
issue = issue.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (rate instanceof cArea || rate instanceof cArea3D) {
|
|
rate = rate.cross(arguments[1].first);
|
|
} else {
|
|
if (rate instanceof cArray) {
|
|
rate = rate.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (pr instanceof cArea || pr instanceof cArea3D) {
|
|
pr = pr.cross(arguments[1].first);
|
|
} else {
|
|
if (pr instanceof cArray) {
|
|
pr = pr.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
if (basis instanceof cArea || basis instanceof cArea3D) {
|
|
basis = basis.cross(arguments[1].first);
|
|
} else {
|
|
if (basis instanceof cArray) {
|
|
basis = basis.getElementRowCol(0, 0);
|
|
}
|
|
}
|
|
settlement = settlement.tocNumber();
|
|
maturity = maturity.tocNumber();
|
|
issue = issue.tocNumber();
|
|
rate = rate.tocNumber();
|
|
pr = pr.tocNumber();
|
|
basis = basis.tocNumber();
|
|
if (settlement instanceof cError) {
|
|
return this.value = settlement;
|
|
}
|
|
if (maturity instanceof cError) {
|
|
return this.value = maturity;
|
|
}
|
|
if (issue instanceof cError) {
|
|
return this.value = issue;
|
|
}
|
|
if (rate instanceof cError) {
|
|
return this.value = rate;
|
|
}
|
|
if (pr instanceof cError) {
|
|
return this.value = pr;
|
|
}
|
|
if (basis instanceof cError) {
|
|
return this.value = basis;
|
|
}
|
|
settlement = Math.floor(settlement.getValue());
|
|
maturity = Math.floor(maturity.getValue());
|
|
issue = Math.floor(issue.getValue());
|
|
rate = rate.getValue();
|
|
pr = pr.getValue();
|
|
basis = Math.floor(basis.getValue());
|
|
if (settlement < startRangeCurrentDateSystem || maturity < startRangeCurrentDateSystem || issue < startRangeCurrentDateSystem || settlement >= maturity || basis < 0 || basis > 4 || pr <= 0 || rate <= 0) {
|
|
return this.value = new cError(cErrorType.not_numeric);
|
|
}
|
|
var settl = Date.prototype.getDateFromExcel(settlement),
|
|
matur = Date.prototype.getDateFromExcel(maturity),
|
|
iss = Date.prototype.getDateFromExcel(issue),
|
|
res = getyieldmat(settl, matur, iss, rate, pr, basis);
|
|
this.value = new cNumber(res);
|
|
this.value.numFormat = 10;
|
|
return this.value;
|
|
};
|
|
cYIELDMAT.prototype.getInfo = function () {
|
|
return {
|
|
name: this.name,
|
|
args: "( settlement , maturity , issue , rate , pr [ , [ basis ] ] )"
|
|
};
|
|
}; |