private static int StdErr(int size, decimal[][] inputs, decimal[] options, decimal[][] outputs) { var period = (int)options[0]; if (period < 1) { return(TI_INVALID_OPTION); } if (size <= StdErrStart(options)) { return(TI_OKAY); } var input = inputs[0]; var output = outputs[0]; decimal sum = default; decimal sum2 = default; for (var i = 0; i < period; ++i) { sum += input[i]; sum2 += input[i] * input[i]; } decimal scale = Decimal.One / period; decimal s2S2 = sum2 * scale - sum * scale * sum * scale; if (s2S2 > Decimal.Zero) { s2S2 = DecimalMath.Sqrt(s2S2); } decimal mul = Decimal.One / DecimalMath.Sqrt(period); int outputIndex = default; output[outputIndex++] = mul * s2S2; for (var i = period; i < size; ++i) { sum += input[i]; sum2 += input[i] * input[i]; sum -= input[i - period]; sum2 -= input[i - period] * input[i - period]; s2S2 = sum2 * scale - sum * scale * sum * scale; if (s2S2 > Decimal.Zero) { s2S2 = DecimalMath.Sqrt(s2S2); } output[outputIndex++] = mul * s2S2; } return(TI_OKAY); }
private static int Bbands(int size, decimal[][] inputs, decimal[] options, decimal[][] outputs) { var period = (int)options[0]; if (period < 1) { return(TI_INVALID_OPTION); } if (size <= BbandsStart(options)) { return(TI_OKAY); } decimal[] input = inputs[0]; decimal[] lower = outputs[0]; decimal[] middle = outputs[1]; decimal[] upper = outputs[2]; decimal sum = default; decimal sum2 = default; for (var i = 0; i < period; ++i) { sum += input[i]; sum2 += input[i] * input[i]; } decimal stddev = options[1]; decimal scale = Decimal.One / period; decimal sd = DecimalMath.Sqrt(sum2 * scale - sum * scale * sum * scale); int lowerIndex = default; int middleIndex = default; int upperIndex = default; middle[middleIndex++] = sum * scale; lower[lowerIndex++] = middle[0] - stddev * sd; upper[upperIndex++] = middle[0] + stddev * sd; for (var i = period; i < size; ++i) { sum += input[i]; sum2 += input[i] * input[i]; sum -= input[i - period]; sum2 -= input[i - period] * input[i - period]; sd = DecimalMath.Sqrt(sum2 * scale - sum * scale * sum * scale); middle[middleIndex] = sum * scale; upper[upperIndex++] = middle[middleIndex] + stddev * sd; lower[lowerIndex++] = middle[middleIndex] - stddev * sd; ++middleIndex; } return(TI_OKAY); }
private static int Volatility(int size, decimal[][] inputs, decimal[] options, decimal[][] outputs) { var period = (int)options[0]; if (period < 1) { return(TI_INVALID_OPTION); } if (size <= VolatilityStart(options)) { return(TI_OKAY); } var input = inputs[0]; var output = outputs[0]; decimal sum = default; decimal sum2 = default; for (var i = 1; i <= period; ++i) { decimal c = input[i] / input[i - 1] - Decimal.One; sum += c; sum2 += c * c; } decimal scale = Decimal.One / period; decimal annual = DecimalMath.Sqrt(252m); // Multiplier, number of trading days in year. int outputIndex = default; output[outputIndex++] = DecimalMath.Sqrt(sum2 * scale - sum * scale * sum * scale) * annual; for (var i = period + 1; i < size; ++i) { decimal c = input[i] / input[i - 1] - Decimal.One; sum += c; sum2 += c * c; decimal cp = input[i - period] / input[i - period - 1] - Decimal.One; sum -= cp; sum2 -= cp * cp; output[outputIndex++] = DecimalMath.Sqrt(sum2 * scale - sum * scale * sum * scale) * annual; } return(TI_OKAY); }
private static int Sqrt(int size, decimal[][] inputs, decimal[] options, decimal[][] outputs) { Simple1(size, inputs[0], outputs[0], d => DecimalMath.Sqrt(d)); return(TI_OKAY); }
private static int Vidya(int size, decimal[][] inputs, decimal[] options, decimal[][] outputs) { int shortPeriod = (int)options[0]; int longPeriod = (int)options[1]; decimal alpha = options[2]; if (shortPeriod < 1 || longPeriod < shortPeriod || longPeriod < 2 || alpha < Decimal.Zero || alpha > Decimal.One) { return(TI_INVALID_OPTION); } if (size <= VidyaStart(options)) { return(TI_OKAY); } decimal[] input = inputs[0]; decimal[] output = outputs[0]; decimal shortSum = default; decimal shortSum2 = default; decimal longSum = default; decimal longSum2 = default; for (var i = 0; i < longPeriod; ++i) { longSum += input[i]; longSum2 += input[i] * input[i]; if (i >= longPeriod - shortPeriod) { shortSum += input[i]; shortSum2 += input[i] * input[i]; } } decimal shortDiv = Decimal.One / shortPeriod; decimal longDiv = Decimal.One / longPeriod; decimal val = input[longPeriod - 2]; int outputIndex = default; output[outputIndex++] = val; if (longPeriod - 1 < size) { var shortStdDev = DecimalMath.Sqrt(shortSum2 * shortDiv - shortSum * shortDiv * shortSum * shortDiv); var longStdDev = DecimalMath.Sqrt(longSum2 * longDiv - longSum * longDiv * longSum * longDiv); decimal k = shortStdDev / longStdDev; k *= alpha; val = (input[longPeriod - 1] - val) * k + val; output[outputIndex++] = val; } for (var i = longPeriod; i < size; ++i) { longSum += input[i]; longSum2 += input[i] * input[i]; shortSum += input[i]; shortSum2 += input[i] * input[i]; longSum -= input[i - longPeriod]; longSum2 -= input[i - longPeriod] * input[i - longPeriod]; shortSum -= input[i - shortPeriod]; shortSum2 -= input[i - shortPeriod] * input[i - shortPeriod]; decimal shortStdDev = DecimalMath.Sqrt(shortSum2 * shortDiv - shortSum * shortDiv * shortSum * shortDiv); decimal longStdDev = DecimalMath.Sqrt(longSum2 * longDiv - longSum * longDiv * longSum * longDiv); decimal k = shortStdDev / longStdDev; k *= alpha; val = (input[i] - val) * k + val; output[outputIndex++] = val; } return(TI_OKAY); }