public async Task DownloadOptionChains()
        {
            Thread.Sleep(1000);

            DateTime monday = DateTime.Now.GetPreviousDayOfWeekOccurrence(DayOfWeek.Monday);
            DateTime friday = DateTime.Now.GetPreviousDayOfWeekOccurrence(DayOfWeek.Friday);

            Query query = new Query();

            query.SortPropertyName = Security.PropertyNames.Symbol;
            query.QuerySingleFilters.Add(new QuerySingleFilter()
            {
                PropertyName  = Security.PropertyNames.PairEligible,
                Parameter     = "true",
                QueryOperator = QueryOperators.Equals
            });

            List <Security> securities = SecurityService.GetCollection(query);

            securities.RemoveAll(x => (x.NextEarningsDate.HasValue && x.NextEarningsDate >= monday && x.NextEarningsDate <= friday));
            securities.RemoveAll(x => (x.ExDividendDate.HasValue && x.ExDividendDate >= monday && x.ExDividendDate <= friday));

            for (int i = 0; i < securities.Count; i++)
            {
                Security security = securities[i];

                OnProgressMessageRaised(new HtmlTag("li").Class("list-group-item").Class("active")
                                        .Append(HtmlTags.Span.Append("Processing security:&nbsp;"))
                                        .Append(HtmlTags.B.Append(security.Symbol)).ToHtml().ToString(), this.JobId);

                if (SecurityService.GetCurrentPrice(security))
                {
                    SecurityService.Save(security);

                    OnProgressMessageRaised(new HtmlTag("li").Class("list-group-item")
                                            .Append(HtmlTags.B.Append(security.Symbol))
                                            .Append(HtmlTags.Span.Append($"&nbsp;current price: {security.CurrentPrice:C}"))
                                            .ToHtml().ToString(), this.JobId);

                    OptionChain optionChain = OptionChainService.GetOpcOptionChain(security);
                    if (optionChain != null)
                    {
                        OnProgressMessageRaised(new HtmlTag("li").Class("list-group-item")
                                                .Append(HtmlTags.B.Append(security.Symbol))
                                                .Append(HtmlTags.Span.Append("&nbsp;option chain retrieved"))
                                                .ToHtml().ToString(), this.JobId);

                        optionChain.SecurityIdentifier = security.Identifier;

                        OptionChainService.Save(optionChain);
                    }
                }
            }
        }
        public void Purge()
        {
            Thread.Sleep(1500);

            SendPurgeMessage("WeeklyIncomeComboCount");
            foreach (WeeklyIncomeComboCount x in WeeklyIncomeComboCountService.GetCollection())
            {
                WeeklyIncomeComboCountService.Delete(x);
            }

            SendPurgeMessage("OptionStrike");
            foreach (OptionStrike x in OptionStrikeService.GetCollection())
            {
                OptionStrikeService.Delete(x);
            }

            SendPurgeMessage("OptionDate");
            foreach (OptionDate x in OptionDateService.GetCollection())
            {
                OptionDateService.Delete(x);
            }

            SendPurgeMessage("OptionChain");
            foreach (OptionChain x in OptionChainService.GetCollection())
            {
                OptionChainService.Delete(x);
            }

            SendPurgeMessage("BullPutSpread");
            foreach (BullPutSpread x in BullPutSpreadService.GetCollection())
            {
                BullPutSpreadService.Delete(x);
            }

            SendPurgeMessage("BearCallSpread");
            foreach (BearCallSpread x in BearCallSpreadService.GetCollection())
            {
                BearCallSpreadService.Delete(x);
            }

            SendPurgeMessage("PairCondor");
            foreach (PairCondor x in PairCondorService.GetCollection())
            {
                PairCondorService.Delete(x);
            }

            SendPurgeMessage("WeeklyIncomeActionPlan");
            foreach (WeeklyIncomeActionPlan x in WeeklyIncomeActionPlanService.GetCollection())
            {
                WeeklyIncomeActionPlanService.Delete(x);
            }

            SendPurgeMessage("Call");
            foreach (Call x in CallService.GetCollection())
            {
                CallService.Delete(x);
            }

            SendPurgeMessage("Put");
            foreach (Put x in PutService.GetCollection())
            {
                PutService.Delete(x);
            }

            SendPurgeMessage("WeeklyIncomePlaySheet");
            foreach (WeeklyIncomePlaySheet x in WeeklyIncomePlaySheetService.GetCollection())
            {
                WeeklyIncomePlaySheetService.Delete(x);
            }

            OnRedirectRaised("WeeklyIncome", "Index", 0, this.JobId);
        }