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; public class EmaTrendStrategy : EmaBaseStrategy { public List Signals { get; set; } public EmaTrendStrategy(string name, Timeframe timeframe, int period) : base(name, timeframe, StrategyType.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, Timeframe, TradeDirection.Long, Confidence.None); } else { AddSignal(currentCandle, Timeframe, TradeDirection.Short, Confidence.None); } previousCandle = currentCandle; } return Signals.OrderBy(s => s.Date).ToList(); } catch (RuleException) { return null; } } public void AddSignal(CandleEma candleSignal, Timeframe timeframe, TradeDirection direction, Confidence confidence) { var signal = new Signal(MiscExtensions.ParseEnum(candleSignal.Ticker), direction, confidence, candleSignal, candleSignal.Date, candleSignal.Exchange, timeframe, Type, SignalType); if (!Signals.Any(s => s.Identifier == signal.Identifier)) { Signals.AddItem(signal); } } }