Example #1
0
        public override IEnumerable <(ICandle, ITradingAdviceCode)> AllForecasts(IEnumerable <ICandle> candles)
        {
            if (candles.Count() < MinNumberOfCandles)
            {
                throw new Exception("Number of candles less then expected");
            }

            List <(ICandle, ITradingAdviceCode)> result = new List <(ICandle, ITradingAdviceCode)>();

            List <decimal?> rsi      = candles.Rsi(14);
            BbandItem       bbands   = candles.Bbands(20);
            StochItem       stoch    = candles.Stoch();
            StochItem       stochRsi = candles.StochRsi(fastKPeriod: 3);
            List <decimal>  close    = candles.Close();
            List <decimal>  open     = candles.Open();

            for (int i = 0; i < candles.Count(); i++)
            {
                if (rsi[i] > 70 && stoch.K[i] > 80 && close[i] > open[i] && stochRsi.K[i] > 80 && stoch.K[i] >= stoch.D[i] && stochRsi.K[i] >= stochRsi.D[i] && close[i] > bbands.UpperBand[i] + (bbands.UpperBand[i] - bbands.MiddleBand[i]) * 0.05m)
                {
                    result.Add((candles.ElementAt(i), TradingAdviceCode.SELL));
                }
                else if (rsi[i] < 30 && stoch.K[i] < 20 && close[i] < open[i] && stochRsi.K[i] < 20 && stoch.K[i] <= stoch.D[i] && stochRsi.K[i] <= stochRsi.D[i] && close[i] < bbands.LowerBand[i] - (bbands.MiddleBand[i] - bbands.LowerBand[i]) * 0.05m)
                {
                    result.Add((candles.ElementAt(i), TradingAdviceCode.BUY));
                }
                else
                {
                    result.Add((candles.ElementAt(i), TradingAdviceCode.HOLD));
                }
            }

            return(result);
        }
Example #2
0
        public override IEnumerable <(ICandle, ITradingAdviceCode)> AllForecasts(IEnumerable <ICandle> candles)
        {
            if (candles.Count() < MinNumberOfCandles)
            {
                throw new Exception("Number of candles less then expected");
            }

            List <(ICandle, ITradingAdviceCode)> result = new List <(ICandle, ITradingAdviceCode)>();

            List <decimal?> rsi  = candles.Rsi(5);
            StochItem       fast = candles.StochFast();
            BbandItem       bb   = candles.Bbands(20);

            List <decimal?> adx     = candles.Adx(14);
            List <decimal?> plusDi  = candles.PlusDi(14);
            List <decimal?> minusDi = candles.MinusDi(14);

            for (int i = 0; i < candles.Count(); i++)
            {
                if (rsi[i] < 22 && fast.K[i] < 25 && fast.D[i - 1] > fast.K[i - 1] && fast.D[i] - fast.K[i] < 0.3m)
                {
                    result.Add((candles.ElementAt(i), TradingAdviceCode.BUY));
                }
                else if (rsi[i] > 70 && fast.K[i] > 50)
                {
                    result.Add((candles.ElementAt(i), TradingAdviceCode.SELL));
                }
                else
                {
                    result.Add((candles.ElementAt(i), TradingAdviceCode.BUY));
                }
            }

            return(result);
        }
Example #3
0
        public override IEnumerable <(ICandle, ITradingAdviceCode)> AllForecasts(IEnumerable <ICandle> candles)
        {
            if (candles.Count() < MinNumberOfCandles)
            {
                throw new Exception("Number of candles less then expected");
            }

            RsiBbandsPreset preset = null;

            if (!string.IsNullOrWhiteSpace(Preset))
            {
                preset = JsonConvert.DeserializeObject <RsiBbandsPreset>(Preset);
            }

            List <(ICandle, ITradingAdviceCode)> result = new List <(ICandle, ITradingAdviceCode)>();

            List <decimal?> rsi    = candles.Rsi(preset?.Rsi ?? 6);
            BbandItem       bbands = candles.Bbands(preset?.Bbands ?? 200);
            List <decimal>  closes = candles.Select(x => x.Close).ToList();

            for (int i = 0; i < candles.Count(); i++)
            {
                if (i < 1)
                {
                    result.Add((candles.ElementAt(i), TradingAdviceCode.HOLD));
                }
                else if (rsi[i - 1] > 50 && rsi[i] <= 50 && closes[i - 1] < bbands.UpperBand[i - 1] && closes[i] > bbands.UpperBand[i])
                {
                    result.Add((candles.ElementAt(i), TradingAdviceCode.SELL));
                }
                else if (rsi[i - 1] < 50 && rsi[i] >= 50 && closes[i - 1] < bbands.LowerBand[i - 1] && closes[i] > bbands.LowerBand[i])
                {
                    result.Add((candles.ElementAt(i), TradingAdviceCode.BUY));
                }
                else
                {
                    result.Add((candles.ElementAt(i), TradingAdviceCode.HOLD));
                }
            }

            return(result);
        }
Example #4
0
        public override IEnumerable <(ICandle, ITradingAdviceCode)> AllForecasts(IEnumerable <ICandle> candles)
        {
            if (candles.Count() < MinNumberOfCandles)
            {
                throw new Exception("Number of candles less then expected");
            }

            List <(ICandle, ITradingAdviceCode)> result = new List <(ICandle, ITradingAdviceCode)>();

            List <decimal>  closes = candles.Select(x => x.Close).ToList();
            BbandItem       bb     = candles.Bbands(20);
            List <decimal?> fastMa = candles.Ema(3);
            List <decimal?> hl1    = candles.Select(x => (x.High + x.Low) / 2).ToList().Sma(5);
            List <decimal?> hl2    = candles.Select(x => (x.High + x.Low) / 2).ToList().Sma(34);
            List <int>      ao     = new List <int>();
            MacdItem        macd   = candles.Macd();

            for (int i = 0; i < hl1.Count; i++)
            {
                if (i > 0)
                {
                    if (hl1[i - 1].HasValue && hl2[i - 1].HasValue && hl1[i].HasValue && hl2[i].HasValue)
                    {
                        ao.Add(hl1[i].Value - hl2[i].Value >= 0
                                                          ? hl1[i].Value - hl2[i].Value > hl1[i - 1].Value - hl2[i - 1].Value ? 1 : 2
                                                          : hl1[i].Value - hl2[i].Value > hl1[i - 1].Value - hl2[i - 1].Value ? -1 : -2);
                    }
                    else
                    {
                        ao.Add(0);
                    }
                }
                else
                {
                    ao.Add(0);
                }
            }

            for (int i = 0; i < candles.Count(); i++)
            {
                if (i < 1)
                {
                    result.Add((candles.ElementAt(i), TradingAdviceCode.HOLD));
                }
                else
                {
                    if (closes[i] > bb.MiddleBand[i] &&                     // Closed above the bollinger band
                        Math.Abs(ao[i]) == 1 &&
                        macd.Macd[i] > macd.Signal[i] &&
                        fastMa[i] > bb.MiddleBand[i] &&
                        fastMa[i - 1] < bb.MiddleBand[i])
                    {
                        result.Add((candles.ElementAt(i), TradingAdviceCode.BUY));
                    }
                    else if (closes[i] < bb.MiddleBand[i] &&                     // Closed above the bollinger band
                             Math.Abs(ao[i]) == 2 &&
                             fastMa[i] < bb.MiddleBand[i] &&
                             fastMa[i - 1] > bb.MiddleBand[i])
                    {
                        result.Add((candles.ElementAt(i), TradingAdviceCode.SELL));
                    }
                    else
                    {
                        result.Add((candles.ElementAt(i), TradingAdviceCode.HOLD));
                    }
                }
            }

            return(result);
        }