public MultyExtremumStrategy(int stopLoss, int pegTopSize, int minExtremumStep) { this.minExtremumStep = minExtremumStep; extremumsFinder = new ExtremumsFinder(pegTopSize); stopLossManager = new StopLossManager(stopLoss, 0.15); }
public static void TestFirstExtremumsOrder(string toolName, int pegTopSize, bool isMinimums) { var repository = new HistoryRepository(toolName, false); var extremumFinder = new ExtremumsFinder(pegTopSize); foreach (var day in repository.Days) { var extremums = extremumFinder.FindFirstExtremums(day.FiveMins, isMinimums); bool bad = false; for (int i = 0; i < extremums.Count; ++i) //TODO Люой экстремум { for (int j = i + 1; j < extremums.Count; ++j) { if (extremums[j].Date >= extremums[i].Date && extremums[j].CheckerIndex < extremums[i].CheckerIndex) { Console.Out.WriteLine(extremums[i] + "\t" + extremums[j]); bad = true; } } } Assert.That(!bad); } }
public static void TestSecondExtremumsAlternation(string toolName, int pegTopSize) { //TODO ошибка в том, что реализм требует сортировки firstExtremums по checkerIndex, а текущий метод поиска secondExtremums - сортировки по Date. В общем случае, обоюдная сортировка невозможна var repository = new HistoryRepository(toolName, false); var extremumFinder = new ExtremumsFinder(pegTopSize); bool bad = false; foreach (var day in repository.Days) { var firstMaximums = extremumFinder.FindFirstExtremums(day.FiveMins, false); var maximums = extremumFinder.FindSecondExtremums(firstMaximums, false); var firstMinimums = extremumFinder.FindFirstExtremums(day.FiveMins, true); var minimums = extremumFinder.FindSecondExtremums(firstMinimums, true); var allExtremums = maximums .Concat(minimums) .OrderBy(ex => ex.CheckerIndex) .ToList(); for (int i = 0; i < allExtremums.Count - 1; ++i) { if (allExtremums[i].Date >= allExtremums[i + 1].Date && allExtremums[i].IsMinimum == allExtremums[i + 1].IsMinimum) { bad = true; Console.Out.WriteLine(allExtremums[i] + "\t" + allExtremums[i + 1]); } } } Assert.That(!bad); }
public static void Run(string toolName, List <Day> days) { var outPath = toolName + @"\"; Directory.CreateDirectory(outPath + candlesPath); Directory.CreateDirectory(outPath + firstMaxPath); Directory.CreateDirectory(outPath + firstMinPath); Directory.CreateDirectory(outPath + secondMaxPath); Directory.CreateDirectory(outPath + secondMinPath); var extremumsFindex = new ExtremumsFinder(pegTopSize); for (int i = 0; i < days.Count; ++i) { var day = days[i]; var candles = day.FiveMins; var firstMaximums = extremumsFindex.FindFirstExtremums(candles, false); var firstMinimums = extremumsFindex.FindFirstExtremums(candles, true); var secondMaximums = extremumsFindex.FindSecondExtremums(firstMaximums, false); var secondMinimums = extremumsFindex.FindSecondExtremums(firstMinimums, true); File.WriteAllLines(outPath + candlesPath + i + ".txt", candles.ConvertAll(c => c.High + "\t" + c.Low + "\t" + c.Close + "\t" + c.Open)); File.WriteAllLines(outPath + firstMaxPath + i + ".txt", firstMaximums.Select(ex => (candles.FindIndex(c => c.Time == ex.Date.TimeOfDay) + 1).ToString())); File.WriteAllLines(outPath + firstMinPath + i + ".txt", firstMinimums.Select(ex => (candles.FindIndex(c => c.Time == ex.Date.TimeOfDay) + 1).ToString())); File.WriteAllLines(outPath + secondMaxPath + i + ".txt", secondMaximums.Select(ex => (candles.FindIndex(c => c.Time == ex.Date.TimeOfDay) + 1).ToString())); File.WriteAllLines(outPath + secondMinPath + i + ".txt", secondMinimums.Select(ex => (candles.FindIndex(c => c.Time == ex.Date.TimeOfDay) + 1).ToString())); } }
public ExtremumStrategy(int baseStopLoss, int pegTopSize, double breakevenPercent, TimeSpan?lastTradeTime = null) { this.baseStopLoss = baseStopLoss; this.breakevenPercent = breakevenPercent; this.lastTradeTime = lastTradeTime ?? new TimeSpan(23, 59, 59); extremumsFinder = new ExtremumsFinder(pegTopSize); }
public MonotoneExtremumsStrategy(int monotoneCount, int baseStopLoss, int invertCount, double breakevenPercent, TimeSpan?lastTradeTime = null, double breakevenInitializerPercent = 1) { this.monotoneCount = monotoneCount; this.invertCount = invertCount; this.lastTradeTime = lastTradeTime ?? new TimeSpan(23, 59, 59); finder = new ExtremumsFinder(0); stopLossManager = new StopLossManager(baseStopLoss, breakevenPercent, breakevenInitializerPercent); }
public static void TestFirstExtremumsSortByChecker(string toolName, int pegTopSize, bool isMinimums) { var repository = new HistoryRepository(toolName, false); var extremumFinder = new ExtremumsFinder(pegTopSize); bool bad = false; foreach (var day in repository.Days) { var extremums = extremumFinder.FindFirstExtremums(day.FiveMins, isMinimums); for (int i = 1; i < extremums.Count; ++i) { if (extremums[i - 1].CheckerIndex > extremums[i].CheckerIndex) { Console.Out.WriteLine(extremums[i - 1] + "\t" + extremums[i]); bad = true; } } Assert.That(!bad); } }
public static void TestSecondExtremumsOrder(string toolName, int pegTopSize) { var repository = new HistoryRepository(toolName, false); var extremumFinder = new ExtremumsFinder(pegTopSize); foreach (var day in repository.Days) { var extremums = extremumFinder.FindAllSecondExtremums(day.FiveMins); bool bad = false; for (int i = 1; i < extremums.Count; ++i) { if (/*extremums[i].IsMinimum == extremums[i-1].IsMinimum && */ extremums[i].Date >= extremums[i - 1].Date && extremums[i].CheckerIndex < extremums[i - 1].CheckerIndex) { Console.Out.WriteLine(extremums[i] + "\t" + extremums[i - 1]); bad = true; } } Assert.That(!bad); } }
public CorrectedExtremumStrategy(int baseStopLoss, int pegTopSize, double breakevenPercent, int trailingStopSize, int maxDistFromOpen = int.MaxValue) { extremumsFinder = new ExtremumsFinder(pegTopSize); stopLossManager = new StopLossManager(baseStopLoss, trailingStopSize, breakevenPercent); this.maxDistFromOpen = maxDistFromOpen; }