/// <summary> /// check how oftne we have to send the notification throuight the caller ( investor), e.g: once, unlimited, /// we can improve this by adding some more meta data in the notification interface like data, time, week,... /// then we could manage all diffrent senarioes like once per day m once per week , or all other combination that investor will inject by the time that /// set the investor in the stocket object or later attch new one... /// </summary> /// <param name="investor"></param> /// <param name="tradeTrigger"></param> /// <returns></returns> private bool hasPermissionToSendNotification(IInvestor investor, ITradeTrigger tradeTrigger) { if (tradeTrigger.NotificationType == ReceiveNotificationType.Unlimited) { return(true); } else if (tradeTrigger.NotificationType == ReceiveNotificationType.Once) { if (NotificationHistory.Where(h => h.Investor == investor.InvestorName && h.TradeTriggerType == tradeTrigger.TradeTriggerType && h.TriggerName == tradeTrigger.TriggerName).FirstOrDefault() == null) { return(true); } } return(false); }
/// <summary> /// /// </summary> /// <param name="tradeTrigger"></param> /// <returns></returns> TradeTriggerType getTriggerAction(ITradeTrigger tradeTrigger) { double priceMin = tradeTrigger.TargetPrice - tradeTrigger.FluctuationsRate; double priceMax = tradeTrigger.TargetPrice + +tradeTrigger.FluctuationsRate; TradeTriggerType tradeTriggerAction = TradeTriggerType.None; if (tradeTrigger.Sensitivity == StockSensitivityType.MeetExactTargetPrice && tradeTrigger.TargetPrice == _price) { tradeTriggerAction = getTradeTriggerActionByPriceDirection(tradeTrigger); } else if (tradeTrigger.Sensitivity == StockSensitivityType.MeetAroundTargetPrice && (priceMin <= _price && _price <= priceMax)) { tradeTriggerAction = getTradeTriggerActionByPriceDirection(tradeTrigger); } return(tradeTriggerAction); }
/// <summary> /// update the history of hit through the caller ( investors) /// </summary> /// <param name="investor"></param> /// <param name="sellingStock"></param> /// <param name="tradeTrigger"></param> private void updateNotificationHistory(IInvestor investor, TradeTriggerType tradeTriggerType, ITradeTrigger tradeTrigger) { var histoiry = NotificationHistory.Where(h => h.Investor == investor.InvestorName && h.TradeTriggerType == tradeTriggerType && h.TriggerName == tradeTrigger.TriggerName).FirstOrDefault(); if (histoiry == null) { NotificationHistory.Add(new Notification() { Investor = investor.InvestorName, TradeTriggerType = tradeTriggerType, TriggerName = tradeTrigger.TriggerName, Counter = 1 }); } else { histoiry.Counter = histoiry.Counter + 1; } }
public bool RemoveTrigger(ITradeTrigger tradeTrigger) { _tradTriggers.Remove(tradeTrigger); return(true); }
// public bool AddTrigger(ITradeTrigger tradeTrigger) { _tradTriggers.Add(tradeTrigger); return(true); }
private void printMessage(IStock stock, ITradeTrigger tradeTrigger) { Console.WriteLine("Notified ({0}) {1} - {2} of {3}'s change to {4:C} ==>{5}", tradeTrigger.TradeTriggerType, _name, tradeTrigger.TriggerName, stock.Symbol, stock.Price, DateTime.Now.ToLocalTime()); }
/// <summary> /// only notify by Stock once the buying action meet /// </summary> /// <param name="stock"></param> /// <param name="tradeTrigger"></param> public void Buy(IStock stock, ITradeTrigger tradeTrigger) { printMessage(stock, tradeTrigger); }
/// <summary> /// Constructor to add only one trigger /// </summary> /// <param name="name">investor name</param> /// <param name="tradeTrigger">how to get notification(rule)</param> public Investor(string name, ITradeTrigger tradeTrigger) { this._name = name; this._tradTriggers.Add(tradeTrigger); }