public override void Update(double dataPoint)
        {
            _rsi.Update(dataPoint);
            _msCrsi.Update(_rsi.Value);

            SetValue(_msCrsi.Value);
        }
        public override void Update(Bar bar)
        {
            var index = (bar.ClosePrice - bar.OpenPrice) * bar.Volume / (bar.HighestPrice - bar.LowestPrice);

            _ms.Update(index);

            SetValue(_ms.Value);
        }
        public override void Update(Bar bar)
        {
            var cost = ((bar.ClosePrice - bar.LowestPrice)
                        - (bar.HighestPrice - bar.ClosePrice))
                       / (bar.HighestPrice - bar.LowestPrice)
                       * bar.Volume;

            _sumCost.Update(cost);
            _sumVolume.Update(bar.Volume);

            SetValue(_sumCost.Value / _sumVolume.Value);
        }
示例#4
0
        public override void Update(Bar bar)
        {
            var truePrice = (bar.HighestPrice + bar.LowestPrice + 2 * bar.ClosePrice) / 4;

            _msCost.Update(bar.Volume * truePrice);
            var sumCost = _msCost.Value;

            _msVolume.Update(bar.Volume);
            var sumVolume = _msVolume.Value;

            SetValue(sumCost / sumVolume);
        }
        public override void Update(double dataPoint)
        {
            _volatility.Update(Math.Abs(dataPoint - _previousData));
            var volatilitySum = _volatility.Value;

            var movingSpeed = Data.Length == 0 ? 0.0 : Math.Abs(Data[-1] - Data[0]);

            Data.Add(dataPoint);

            _previousData = dataPoint;

            var efficencyRatio = Math.Abs(volatilitySum) < 1e-6 ? 0.0: movingSpeed / volatilitySum;

            SetValue(efficencyRatio);
        }
示例#6
0
        public override void Update(Bar bar)
        {
            const double smallValue = 1e-10;

            double pv, nv, zv;

            if (_firstBar)
            {
                pv = nv = smallValue;
                zv = bar.Volume;
            }
            else
            {
                if (bar.ClosePrice > _prevClosePrice)
                {
                    pv = bar.Volume;
                    nv = zv = 0.0;
                }
                else if (bar.ClosePrice < _prevClosePrice)
                {
                    nv = bar.Volume;
                    pv = zv = 0.0;
                }
                else
                {
                    zv = bar.Volume;
                    pv = nv = 0.0;
                }
            }

            _msPv.Update(pv);
            _msNv.Update(nv);
            _msZv.Update(zv);

            var msPv = _msPv.Value + smallValue;
            var msNv = _msNv.Value + smallValue;
            var msZv = _msZv.Value + smallValue;

            var volumeRatio = (msPv + msZv / 2.0) / (msNv + msZv / 2.0) * 100.0;

            // update status
            _prevClosePrice = bar.ClosePrice;
            _firstBar       = false;

            // return result;
            SetValue(volumeRatio);
        }
示例#7
0
        public override void Update(Bar bar)
        {
            const double smallValue = 1e-10;

            var truePrice = (bar.HighestPrice + bar.LowestPrice + bar.ClosePrice) / 3;

            double positiveMoneyFlow;
            double negativeMoneyFlow;

            if (_firstData)
            {
                positiveMoneyFlow = truePrice * bar.Volume;
                negativeMoneyFlow = smallValue;
            }
            else
            {
                if (truePrice > _prevTruePrice)
                {
                    positiveMoneyFlow = truePrice * bar.Volume;
                    negativeMoneyFlow = 0.0;
                }
                else if (truePrice < _prevTruePrice)
                {
                    positiveMoneyFlow = 0.0;
                    negativeMoneyFlow = truePrice * bar.Volume;
                }
                else
                {
                    positiveMoneyFlow = negativeMoneyFlow = smallValue;
                }
            }

            _msPmf.Update(positiveMoneyFlow);
            var sumPmf = _msPmf.Value;

            _msNmf.Update(negativeMoneyFlow);
            var sumNmf = _msNmf.Value;

            // update status
            _prevTruePrice = truePrice;
            _firstData     = false;

            // return result
            var mfi = 100.0 / (1.0 + sumPmf / sumNmf);

            SetValue(mfi);
        }
示例#8
0
        public override void Update(Bar bar)
        {
            // calculate AR
            _sumUp.Update(bar.HighestPrice - bar.OpenPrice);
            var up = _sumUp.Value;

            _sumDown.Update(bar.OpenPrice - bar.LowestPrice);
            var down = _sumDown.Value;

            var ar = Math.Abs(down) < 1e-6 ? 0.0 : up / down * 100.0;

            // calculate BR
            var tempBrBs = _firstBar ? 0.0 : Math.Max(0.0, bar.HighestPrice - _prevBar.ClosePrice);
            var tempBrSs = _firstBar ? 0.0 : Math.Max(0.0, _prevBar.ClosePrice - bar.LowestPrice);

            _sumBrBs.Update(tempBrBs);
            var brbs = _sumBrBs.Value;

            _sumBrSs.Update(tempBrSs);
            var brss = _sumBrSs.Value;

            var br = Math.Abs(brss) < 1e-6 ? 0.0 : brbs / brss * 100.0;

            // calculate CR
            var tp = Tp(_prevBar);

            var tempCrBs = _firstBar ? 0.0 : Math.Max(0.0, bar.HighestPrice - tp);
            var tempCrSs = _firstBar ? 0.0 : Math.Max(0.0, tp - bar.LowestPrice);

            _sumCrBs.Update(tempCrBs);
            var crbs = _sumCrBs.Value;

            _sumCrSs.Update(tempCrSs);
            var crss = _sumCrSs.Value;

            var cr = Math.Abs(crss) < 1e-6 ? 0.0 : crbs / crss * 100.0;

            // update bar
            _prevBar  = bar;
            _firstBar = false;

            // return results;
            SetValue(ar, br, cr);
        }
        public override void Update(double dataPoint)
        {
            var uc = _firstData
                ? 0.0
                : Math.Max(0.0, dataPoint - _prevData);

            var dc = _firstData
                ? 0.0
                : Math.Max(0.0, _prevData - dataPoint);

            _msUc.Update(uc);
            var msuc = _msUc.Value;

            _msDc.Update(dc);
            var msdc = _msDc.Value;

            // update status
            _prevData  = dataPoint;
            _firstData = false;

            var rsi = (Math.Abs(msuc + msdc) < 1e-6) ? 0.0 : msuc / (msuc + msdc) * 100.0;

            SetValue(rsi);
        }
示例#10
0
        public override void Update(Bar bar)
        {
            // calculate +DM and -DM
            double pdm, ndm;

            if (_firstBar)
            {
                pdm = 0.0;
                ndm = 0.0;
            }
            else
            {
                pdm = Math.Max(0.0, bar.HighestPrice - _prevBar.HighestPrice);
                ndm = Math.Max(0.0, _prevBar.LowestPrice - bar.LowestPrice);

                if (pdm > ndm)
                {
                    ndm = 0.0;
                }
                else if (pdm < ndm)
                {
                    pdm = 0.0;
                }
                else
                {
                    pdm = ndm = 0.0;
                }
            }

            // Calculate +DI and -DI
            double tr;

            if (_firstBar)
            {
                tr = bar.HighestPrice - bar.LowestPrice;
            }
            else
            {
                tr = Math.Max(Math.Abs(bar.HighestPrice - bar.LowestPrice),
                              Math.Max(Math.Abs(bar.HighestPrice - _prevBar.ClosePrice), Math.Abs(bar.LowestPrice - _prevBar.ClosePrice)));
            }

            // calculate +DIM and -DIM
            _msPdm.Update(pdm);
            _msNdm.Update(ndm);
            _msTr.Update(tr);
            var mspdm = _msPdm.Value;
            var msndm = _msNdm.Value;
            var mstr  = _msTr.Value;

            var pdim = mspdm * 100.0 / mstr;
            var ndim = msndm * 100.0 / mstr;

            // calculate DX and ADX
            var dx = Math.Abs((pdim + ndim)) < 1e-6 ? 0.0 : Math.Abs(pdim - ndim) / (pdim + ndim);

            dx *= 100.0;

            _maDx.Update(dx);
            var adx = _maDx.Value;

            // calculate ADXR
            _adx.Add(adx);
            var adxr = _adx.Length < 2 ? _adx[0] : (_adx[-1] + _adx[0]) / 2.0;

            // update internal status
            _prevBar  = bar;
            _firstBar = false;

            // return result
            SetValue(pdim, ndim, adx, adxr);
        }