public static int GetStockBuyStateValue(this StockBuyState state) { switch (state) { case StockBuyState.Buy: return(0); case StockBuyState.FirstAdd: return(1); case StockBuyState.SecondAdd: return(2); case StockBuyState.ThirdAdd: return(3); case StockBuyState.FourthAdd: return(4); case StockBuyState.Sold: return(99); } return(999); }
public AddOnBuyEmailTemplate(string receipentEmail, string stockID, string stockName, decimal newStopPrice, StockBuyState newState) { ReceipentEmail = receipentEmail; _stockID = stockID; _stockName = stockName; _newStopPrice = newStopPrice; _newState = newState; }
public MemberBuyStock(string memberEmail, CountryKind country, string stockID, decimal buyPrice, decimal N, decimal stopPrice, StockBuyState state, BuySellStrategyType strategy, DateTime buyDate) { MemberEmail = memberEmail; Country = country; StockId = stockID; BuyPrice = buyPrice; StopPrice = stopPrice; State = state; BuyDate = buyDate; NValue = N; Strategy = strategy; }
public IEmailTemplate GetAddOnBuyEmailTemplate(string receipent, string stockId, string stockName, decimal newStopPrice, StockBuyState newState) { return(new AddOnBuyEmailTemplate(receipent, stockId, stockName, newStopPrice, newState)); }
private string ComposeKey(string memberEmail, string stockFullID, DateTime date, StockNotificationType type, BuySellStrategyType strategy, StockBuyState targetState) { return($"{strategy.GetString()}.{memberEmail}.{stockFullID}.{date.ToString(_dateFormat)}.{type.ToString()}.{targetState.GetStockBuyStateValue()}"); }
public void InsertRecord(string memberEmail, string stockFullID, StockNotificationType type, DateTime date, BuySellStrategyType strategy, StockBuyState targetState) { _checkers.Add(ComposeKey(memberEmail, stockFullID, date, type, strategy, targetState)); }
public bool CanNotify(string memberEmail, string stockFullID, StockNotificationType type, DateTime today, BuySellStrategyType strategy, StockBuyState targetState) { return(!_checkers.Contains(ComposeKey(memberEmail, stockFullID, today, type, strategy, targetState))); }
public Task SetMemberBuyStockBuyStateAsync(string memberEmail, CountryKind country, string stockID, StockBuyState buyState) { IMemberBuyStock stock = MemberBuyStockTable.FirstOrDefault(a => string.Equals(a.MemberEmail, memberEmail, StringComparison.OrdinalIgnoreCase) && a.Country == country && string.Equals(a.StockId, stockID, StringComparison.OrdinalIgnoreCase)); if (!(stock is MemberBuyStock target)) { return(Task.CompletedTask); } target.State = buyState; return(Task.CompletedTask); }
public Task <IReadOnlyList <IMemberBuyStock> > GetMemberBuyStocksAsync(CountryKind country, StockBuyState state) { return(Task.FromResult <IReadOnlyList <IMemberBuyStock> >(MemberBuyStockTable.Where(a => a.Country == country && a.State == state).ToList())); }
public Task UpdateMemberBuyStockAsync(string memberEmail, CountryKind country, string stockId, decimal stopPrice, StockBuyState newState) { IMemberBuyStock memberStock = MemberBuyStockTable.Find(a => string.Equals(a.MemberEmail, memberEmail, StringComparison.OrdinalIgnoreCase) && a.Country == country); if (memberStock != null && memberStock is MemberBuyStock mStock) { mStock.StopPrice = stopPrice; mStock.State = newState; } return(Task.CompletedTask); }
public IEmailTemplate GetAddOnBuyEmailTemplate(string receipent, string stockId, string stockName, decimal newStopPrice, StockBuyState newState) { return(new BackTestNotificationContent(stockId, "Buy", "AddOn", newStopPrice, _currentDate, $"NewStopPrice={newStopPrice} and New StockBuyState={newState}")); }
private async Task AddBuyAsync(CancellationToken token) { // get MemberBuyStock from database IMemberBuyStock memberBuyStock = (await DatabaseOperations.GetMemberBuyStocksAsync(_memberStock.MemberEmail).ConfigureAwait(false))? .FirstOrDefault(a => (a.State != StockBuyState.Sold || a.State != StockBuyState.Unknown) && string.Equals(a.MemberEmail, _memberStock.MemberEmail, StringComparison.OrdinalIgnoreCase) && a.Country == _memberStock.Country && string.Equals(a.StockId, _memberStock.StockId, StringComparison.OrdinalIgnoreCase)); if (memberBuyStock == null) { return; } string stockFullId = $"{memberBuyStock.Country.GetShortName()}.{memberBuyStock.StockId}"; decimal buyPrice = memberBuyStock.BuyPrice; decimal nValue = memberBuyStock.NValue; decimal firstAddPrice = buyPrice + nValue; decimal secondAddPrice = firstAddPrice + nValue; decimal thirdAddPrie = secondAddPrice + nValue; decimal fourthAddPrice = thirdAddPrie + nValue; if (!BaseData.CurrentPriceStorage.TryGetItem(memberBuyStock.Country, memberBuyStock.StockId, out ICurrentPrice target) || target == null || !BaseData.CurrentTime.IsSameDay(target.LastTradeTime)) { return; } decimal currentPrice = target.CurrentPrice; IEmailTemplate emailTemplate = null; StockBuyState newBuyState = StockBuyState.Unknown; string stockName = await GetStockNameAsync(stockFullId).ConfigureAwait(false); if (token.IsCancellationRequested) { return; } // TODO : refactor if (firstAddPrice <= currentPrice && currentPrice < secondAddPrice && memberBuyStock.State == StockBuyState.Buy) { newBuyState = StockBuyState.FirstAdd; decimal newStopPrice = firstAddPrice - (nValue * 2); await DatabaseOperations.UpdateMemberBuyStockAsync(memberBuyStock.MemberEmail, memberBuyStock.Country, memberBuyStock.StockId, newStopPrice, newBuyState).ConfigureAwait(false); emailTemplate = EmailTemplateProvider.GetAddOnBuyEmailTemplate(memberBuyStock.MemberEmail, memberBuyStock.StockId, stockName, newStopPrice, newBuyState); } else if (secondAddPrice <= currentPrice && currentPrice < thirdAddPrie && memberBuyStock.State.GetStockBuyStateValue() <= 1) { newBuyState = StockBuyState.SecondAdd; decimal newStopPrice = secondAddPrice - (nValue * 2); await DatabaseOperations.UpdateMemberBuyStockAsync(memberBuyStock.MemberEmail, memberBuyStock.Country, memberBuyStock.StockId, newStopPrice, newBuyState).ConfigureAwait(false); emailTemplate = EmailTemplateProvider.GetAddOnBuyEmailTemplate(memberBuyStock.MemberEmail, memberBuyStock.StockId, stockName, newStopPrice, newBuyState); } else if (thirdAddPrie <= currentPrice && currentPrice < fourthAddPrice && memberBuyStock.State.GetStockBuyStateValue() <= 2) { newBuyState = StockBuyState.ThirdAdd; decimal newStopPrice = thirdAddPrie - (nValue * 2); await DatabaseOperations.UpdateMemberBuyStockAsync(memberBuyStock.MemberEmail, memberBuyStock.Country, memberBuyStock.StockId, newStopPrice, newBuyState).ConfigureAwait(false); emailTemplate = EmailTemplateProvider.GetAddOnBuyEmailTemplate(memberBuyStock.MemberEmail, memberBuyStock.StockId, stockName, newStopPrice, newBuyState); } else if (fourthAddPrice <= currentPrice && memberBuyStock.State.GetStockBuyStateValue() <= 3) { newBuyState = StockBuyState.FourthAdd; decimal newStopPrice = fourthAddPrice - (nValue * 2); await DatabaseOperations.UpdateMemberBuyStockAsync(memberBuyStock.MemberEmail, memberBuyStock.Country, memberBuyStock.StockId, newStopPrice, newBuyState).ConfigureAwait(false); emailTemplate = EmailTemplateProvider.GetAddOnBuyEmailTemplate(memberBuyStock.MemberEmail, memberBuyStock.StockId, stockName, newStopPrice, newBuyState); } if (emailTemplate != null && PriceNotificationChecker.CanNotify(memberBuyStock.MemberEmail, stockFullId, StockNotificationType.Buy, BaseData.CurrentTime, memberBuyStock.Strategy, newBuyState)) { if (_testStatus) { await EmailService.SendEmailAsync(BaseData.Country, BaseData.CurrentTime, emailTemplate).ConfigureAwait(false); } else { await EmailService.SendEmailAsync(BaseData.Country, BaseData.CurrentTime, emailTemplate).ConfigureAwait(false); } PriceNotificationChecker.InsertRecord(memberBuyStock.MemberEmail, stockFullId, StockNotificationType.Buy, BaseData.CurrentTime, memberBuyStock.Strategy, newBuyState); if (!_testStatus) { Task t = BaseData.GetLogger().WriteToWorkerLogAsync(BaseData.Country, BaseData.CurrentTime, "TurtleBuyStrategy", $"{memberBuyStock.Strategy}, add buy ({stockFullId}) email is sent to {emailTemplate.ReceipentEmail} and new state is {newBuyState}"); } } }