Example #1
0
        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;
 }
Example #3
0
 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;
 }
Example #4
0
 public IEmailTemplate GetAddOnBuyEmailTemplate(string receipent, string stockId, string stockName, decimal newStopPrice, StockBuyState newState)
 {
     return(new AddOnBuyEmailTemplate(receipent, stockId, stockName, newStopPrice, newState));
 }
Example #5
0
 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()}");
 }
Example #6
0
 public void InsertRecord(string memberEmail, string stockFullID, StockNotificationType type, DateTime date, BuySellStrategyType strategy, StockBuyState targetState)
 {
     _checkers.Add(ComposeKey(memberEmail, stockFullID, date, type, strategy, targetState));
 }
Example #7
0
 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);
        }
Example #11
0
 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}"));
 }
Example #12
0
        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}");
                }
            }
        }