public void TestStrategy(string dataFilePath, int RSIMin, int RSIMax, int RSIWindow, int BBWindow, int delay, bool showMessages) { var data = File.ReadLines(dataFilePath).Where(a => !string.IsNullOrWhiteSpace(a)).Select(a => TickerData.FromString(a)).ToList(); var analyzer = new StrategyAnalyzer(); var result = analyzer.CheckRSIBollingerLongStrategy(data, RSIMin, RSIMax, RSIWindow, BBWindow, closeOnStop: false); var log = result.ActionLog; var actionsDict = log.ToDictionary(l => l.DateTime); var balance = 0m; Console.WriteLine("Начинаю симуляцию стратегии"); foreach (var p in data) { var dt = p.DateTime; var action = actionsDict.ContainsKey(dt) ? actionsDict[dt] : null; if (action != null) { balance = action.BalanceAfter; } Console.WriteLine($"[{dt.ToShortDateString()} {dt.ToShortTimeString()}] Цена: {p.Close} "); if (showMessages) { Console.WriteLine(action.Message); } Console.WriteLine($"[БОТ] {(action!=null?(action.IsOpen?"Покупай! ":"Продавай! "):"")}Баланс: {balance}"); Thread.Sleep(delay); } Console.WriteLine($"Симуляция завершена."); }
private void _testStrategyAndSaveToFile(IList <IList <TickerData> > samples, int RSIMin, int RSIMax, int RSIWindow, int BBWindow, StrategyAnalyzer analyzer, Timeframe frame) { var results = new HashSet <StrategyResult>(); foreach (var s in samples) { var r = analyzer.CheckRSIBollingerLongStrategy(s, RSIMin, RSIMax, RSIWindow, BBWindow); if (!r.IsSuccess) { if (!Fails.ContainsKey(r.TickerName)) { Fails[r.TickerName] = 0; } Fails[r.TickerName]++; } results.Add(r); } var winRate = (double)results.Count(r => r.IsSuccess) / results.Count() * 100; var averageProfit = results.Average(r => r.Result); var maxProfit = results.Max(r => r.Result); var minProfit = results.Min(r => r.Result); var fileName = $"./teach{frame}/{winRate:f2}_{DateTime.Now.ToShortDateString().Replace('.', '_')}_{DateTime.Now.ToShortTimeString().Replace(":", "")}_{frame}_RSI[{RSIWindow} {RSIMin} {RSIMax}]_BB[{BBWindow}].log"; var log = new List <string>(); log.Add("Лог проверки стратегии BB RSI"); log.Add("Данные стратегии"); log.Add($"RSI Window: {RSIWindow}; Min: {RSIMin}; Max: {RSIMax};"); log.Add($"BB Window: {BBWindow}"); log.Add($"Success rate: {winRate:f2}"); log.Add($"Results. Average: {averageProfit:f2}; Min: {minProfit:f2}; Max: {maxProfit:f2};"); log.Add($""); log.Add($""); foreach (var r in results) { log.Add($"Результаты обработки тикера {r.TickerName}"); log.Add($"Успех: {r.IsSuccess}"); log.Add($"Финансовый результат: {r.Result} руб. на акцию."); log.Add($"Баланс. Максимальный подъем: {r.Max}. Максимальная просадка {r.Min}"); log.Add($"Требуемые вложения на счет {r.MaxSpent} руб. на акцию"); log.Add($"Количество операций: {r.OperationsCount}"); log.Add($""); log.Add($"Подробный лог операций:"); if (r.ActionLog.Count > 0) { foreach (var a in r.ActionLog) { log.Add($"[{a.DateTime.ToShortDateString()} {a.DateTime.ToShortTimeString()}] {a.Message}"); log.Add($"[{a.DateTime.ToShortDateString()} {a.DateTime.ToShortTimeString()}] {(a.IsOpen ? "Открываю" : "Закрываю")} {(a.IsLong ? "длинную" : "короткую")} позицию по цене {a.Price}. Баланс: {a.BalanceAfter}"); } } else { log.Add("Операций не было"); } log.Add($""); log.Add($""); } File.AppendAllLines(fileName, log); }