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