public void Process(int newValue)
    {
        switch (CurrentEngineStatus)
        {
        case EngineStatus.NoProfitPeriod:
        {
            if (CurrentPeriod.Process(newValue) == PeriodStatus.Closed)
            {
                //Refine further - Compare Before Override
                //PreviousPeriod = CurrentPeriod;
                historicalPeriods.Add(CurrentPeriod);
                CurrentEngineStatus = EngineStatus.OneProfitPeriod;
                PreviousBestPeriod  = new ProfitPeriod()
                {
                    PeriodLow = CurrentPeriod.PeriodLow, PeriodHigh = CurrentPeriod.PeriodHigh
                };
                CurrentPeriod = new ProfitPeriod();
                CurrentPeriod.Process(newValue);
            }
            ;

            break;
        }

        case EngineStatus.OneProfitPeriod:
        {
            if (CurrentPeriod.Process(newValue) == PeriodStatus.Closed)
            {
                //Refine further - Compare Before Override
                if (PreviousBestPeriod.Gain < CurrentPeriod.Gain)
                {
                    //replace previous best period
                    PreviousBestPeriod = new ProfitPeriod()
                    {
                        PeriodLow = CurrentPeriod.PeriodLow, PeriodHigh = CurrentPeriod.PeriodHigh
                    };
                }
                ;
                historicalPeriods.Add(CurrentPeriod);
                CurrentEngineStatus = EngineStatus.MoreThanOnePeriod;
                CurrentPeriod       = new ProfitPeriod();
                CurrentPeriod.Process(newValue);
            }
            ;
            break;
        }

        case EngineStatus.MoreThanOnePeriod:
        {
            if (CurrentPeriod.Process(newValue) == PeriodStatus.Closed)
            {
                //Compare Before Override
                //potentially keep a SecondBestPeriod
                if (PreviousBestPeriod.Gain < CurrentPeriod.Gain)
                {
                    //replace previous best period
                    PreviousBestPeriod = new ProfitPeriod()
                    {
                        PeriodLow = CurrentPeriod.PeriodLow, PeriodHigh = CurrentPeriod.PeriodHigh
                    };
                }
                ;
                historicalPeriods.Add(CurrentPeriod);
                CurrentPeriod = new ProfitPeriod();
                CurrentPeriod.Process(newValue);
            }
            ;
            break;
        }
        }
    }
 public StockBuySellEngine()
 {
     CurrentEngineStatus = EngineStatus.NoProfitPeriod;
     PreviousBestPeriod  = null;
     CurrentPeriod       = new ProfitPeriod();
 }