private Deal GetDaysDeal(List <Candle> daysCandles)
        {
            var longExtremums  = finder.FindFirstExtremums(daysCandles, true);
            var shortExtremums = finder.FindFirstExtremums(daysCandles, false);

            var allExtremums = finder.MergeExtremums(longExtremums, shortExtremums);

            foreach (var extremum in allExtremums)
            {
                if (extremum.Date.TimeOfDay > lastTradeTime)
                {
                    break;
                }

                var startIndex = extremum.CheckerIndex;
                if (startIndex == daysCandles.Count - 1)
                {
                    break;
                }

                var currentLong  = longExtremums.TakeWhile(ex => ex.Date <= extremum.Date).ToList();
                var currentShort = shortExtremums.TakeWhile(ex => ex.Date <= extremum.Date).ToList();

                int trendDirection = GetTrendDirection(currentLong, currentShort, extremum);
                if (trendDirection == 0)
                {
                    continue;
                }

                bool isTrendLong = trendDirection == 1;

                var startPrice = daysCandles[startIndex + 1].Open;
                var stopResult = stopLossManager.GetBreakevenStopResult(daysCandles.Skip(startIndex + 1), isTrendLong);

                var endPrice = stopResult != -1 ? stopResult : daysCandles[daysCandles.Count - 1].Close;

                return(new Deal(startPrice, endPrice, isTrendLong));
            }
            return(null);
        }
Exemplo n.º 2
0
        private List <Deal> GetDaysDeal(List <Candle> daysCandles)
        {
            var  allExtremums = extremumsFinder.FindAllSecondExtremums(daysCandles);
            bool inDeal       = false;
            bool isTrendLong  = false;
            int  startIndex   = 0;

            var      deals         = new List <Deal>();
            Extremum startExtremum = null;

            foreach (var extremum in allExtremums)
            {
                if (inDeal)
                {
                    if (extremum.IsMinimum == isTrendLong)
                    {
                        continue;
                    }

                    if (isTrendLong && (extremum.Value - startExtremum.Value) < minExtremumStep ||
                        !isTrendLong && (startExtremum.Value - extremum.Value) < minExtremumStep)
                    {
                        continue;
                    }

                    var startPrice  = daysCandles[startIndex + 1].Open;
                    var dealCandles = daysCandles.Skip(startIndex + 1).Take(extremum.CheckerIndex - startIndex).ToList();

                    var stopResult = stopLossManager.GetBreakevenStopResult(dealCandles, isTrendLong);
                    var endPrice   = stopResult != -1 ? stopResult : daysCandles[extremum.CheckerIndex].Close;
                    deals.Add(new Deal(startPrice, endPrice, isTrendLong, daysCandles[startIndex + 1].DateTime, startIndex + 1));

                    inDeal = false;
                    if (stopResult != -1)
                    {
                        break;
                    }
                }

                startExtremum = extremum;
                startIndex    = extremum.CheckerIndex;
                if (startIndex == daysCandles.Count - 1)
                {
                    break;
                }

                isTrendLong = extremum.IsMinimum;
                inDeal      = true;
            }

            if (inDeal)
            {
                var startPrice = daysCandles[startIndex + 1].Open;

                var dealCandles = daysCandles.Skip(startIndex + 1).ToList();
                var stopResult  = stopLossManager.GetBreakevenStopResult(dealCandles, isTrendLong);
                var endPrice    = stopResult != -1 ? stopResult : daysCandles[dealCandles.Count - 1].Close;
                deals.Add(new Deal(startPrice, endPrice, isTrendLong, daysCandles[startIndex + 1].DateTime, startIndex + 1));
            }
            return(deals);
        }