Example #1
0
        /// <summary>
        /// DEMA = 2 * EMA - EMA of EMA
        /// </summary>
        /// <see cref="http://forex-indicators.net/trend-indicators/dema"/>
        /// <returns></returns>
        public override SingleDoubleSerie Calculate()
        {
            SingleDoubleSerie demaSerie = new SingleDoubleSerie();
            EMA ema = new EMA(Period, false);

            ema.Load(OhlcList);
            List <double?> emaValues = ema.Calculate().Values;

            // assign EMA values to Close price
            for (int i = 0; i < OhlcList.Count; i++)
            {
                OhlcList[i].Close = emaValues[i].HasValue ? emaValues[i].Value : 0.0;
            }

            ema.Load(OhlcList.Skip(Period - 1).ToList());
            // EMA(EMA(value))
            List <double?> emaEmaValues = ema.Calculate().Values;

            for (int i = 0; i < Period - 1; i++)
            {
                emaEmaValues.Insert(0, null);
            }

            // Calculate DEMA
            for (int i = 0; i < OhlcList.Count; i++)
            {
                if (i >= 2 * Period - 2)
                {
                    var dema = 2 * emaValues[i] - emaEmaValues[i];
                    demaSerie.Values.Add(dema);
                }
                else
                {
                    demaSerie.Values.Add(null);
                }
            }

            return(demaSerie);
        }
Example #2
0
        /// <summary>
        /// TrueHigh = Highest of high[0] or close[-1]
        /// TrueLow = Highest of low[0] or close[-1]
        /// TR = TrueHigh - TrueLow
        /// ATR = EMA(TR)
        /// </summary>
        /// <see cref="http://www.fmlabs.com/reference/default.htm?url=TR.htm"/>
        /// <see cref="http://www.fmlabs.com/reference/default.htm?url=ATR.htm"/>
        /// <returns></returns>
        public override ATRSerie Calculate()
        {
            ATRSerie atrSerie = new ATRSerie();

            atrSerie.TrueHigh.Add(null);
            atrSerie.TrueLow.Add(null);
            atrSerie.TrueRange.Add(null);
            atrSerie.ATR.Add(null);

            for (int i = 1; i < OhlcList.Count; i++)
            {
                double trueHigh = OhlcList[i].High >= OhlcList[i - 1].Close ? OhlcList[i].High : OhlcList[i - 1].Close;
                atrSerie.TrueHigh.Add(trueHigh);
                double trueLow = OhlcList[i].Low <= OhlcList[i - 1].Close ? OhlcList[i].Low : OhlcList[i - 1].Close;
                atrSerie.TrueLow.Add(trueLow);
                double trueRange = trueHigh - trueLow;
                atrSerie.TrueRange.Add(trueRange);
            }

            for (int i = 1; i < OhlcList.Count; i++)
            {
                OhlcList[i].Close = atrSerie.TrueRange[i].Value;
            }

            EMA ema = new EMA(Period, true);

            ema.Load(OhlcList.Skip(1).ToList());
            List <double?> atrList = ema.Calculate().Values;

            foreach (var atr in atrList)
            {
                atrSerie.ATR.Add(atr);
            }

            return(atrSerie);
        }
Example #3
0
        /// <summary>
        /// 1 - EMA of Close prices [EMA(Close)]
        /// 2 - Double smooth [EMA(EMA(Close))]
        /// 3 - Triple smooth [EMA(EMA(EMA(Close)))]
        /// 4 - a) Calculation with percentage: [ROC(EMA(EMA(EMA(Close))))]
        /// 4 - b) Calculation with percentage: [Momentum(EMA(EMA(EMA(Close))))]
        /// </summary>
        /// <see cref="http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:trix"/>
        /// <see cref="http://www.fmlabs.com/reference/default.htm?url=TRIX.htm"/>
        /// <returns></returns>
        public override SingleDoubleSerie Calculate()
        {
            // EMA calculation
            EMA ema = new EMA(Period, false);

            ema.Load(OhlcList);
            List <double?> emaValues = ema.Calculate().Values;

            for (int i = 0; i < OhlcList.Count; i++)
            {
                OhlcList[i].Close = emaValues[i].HasValue ? emaValues[i].Value : 0.0;
            }

            // Double smooth
            ema.Load(OhlcList.Skip(Period - 1).ToList());
            List <double?> doubleSmoothValues = ema.Calculate().Values;

            for (int i = 0; i < Period - 1; i++)
            {
                doubleSmoothValues.Insert(0, null);
            }
            for (int i = 0; i < OhlcList.Count; i++)
            {
                OhlcList[i].Close = doubleSmoothValues[i].HasValue ? doubleSmoothValues[i].Value : 0.0;
            }

            // Triple smooth
            ema.Load(OhlcList.Skip(2 * (Period - 1)).ToList());
            List <double?> tripleSmoothValues = ema.Calculate().Values;

            for (int i = 0; i < (2 * (Period - 1)); i++)
            {
                tripleSmoothValues.Insert(0, null);
            }
            for (int i = 0; i < OhlcList.Count; i++)
            {
                OhlcList[i].Close = tripleSmoothValues[i].HasValue ? tripleSmoothValues[i].Value : 0.0;
            }

            // Last step
            SingleDoubleSerie trixSerie = new SingleDoubleSerie();

            if (CalculatePercentage)
            {
                ROC roc = new ROC(1);
                roc.Load(OhlcList.Skip(3 * (Period - 1)).ToList());
                trixSerie = roc.Calculate();
            }
            else
            {
                Momentum momentum = new Momentum();
                momentum.Load(OhlcList.Skip(3 * (Period - 1)).ToList());
                trixSerie = momentum.Calculate();
            }

            for (int i = 0; i < (3 * (Period - 1)); i++)
            {
                trixSerie.Values.Insert(0, null);
            }

            return(trixSerie);
        }
Example #4
0
        public override ADXSerie Calculate()
        {
            ADXSerie adxSerie = new ADXSerie();

            List <Ohlc> tempOhlcList = new List <Ohlc>();

            for (int i = 0; i < OhlcList.Count; i++)
            {
                Ohlc tempOhlc = new Ohlc()
                {
                    Close = OhlcList[i].High
                };
                tempOhlcList.Add(tempOhlc);
            }
            Momentum momentum = new Momentum();

            momentum.Load(tempOhlcList);
            List <double?> highMomentums = momentum.Calculate().Values;

            tempOhlcList = new List <Ohlc>();
            for (int i = 0; i < OhlcList.Count; i++)
            {
                Ohlc tempOhlc = new Ohlc()
                {
                    Close = OhlcList[i].Low
                };
                tempOhlcList.Add(tempOhlc);
            }
            momentum = new Momentum();
            momentum.Load(tempOhlcList);
            List <double?> lowMomentums = momentum.Calculate().Values;

            for (int i = 0; i < lowMomentums.Count; i++)
            {
                if (lowMomentums[i].HasValue)
                {
                    lowMomentums[i] *= -1;
                }
            }

            //DMIp <- ifelse( dH==dL | (dH< 0 & dL< 0), 0, ifelse( dH >dL, dH, 0 ) )
            List <double?> DMIPositives = new List <double?>()
            {
                null
            };
            // DMIn <- ifelse( dH==dL | (dH< 0 & dL< 0), 0, ifelse( dH <dL, dL, 0 ) )
            List <double?> DMINegatives = new List <double?>()
            {
                null
            };

            for (int i = 1; i < OhlcList.Count; i++)
            {
                if (highMomentums[i] == lowMomentums[i] || (highMomentums[i] < 0 & lowMomentums[i] < 0))
                {
                    DMIPositives.Add(0);
                }
                else
                {
                    if (highMomentums[i] > lowMomentums[i])
                    {
                        DMIPositives.Add(highMomentums[i]);
                    }
                    else
                    {
                        DMIPositives.Add(0);
                    }
                }

                if (highMomentums[i] == lowMomentums[i] || (highMomentums[i] < 0 & lowMomentums[i] < 0))
                {
                    DMINegatives.Add(0);
                }
                else
                {
                    if (highMomentums[i] < lowMomentums[i])
                    {
                        DMINegatives.Add(lowMomentums[i]);
                    }
                    else
                    {
                        DMINegatives.Add(0);
                    }
                }
            }

            ATR atr = new ATR();

            atr.Load(OhlcList);
            List <double?> trueRanges = atr.Calculate().TrueRange;

            adxSerie.TrueRange = trueRanges;

            List <double?> trSum = wilderSum(trueRanges);

            // DIp <- 100 * wilderSum(DMIp, n=n) / TRsum
            List <double?> DIPositives     = new List <double?>();
            List <double?> wilderSumOfDMIp = wilderSum(DMIPositives);

            for (int i = 0; i < wilderSumOfDMIp.Count; i++)
            {
                if (wilderSumOfDMIp[i].HasValue)
                {
                    DIPositives.Add(wilderSumOfDMIp[i].Value * 100 / trSum[i].Value);
                }
                else
                {
                    DIPositives.Add(null);
                }
            }
            adxSerie.DIPositive = DIPositives;

            // DIn <- 100 * wilderSum(DMIn, n=n) / TRsum
            List <double?> DINegatives     = new List <double?>();
            List <double?> wilderSumOfDMIn = wilderSum(DMINegatives);

            for (int i = 0; i < wilderSumOfDMIn.Count; i++)
            {
                if (wilderSumOfDMIn[i].HasValue)
                {
                    DINegatives.Add(wilderSumOfDMIn[i].Value * 100 / trSum[i].Value);
                }
                else
                {
                    DINegatives.Add(null);
                }
            }
            adxSerie.DINegative = DINegatives;

            // DX  <- 100 * ( abs(DIp - DIn) / (DIp + DIn) )
            List <double?> DX = new List <double?>();

            for (int i = 0; i < OhlcList.Count; i++)
            {
                if (DIPositives[i].HasValue)
                {
                    double?dx = 100 * (Math.Abs(DIPositives[i].Value - DINegatives[i].Value) / (DIPositives[i].Value + DINegatives[i].Value));
                    DX.Add(dx);
                }
                else
                {
                    DX.Add(null);
                }
            }
            adxSerie.DX = DX;

            for (int i = 0; i < OhlcList.Count; i++)
            {
                if (DX[i].HasValue)
                {
                    OhlcList[i].Close = DX[i].Value;
                }
                else
                {
                    OhlcList[i].Close = 0.0;
                }
            }

            EMA ema = new EMA(Period, true);

            ema.Load(OhlcList.Skip(Period).ToList());
            List <double?> emaValues = ema.Calculate().Values;

            for (int i = 0; i < Period; i++)
            {
                emaValues.Insert(0, null);
            }
            adxSerie.ADX = emaValues;

            return(adxSerie);
        }
Example #5
0
        /// <summary>
        /// DEMA = 2 * EMA - EMA of EMA
        /// </summary>
        /// <see cref="http://forex-indicators.net/trend-indicators/dema"/>
        /// <returns></returns>
        public override SingleDoubleSerie Calculate()
        {
            SingleDoubleSerie demaSerie = new SingleDoubleSerie();
            EMA ema = new EMA(Period, false, ColumnType);

            ema.Load(OhlcList);
            List <double?> emaValues = ema.Calculate().Values;

            // assign EMA values to column
            for (int i = 0; i < OhlcList.Count; i++)
            {
                switch (ColumnType)
                {
                case ColumnType.AdjClose:
                    OhlcList[i].AdjClose = emaValues[i] ?? 0.0;
                    break;

                case ColumnType.Close:
                    OhlcList[i].Close = emaValues[i] ?? 0.0;
                    break;

                case ColumnType.High:
                    OhlcList[i].High = emaValues[i] ?? 0.0;
                    break;

                case ColumnType.Low:
                    OhlcList[i].Low = emaValues[i] ?? 0.0;
                    break;

                case ColumnType.Open:
                    OhlcList[i].Open = emaValues[i] ?? 0.0;
                    break;

                case ColumnType.Volume:
                    OhlcList[i].Volume = emaValues[i] ?? 0.0;
                    break;

                default:
                    break;
                }
            }

            ema.Load(OhlcList.Skip(Period - 1).ToList());
            // EMA(EMA(value))
            List <double?> emaEmaValues = ema.Calculate().Values;

            for (int i = 0; i < Period - 1; i++)
            {
                emaEmaValues.Insert(0, null);
            }

            // Calculate DEMA
            for (int i = 0; i < OhlcList.Count; i++)
            {
                if (i >= 2 * Period - 2)
                {
                    var dema = 2 * emaValues[i] - emaEmaValues[i];
                    demaSerie.Values.Add(dema);
                }
                else
                {
                    demaSerie.Values.Add(null);
                }
            }

            return(demaSerie);
        }
Example #6
0
        public override MACDSerie Calculate()
        {
            MACDSerie macdSerie = new MACDSerie();

            EMA ema = new EMA(Fast, false);

            ema.Load(OhlcList);
            List <double?> fastEmaValues = ema.Calculate().Values;

            ema = new EMA(Slow, false);
            ema.Load(OhlcList);
            List <double?> slowEmaValues = ema.Calculate().Values;

            for (int i = 0; i < OhlcList.Count; i++)
            {
                // MACD Line
                if (fastEmaValues[i].HasValue && slowEmaValues[i].HasValue)
                {
                    if (!Percent)
                    {
                        macdSerie.MACDLine.Add(fastEmaValues[i].Value - slowEmaValues[i].Value);
                    }
                    else
                    {
                        // macd <- 100 * ( mavg.fast / mavg.slow - 1 )
                        macdSerie.MACDLine.Add(100 * ((fastEmaValues[i].Value / slowEmaValues[i].Value) - 1));
                    }
                    OhlcList[i].Close = macdSerie.MACDLine[i].Value;
                }
                else
                {
                    macdSerie.MACDLine.Add(null);
                    OhlcList[i].Close = 0.0;
                }
            }

            int zeroCount = macdSerie.MACDLine.Where(x => x == null).Count();

            ema = new EMA(Signal, false);
            ema.Load(OhlcList.Skip(zeroCount).ToList());
            List <double?> signalEmaValues = ema.Calculate().Values;

            for (int i = 0; i < zeroCount; i++)
            {
                signalEmaValues.Insert(0, null);
            }

            // Fill Signal and MACD Histogram lists
            for (int i = 0; i < signalEmaValues.Count; i++)
            {
                macdSerie.Signal.Add(signalEmaValues[i]);

                //macdSerie.MACDHistogram.Add(macdSerie.MACDLine[i] - macdSerie.Signal[i]);
                macdSerie.MACDHistogramDataList.Add(new MACDHistogramData()
                {
                    DataDate = OhlcList[i].Date, EmaLineDifference = macdSerie.MACDLine[i] - macdSerie.Signal[i], ClosingValue = OhlcList[i].AdjClose
                });
            }

            /*
             * 1. Difference between MACD and signal line - For plotting histogram
             * 2. Distance between difference - To find the peak-through- slant pattens
             * 3. For decreasing pattern we need to find the point when the decrease intensity reduces
             */
            for (int i = 1; i < macdSerie.MACDHistogramDataList.Count; i++)
            {
                MACDHistogramData currentElement  = macdSerie.MACDHistogramDataList.ElementAt(i);
                MACDHistogramData previousElement = macdSerie.MACDHistogramDataList.ElementAt(i - 1);
                if (
                    currentElement.EmaLineDifference != null &&
                    previousElement.EmaLineDifference != null)
                {
                    SetConvergenceDivergence(previousElement, currentElement);
                    SetChangeInMomentum(previousElement, currentElement);

                    /* For ith Element
                     * (i-1) - (1) < (i-2)-(i-1)
                     */
                    //macdSerie.MACDHistogramDataList.ElementAt(i).isDiffereneAmountDecreasing =
                    //    (
                    //    macdSerie.MACDHistogramDataList.ElementAt(i - 1).EmaLineDifference -
                    //    macdSerie.MACDHistogramDataList.ElementAt(i).EmaLineDifference) <
                    //    (
                    //    macdSerie.MACDHistogramDataList.ElementAt(i - 2).EmaLineDifference -
                    //    macdSerie.MACDHistogramDataList.ElementAt(i - 1).EmaLineDifference
                    //    ) ? true : false;
                    if (currentElement.changeInDivergenceMomentum != null && previousElement.changeInDivergenceMomentum != null)
                    {
                        currentElement.isDiffereneAmountDecreasing =

                            currentElement.changeInDivergenceMomentum.Value <
                            previousElement.changeInDivergenceMomentum.Value;
                    }
                    //SetSignalType(macdSerie.MACDHistogramDataList.ElementAt(i));
                }
            }

            return(macdSerie);
        }