示例#1
0
        public async Task StartAsync()
        {
            Console.WriteLine($"Starting {Market}");
            Strategy     = new HoldUntilPriceDropsStrategy();
            _traderGrain = _orleansClient.GetGrain <ITraderGrain>(Market);
            await _traderGrain.SetMarketAsync(Market);

            TraderState = await _traderGrain.GetTraderData();

            TraderState.Trades = TraderState.Trades ?? new List <Trade>();

            Strategy.Settings     = TraderSettings.Default;
            _lastCandleUpdateTime = DateTime.UtcNow;
            var candlesResponse = await _cryptoApi.GetCandlesAsync(Market, TickInterval.OneHour);

            _coinTrader.Candles = candlesResponse.Content;
            Console.WriteLine($"Downloaded {candlesResponse.Content.Count} candles for {Market}");
            if (TraderState.Trades.Count == 0)
            {
                TraderState.Trades.Add(new Trade {
                    Status = TradeStatus.Empty
                });
            }

            _coinTrader.IsInTestMode = IsInTestMode;
            _coinTrader.Initialize(TraderState);
            CanUpdate = true;
            if (!IsInTestMode)
            {
                await UpdateOrders();
            }
        }
示例#2
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);
        }
示例#3
0
        public void Initialize(TraderState traderState)
        {
            Market   = traderState.Market;
            Strategy = new HoldUntilPriceDropsStrategy();

            _cryptoApi.TickerUpdated
            .Where(t => t.Market == traderState.Market)
            .Select(ticker => Observable.FromAsync(token => UpdatePrice(ticker)))
            .Concat()
            .Subscribe(unit => { }, OnCompleted);

            _cryptoApi.OrderUpdated
            .Where(o => o.Market == traderState.Market)
            .Select(order => Observable.FromAsync(token => UpdateOrder(order)))
            .Concat()
            .Subscribe();

            TraderState = traderState;

            Strategy.Settings = traderState.Settings ?? TraderSettings.Default;
            if (TraderState.Trades.Count == 0)
            {
                TraderState.Trades.Add(new Trade {
                    Status = TradeStatus.Empty
                });
            }
        }
 public HoldUntilPriceDropsStrategyTests()
 {
     _strategy = new HoldUntilPriceDropsStrategy {
         Settings = TraderSettings.Default
     };
     _strategy.Settings.HighStopLossPercentage = -5;
     _strategy.Settings.StopLoss   = -2;
     _strategy.Settings.BuyTrigger = -1;
     _currentTrade = new Trade
     {
         BuyOrder = new CryptoOrder
         {
             PricePerUnit = 100,
             Uuid         = "abc"
         }
     };
 }
示例#5
0
        public void Initialize(string market)
        {
            _tickerIndex = 0;
            Market       = market;
            Strategy     = new HoldUntilPriceDropsStrategy();

            _cryptoApi.TickerUpdated
            .Where(t => t.Market == market)
            .Select(ticker => Observable.FromAsync(token => UpdatePrice(ticker)))
            .Concat()
            .Subscribe(unit => { }, OnCompleted);

            _cryptoApi.OrderUpdated
            .Where(o => o.Market == market)
            .Select(order => Observable.FromAsync(token => UpdateOrder(order)))
            .Concat()
            .Subscribe();
        }
示例#6
0
        public async Task StartAsync()
        {
            Strategy     = new HoldUntilPriceDropsStrategy();
            _traderGrain = _orleansClient.GetGrain <ITraderGrain>(Market);
            await _traderGrain.UpdateTrades(new List <Trade>());

            await _traderGrain.SetMarketAsync(Market);

            TraderState = await _traderGrain.GetTraderData();

            TraderState.Trades = TraderState.Trades ?? new List <Trade>();

            Strategy.Settings = TraderSettings.Default;
            if (TraderState.Trades.Count == 0)
            {
                TraderState.Trades.Add(new Trade {
                    Status = TradeStatus.Empty
                });
            }
            _cryptoBroker.Initialize(TraderState);
        }
示例#7
0
        public async Task CheckProfit()
        {
            _candles = (await _fakeBittrexApi.GetCandlesAsync((_market), TickInterval.OneHour)).Content;
            var strategy = new HoldUntilPriceDropsStrategy
            {
                Settings = new TraderSettings
                {
                    BuyLowerPercentage     = 0,
                    TradingBudget          = 0.0012M,
                    MinimumTakeProfit      = 0M,
                    HighStopLossPercentage = -0.001M,
                    StopLoss       = -15,
                    BuyTrigger     = -43M,
                    ExpirationTime = TimeSpan.FromHours(2)
                }
            };

            var coinTrader = await RunHistoryData(strategy);

            var budget = await coinTrader.FinishTest();

            budget.Profit.Should().Be(5.86M);
        }
示例#8
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);
        }
示例#9
0
        public async Task FindBestSettings()
        {
            _candles = (await _fakeBittrexApi.GetCandlesAsync((_market), TickInterval.OneHour)).Content;
            var buyLowerRange = new List <decimal> {
                -3, -2, -1, 0
            };
            var minimumTakeProfitRange = new List <decimal> {
                0, 1
            };
            var highStopLossRange = new List <decimal> {
                -5, -1, -0.1M, -0.001M
            };
            var stopLossRange = new List <decimal> {
                -15, -6, -4,
            };
            var buyTriggerRange = new List <decimal> {
                -4, -2
            };
            var expirationRange = new List <TimeSpan>
            {
                TimeSpan.FromMinutes(15),
                TimeSpan.FromHours(1),
                TimeSpan.FromHours(2),
                TimeSpan.FromHours(24)
            };
            var bestSettings    = TraderSettings.Default;
            var bestProfit      = -1000M;
            var totalIterations = buyLowerRange.Count * highStopLossRange.Count * stopLossRange.Count *
                                  buyTriggerRange.Count * minimumTakeProfitRange.Count;

            var it         = 0;
            var strategies = new List <HoldUntilPriceDropsStrategy>();

            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)
                                {
                                    var strategy = new HoldUntilPriceDropsStrategy();
                                    strategy.Settings = new TraderSettings
                                    {
                                        BuyLowerPercentage     = buy,
                                        HighStopLossPercentage = highStopLoss,
                                        StopLoss          = stopLoss,
                                        BuyTrigger        = trigger,
                                        MinimumTakeProfit = minProfit,
                                        TradingBudget     = TraderSettings.Default.TradingBudget,
                                        ExpirationTime    = expiration
                                    };
                                    strategies.Add(strategy);
                                }
                            }
                        }
                    }
                }
            }
            var dict          = new Dictionary <string, Budget>();
            var oldPercentage = -1;
            var index         = 1;

            Parallel.ForEach(strategies.Take(1), (strategy) =>
            {
                try
                {
                    /*strategy = new HoldUntilPriceDropsStrategy
                     * {
                     *  Settings = new TraderSettings
                     *  {
                     *      BuyLowerPercentage = 0,
                     *      TradingBudget = 0.0012M,
                     *      MinimumTakeProfit = 0M,
                     *      HighStopLossPercentage = -0.001M,
                     *      StopLoss = -15,
                     *      BuyTrigger = -43M,
                     *      ExpirationTime = TimeSpan.FromHours(2)
                     *  }
                     * };*/
                    var coinTrader = RunHistoryData(strategy).Result;
                    var budget     = coinTrader.FinishTest().Result;
                    Debug.WriteLine($"Finished {index++}");
                    it++;
                    if (budget.Profit > bestProfit)
                    {
                        bestSettings = strategy.Settings;
                        bestProfit   = budget.Profit;
                    }

                    dict[strategy.Settings.ToString()] = budget;
                    var percentage = (it * 100) / totalIterations;
                    if (percentage != oldPercentage)
                    {
                        oldPercentage = percentage;
                        Console.WriteLine($"{bestProfit}%\t\t{percentage}%\t\t{bestSettings.ToString()}");
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            });

            var topSettings = dict.OrderByDescending(d => d.Value.Profit).Take(50).ToList();

            foreach (var keyValuePair in topSettings)
            {
                Console.WriteLine($"{keyValuePair.Value.Profit}% - {keyValuePair.Key}\t{keyValuePair.Value.Invested}\t{keyValuePair.Value.Earned}");
            }
            Console.WriteLine($"Best settings {bestSettings.StopLoss}\t{bestProfit} BTC");

            var trader = await RunHistoryData(new HoldUntilPriceDropsStrategy { Settings = bestSettings });

            var traderBudget = await trader.FinishTest();

            traderBudget.Profit.Should().Be(topSettings[0].Value.Profit);
        }
示例#10
0
        public async Task <BacktestingStats> FindBestSettings(string market)
        {
            var candlesResponse = await _cryptoApi.GetCandlesAsync(market, TickInterval.OneMinute);

            var candles       = candlesResponse.Content;
            var buyLowerRange = new List <decimal> {
                -5, -4, -3, -2, -1
            };
            var minimumTakeProfitRange = new List <decimal> {
                0, 0.1M, 0.5M, 3, 5
            };
            var highStopLossRange = new List <decimal> {
                -30, -5, -4, -3, -2, -1, -0.1M
            };
            var stopLossRange = new List <decimal> {
                -30, -20, -10, -5, -4, -3
            };
            var buyTriggerRange = new List <decimal> {
                -7, -6, -5, -4, -3, -2
            };
            var bestSettings    = TraderSettings.Default;
            var bestProfit      = -100M;
            var totalIterations = buyLowerRange.Count * highStopLossRange.Count * stopLossRange.Count *
                                  buyTriggerRange.Count * minimumTakeProfitRange.Count;

            var it         = 0;
            var strategies = new List <HoldUntilPriceDropsStrategy>();

            foreach (var buy in buyLowerRange)
            {
                foreach (var highStopLoss in highStopLossRange)
                {
                    foreach (var stopLoss in stopLossRange)
                    {
                        foreach (var trigger in buyTriggerRange)
                        {
                            foreach (var minProfit in minimumTakeProfitRange)
                            {
                                var strategy = new HoldUntilPriceDropsStrategy();
                                strategy.Settings = new TraderSettings
                                {
                                    BuyLowerPercentage     = buy,
                                    HighStopLossPercentage = highStopLoss,
                                    StopLoss          = stopLoss,
                                    BuyTrigger        = trigger,
                                    MinimumTakeProfit = minProfit,
                                    TradingBudget     = TraderSettings.Default.TradingBudget
                                };
                                strategies.Add(strategy);
                            }
                        }
                    }
                }
            }
            var dict          = new Dictionary <string, CryptoTraderStats>();
            var oldPercentage = -1;

            Parallel.ForEach(strategies, (strategy) =>
            {
                try
                {
                    var backtester      = new CryptoTraderBacktester();
                    backtester.Strategy = strategy;
                    backtester.Candles  = candles;
                    backtester.Initialize();
                    var cryptoTraderStats = backtester.StartFromFile(market);
                    it++;
                    if (cryptoTraderStats.Profit > bestProfit)
                    {
                        bestSettings = strategy.Settings;
                        bestProfit   = cryptoTraderStats.Profit;
                    }

                    lock (_syncObject)
                    {
                        if (dict.Any(d => d.Key == strategy.Settings.ToString()))
                        {
                            if (dict[strategy.Settings.ToString()].Profit < cryptoTraderStats.Profit)
                            {
                                dict[strategy.Settings.ToString()] = cryptoTraderStats;
                            }
                        }
                        else
                        {
                            dict[strategy.Settings.ToString()] = cryptoTraderStats;
                        }
                    }
                    var percentage = (it * 100) / totalIterations;
                    if (percentage != oldPercentage)
                    {
                        oldPercentage = percentage;
                        Console.WriteLine($"{bestProfit}%\t\t{percentage}%\t\t{bestSettings.ToString()}");
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            });

            var topSettings = dict.OrderByDescending(d => d.Value.Profit).Take(50).ToList();

            foreach (var keyValuePair in topSettings)
            {
                Console.WriteLine($"{keyValuePair.Value.Profit}% - {keyValuePair.Key}\t{keyValuePair.Value.Opened}\\{keyValuePair.Value.Closed}\t{keyValuePair.Value.InvestedBTC}\t{keyValuePair.Value.CurrentBTC}");
            }
            Console.WriteLine($"Best settings {bestSettings.StopLoss}\t{bestProfit} BTC");
            return(new BacktestingStats
            {
                Market = market,
                TradingStrategy = new HoldUntilPriceDropsStrategy {
                    Settings = bestSettings
                },
                TraderStats = topSettings[0].Value,
                TraderSettings = bestSettings
            });
        }