예제 #1
0
        public async Task <BackTestResult> TrySettings(string market, List <Candle> candlesContent, TraderSettings settings)
        {
            _market = market;
            if (candlesContent == null)
            {
                _candles = (await _fakeBittrexApi.GetCandlesAsync((_market), TickInterval.OneMinute)).Content;
            }
            else
            {
                _candles = candlesContent;
            }
            var strategy = new HoldUntilPriceDropsStrategy {
                Settings = settings
            };
            var coinTrader = await RunHistoryData(strategy);

            var budget = await coinTrader.FinishTest();

            var backTestResult = new BackTestResult
            {
                Budget   = budget,
                Settings = strategy.Settings
            };

            return(backTestResult);
        }
예제 #2
0
        public async Task <List <BackTestResult> > FindBestSettings(string market, List <Candle> candlesContent = null)
        {
            _market = market;
            var candlesResponse = await _fakeBittrexApi.GetCandlesAsync(_market, TickInterval.OneHour);

            _hourlyCandles = candlesResponse.Content;
            if (candlesContent == null)
            {
                _candles = (await _fakeBittrexApi.GetCandlesAsync((_market), TickInterval.OneMinute)).Content;
            }
            else
            {
                _candles = candlesContent;
            }

            var firstOrderBuyLowerRange = new List <decimal> {
                -1, 0
            };
            var buyLowerRange = new List <decimal> {
                -3, -2, -1, -0.5M
            };
            var minimumTakeProfitRange = new List <decimal> {
                0, 0.5M, 1
            };
            var highStopLossRange = new List <decimal> {
                -10, -5, -1
            };
            var stopLossRange = new List <decimal> {
                -25, -6, -4, -2
            };
            var buyTriggerRange = new List <decimal> {
                -4, -2, -1
            };
            var expirationRange = new List <TimeSpan>
            {
                TimeSpan.FromHours(1),
                TimeSpan.FromHours(24)
            };
            var it         = 0;
            var total      = 0;
            var bestProfit = -1000M;
            var strategies = new List <HoldUntilPriceDropsStrategy>();

            foreach (var firstBuy in firstOrderBuyLowerRange)
            {
                foreach (var buy in buyLowerRange)
                {
                    foreach (var highStopLoss in highStopLossRange)
                    {
                        foreach (var stopLoss in stopLossRange)
                        {
                            foreach (var trigger in buyTriggerRange)
                            {
                                foreach (var expiration in expirationRange)
                                {
                                    foreach (var minProfit in minimumTakeProfitRange)
                                    {
                                        if (stopLoss <= trigger)
                                        {
                                            continue;
                                        }
                                        total++;
                                        var strategy = new HoldUntilPriceDropsStrategy();
                                        strategy.Settings = new TraderSettings
                                        {
                                            FirstBuyLowerPercentage = firstBuy,
                                            BuyLowerPercentage      = buy,
                                            HighStopLossPercentage  = highStopLoss,
                                            StopLoss          = stopLoss,
                                            BuyTrigger        = trigger,
                                            MinimumTakeProfit = minProfit,
                                            TradingBudget     = TraderSettings.Default.TradingBudget,
                                            ExpirationTime    = expiration
                                        };
                                        strategies.Add(strategy);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            int oldPercentage = -1;
            var results       = new List <BackTestResult>();

            Parallel.ForEach(strategies.Take(1), (strategy) =>
            {
                try
                {
                    it++;
                    strategy.Settings  = TraderSettings.Default;
                    var coinTrader     = RunHistoryData(strategy).Result;
                    var budget         = coinTrader.FinishTest().Result;
                    var backTestResult = new BackTestResult
                    {
                        Budget   = budget,
                        Settings = strategy.Settings
                    };
                    results.Add(backTestResult);
                    var percentage = (it * 100) / total;
                    if (percentage != oldPercentage)
                    {
                        oldPercentage = percentage;
                        if (bestProfit < budget.Profit)
                        {
                            bestProfit = budget.Profit;
                        }
                        Console.WriteLine($"Current iteration: {it}/{total}\t{percentage}%\t\t{bestProfit}%");
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            });
            results = results.OrderByDescending(r => r.Budget.Profit).ToList();
            var uniqueProfits = results.GroupBy(r => r.Budget.Profit).OrderByDescending(r => r.Key).Select(s => s.FirstOrDefault()).ToList();

            Console.WriteLine($"{uniqueProfits.Count}/{results.Count}");
            foreach (var result in uniqueProfits.Take(50))
            {
                Console.WriteLine($"{result.Budget.Profit}% - {result.Settings}\t{result.Budget.Invested}\t{result.Budget.Earned}");
            }
            return(uniqueProfits);
        }