示例#1
0
        private static void TA_INT_StdDevUsingPrecalcMA(decimal[] inReal, decimal[] inMovAvg, int inMovAvgBegIdx, int inMovAvgNbElement,
                                                        decimal[] outReal, int optInTimePeriod)
        {
            decimal tempReal;
            int     startSum     = inMovAvgBegIdx + 1 - optInTimePeriod;
            int     endSum       = inMovAvgBegIdx;
            decimal periodTotal2 = default;

            for (int outIdx = startSum; outIdx < endSum; outIdx++)
            {
                tempReal      = inReal[outIdx];
                tempReal     *= tempReal;
                periodTotal2 += tempReal;
            }

            for (var outIdx = 0; outIdx < inMovAvgNbElement; outIdx++, startSum++, endSum++)
            {
                tempReal      = inReal[endSum];
                tempReal     *= tempReal;
                periodTotal2 += tempReal;
                decimal meanValue2 = periodTotal2 / optInTimePeriod;

                tempReal      = inReal[startSum];
                tempReal     *= tempReal;
                periodTotal2 -= tempReal;

                tempReal    = inMovAvg[outIdx];
                tempReal   *= tempReal;
                meanValue2 -= tempReal;

                outReal[outIdx] = !TA_IsZeroOrNeg(meanValue2) ? DecimalMath.Sqrt(meanValue2) : Decimal.Zero;
            }
        }
示例#2
0
        public static RetCode Sqrt(decimal[] inReal, int startIdx, int endIdx, decimal[] outReal, out int outBegIdx, out int outNbElement)
        {
            outBegIdx = outNbElement = 0;

            if (startIdx < 0 || endIdx < 0 || endIdx < startIdx)
            {
                return(RetCode.OutOfRangeStartIndex);
            }

            if (inReal == null || outReal == null)
            {
                return(RetCode.BadParam);
            }

            int outIdx = default;

            for (int i = startIdx; i <= endIdx; i++)
            {
                outReal[outIdx++] = DecimalMath.Sqrt(inReal[i]);
            }

            outBegIdx    = startIdx;
            outNbElement = outIdx;

            return(RetCode.Success);
        }
示例#3
0
        private static void TA_INT_StdDevUsingPrecalcMA(decimal[] inReal, decimal[] inMovAvg, int inMovAvgBegIdx, int inMovAvgNbElement,
                                                        int timePeriod, decimal[] output)
        {
            decimal tempReal;
            int     outIdx;
            int     startSum     = inMovAvgBegIdx + 1 - timePeriod;
            int     endSum       = inMovAvgBegIdx;
            decimal periodTotal2 = default;

            for (outIdx = startSum; outIdx < endSum; outIdx++)
            {
                tempReal      = inReal[outIdx];
                tempReal     *= tempReal;
                periodTotal2 += tempReal;
            }

            outIdx = 0;
            while (outIdx < inMovAvgNbElement)
            {
                tempReal      = inReal[endSum];
                tempReal     *= tempReal;
                periodTotal2 += tempReal;
                decimal meanValue2 = periodTotal2 / timePeriod;
                tempReal      = inReal[startSum];
                tempReal     *= tempReal;
                periodTotal2 -= tempReal;
                tempReal      = inMovAvg[outIdx];
                tempReal     *= tempReal;
                meanValue2   -= tempReal;
                if (meanValue2 >= 1E-08m)
                {
                    output[outIdx] = DecimalMath.Sqrt(meanValue2);
                }
                else
                {
                    output[outIdx] = Decimal.Zero;
                }

                outIdx++;
                startSum++;
                endSum++;
            }
        }
示例#4
0
        public static RetCode StdDev(decimal[] inReal, int startIdx, int endIdx, decimal[] outReal, out int outBegIdx, out int outNbElement,
                                     int optInTimePeriod = 5, decimal optInNbDev = 1m)
        {
            outBegIdx = outNbElement = 0;

            if (startIdx < 0 || endIdx < 0 || endIdx < startIdx)
            {
                return(RetCode.OutOfRangeStartIndex);
            }

            if (inReal == null || outReal == null || optInTimePeriod < 2 || optInTimePeriod > 100000)
            {
                return(RetCode.BadParam);
            }

            RetCode retCode = TA_INT_VAR(inReal, startIdx, endIdx, outReal, out outBegIdx, out outNbElement, optInTimePeriod);

            if (retCode != RetCode.Success)
            {
                return(retCode);
            }

            if (optInNbDev != Decimal.One)
            {
                for (var i = 0; i < outNbElement; i++)
                {
                    decimal tempReal = outReal[i];
                    outReal[i] = !TA_IsZeroOrNeg(tempReal) ? DecimalMath.Sqrt(tempReal) * optInNbDev : Decimal.Zero;
                }
            }
            else
            {
                for (var i = 0; i < outNbElement; i++)
                {
                    decimal tempReal = outReal[i];
                    outReal[i] = !TA_IsZeroOrNeg(tempReal) ? DecimalMath.Sqrt(tempReal) : Decimal.Zero;
                }
            }

            return(RetCode.Success);
        }
示例#5
0
        public static RetCode Correl(decimal[] inReal0, decimal[] inReal1, int startIdx, int endIdx, decimal[] outReal, out int outBegIdx,
                                     out int outNbElement, int optInTimePeriod = 30)
        {
            outBegIdx = outNbElement = 0;

            if (startIdx < 0 || endIdx < 0 || endIdx < startIdx)
            {
                return(RetCode.OutOfRangeStartIndex);
            }

            if (inReal0 == null || inReal1 == null || outReal == null || optInTimePeriod < 1 || optInTimePeriod > 100000)
            {
                return(RetCode.BadParam);
            }

            int lookbackTotal = CorrelLookback(optInTimePeriod);

            if (startIdx < lookbackTotal)
            {
                startIdx = lookbackTotal;
            }

            if (startIdx > endIdx)
            {
                return(RetCode.Success);
            }

            outBegIdx = startIdx;
            int trailingIdx = startIdx - lookbackTotal;

            decimal sumX, sumY, sumX2, sumY2;
            decimal sumXY = sumX = sumY = sumX2 = sumY2 = default;
            int     today;

            for (today = trailingIdx; today <= startIdx; today++)
            {
                decimal x = inReal0[today];
                sumX  += x;
                sumX2 += x * x;

                decimal y = inReal1[today];
                sumXY += x * y;
                sumY  += y;
                sumY2 += y * y;
            }

            decimal trailingX = inReal0[trailingIdx];
            decimal trailingY = inReal1[trailingIdx++];
            decimal tempReal  = (sumX2 - sumX * sumX / optInTimePeriod) * (sumY2 - sumY * sumY / optInTimePeriod);

            outReal[0] = !TA_IsZeroOrNeg(tempReal) ? (sumXY - sumX * sumY / optInTimePeriod) / DecimalMath.Sqrt(tempReal) : Decimal.Zero;

            int outIdx = 1;

            while (today <= endIdx)
            {
                sumX  -= trailingX;
                sumX2 -= trailingX * trailingX;

                sumXY -= trailingX * trailingY;
                sumY  -= trailingY;
                sumY2 -= trailingY * trailingY;

                decimal x = inReal0[today];
                sumX  += x;
                sumX2 += x * x;

                decimal y = inReal1[today++];
                sumXY += x * y;
                sumY  += y;
                sumY2 += y * y;

                trailingX         = inReal0[trailingIdx];
                trailingY         = inReal1[trailingIdx++];
                tempReal          = (sumX2 - sumX * sumX / optInTimePeriod) * (sumY2 - sumY * sumY / optInTimePeriod);
                outReal[outIdx++] = !TA_IsZeroOrNeg(tempReal)
                    ? (sumXY - sumX * sumY / optInTimePeriod) / DecimalMath.Sqrt(tempReal)
                    : Decimal.Zero;
            }

            outNbElement = outIdx;

            return(RetCode.Success);
        }