using Managing.Core; using Managing.Domain.Shared.Rules; using Managing.Domain.Strategies.Base; using Skender.Stock.Indicators; using static Managing.Common.Enums; namespace Managing.Domain.Strategies.Trends; public class EmaTrendIndicator : EmaBaseIndicator { public List Signals { get; set; } public EmaTrendIndicator(string name, int period) : base(name, IndicatorType.EmaTrend) { Signals = new List(); Period = period; } public override List Run() { if (Candles.Count <= 2 * Period) { return null; } try { var ema = Candles.GetEma(Period.Value).ToList(); var emaCandles = MapEmaToCandle(ema, Candles.TakeLast(Period.Value)); if (ema.Count == 0) return null; var previousCandle = emaCandles[0]; foreach (var currentCandle in emaCandles.Skip(1)) { if (currentCandle.Close > (decimal)currentCandle.Ema) { AddSignal(currentCandle, TradeDirection.Long, Confidence.None); } else { AddSignal(currentCandle, TradeDirection.Short, Confidence.None); } previousCandle = currentCandle; } return Signals.OrderBy(s => s.Date).ToList(); } catch (RuleException) { return null; } } public override IndicatorsResultBase GetIndicatorValues() { return new IndicatorsResultBase() { Ema = Candles.GetEma(Period.Value).ToList() }; } public void AddSignal(CandleEma candleSignal, TradeDirection direction, Confidence confidence) { var signal = new LightSignal(MiscExtensions.ParseEnum(candleSignal.Ticker), direction, confidence, candleSignal, candleSignal.Date, candleSignal.Exchange, Type, SignalType, Name); if (!Signals.Any(s => s.Identifier == signal.Identifier)) { Signals.AddItem(signal); } } }