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; } }
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); }
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++; } }
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); }
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); }