public override void Calculate(int index) { if (this.style == IndicatorStyle.QuantStudio) { double mdm = 0.0; double tr = 0.0; if (index >= this.length) { if (index == this.length) { for (int i = index; i >= index - this.length + 1; i--) { tr += TR.Value(this.input, i); mdm += MDM.Value(this.input, i); } } else { mdm = this.mdmTS[index - 1] - MDM.Value(this.input, index - this.length) + MDM.Value(this.input, index); tr = this.trTS[index - 1] - TR.Value(this.input, index - this.length) + TR.Value(this.input, index); } if (tr != 0.0) { double value = mdm / tr * 100.0; if (!double.IsNaN(value)) { Add(this.input.GetDateTime(index), value); } } } this.mdmTS.Add(this.input.GetDateTime(index), mdm); this.trTS.Add(this.input.GetDateTime(index), tr); } else { double mdm = 0.0; double tr = 0.0; if (index >= this.length) { if (index == this.length) { for (var j = index; j >= index - this.length + 1; j--) { tr += TR.Value(this.input, j); mdm += MDM.Value(this.input, j); } } else { mdm = this.mdmTS[index - 1] - this.mdmTS[index - 1] / this.length + MDM.Value(this.input, index); tr = this.trTS[index - 1] - this.trTS[index - 1] / this.length + TR.Value(this.input, index); } if (tr != 0.0) { double value = mdm / tr * 100.0; if (!double.IsNaN(value)) { Add(this.input.GetDateTime(index), value); } } } this.mdmTS.Add(this.input.GetDateTime(index), mdm); this.trTS.Add(this.input.GetDateTime(index), tr); } }
public override void Calculate(int index) { if (index >= this.length) { int num = -1 * this.length; double value; if (this.style == IndicatorStyle.QuantStudio) { if (index == this.length) { var sum = 0d; for (var i = index; i > index - this.length; i--) { sum += TR.Value(this.input, i); } value = sum / this.length; } else { value = (this[index - 1 + num] * this.length + TR.Value(this.input, index) - TR.Value(this.input, index - this.length)) / this.length; } } else if (index == this.length) { var sum = 0d; for (var j = index; j > index - this.length; j--) { sum += TR.Value(this.input, j); } value = sum / this.length; } else { value = (base[this.input.GetDateTime(index - 1)] * this.length + TR.Value(this.input, index) - TR.Value(this.input, index - this.length)) / this.length; } Add(this.input.GetDateTime(index), value); } }
public static double Value(ISeries input, int index, int length) { return(index < length ? double.NaN : SMA.Value(input, index, length, BarData.Typical) - Enumerable.Range(index - length + 1, length).Reverse().Sum(i => TR.Value(input, i)) / length); }