示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }