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); }
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); }