public void BetterThan()
        {
            AbstractAnalysisCriterion criterion = new VersusBuyAndHoldCriterion(new TotalProfitCriterion());

            Assert.IsTrue(criterion.BetterThan(2.0M, 1.5M));
            Assert.IsFalse(criterion.BetterThan(1.5M, 2.0M));
        }
Пример #2
0
        public void BetterThan()
        {
            IAnalysisCriterion criterion = new VersusBuyAndHoldCriterion(new TotalProfitCriterion());

            Assert.IsTrue(criterion.BetterThan(2.0, 1.5));
            Assert.IsFalse(criterion.BetterThan(1.5, 2.0));
        }
        public void CalculateWithNoTrades()
        {
            MockTimeSeries series = new MockTimeSeries(100, 95, 100, 80, 85, 70);

            AbstractAnalysisCriterion buyAndHold = new VersusBuyAndHoldCriterion(new TotalProfitCriterion());

            Assert.AreEqual(1M / 0.7M, buyAndHold.Calculate(series, new BaseTradingRecord()));
        }
Пример #4
0
        public void CalculateWithNoTrades()
        {
            var series = GenerateTimeSeries.From(100, 95, 100, 80, 85, 70);

            IAnalysisCriterion buyAndHold = new VersusBuyAndHoldCriterion(new TotalProfitCriterion());

            Assert.AreEqual(1 / 0.7, buyAndHold.Calculate(series, new TradingRecord()), TaTestsUtils.TaOffset);
        }
        public void CalculateWithOnlyOneTrade()
        {
            MockTimeSeries series = new MockTimeSeries(100, 95, 100, 80, 85, 70);
            Trade          trade  = new Trade(Order.buyAt(0, series), Order.sellAt(1, series));

            AbstractAnalysisCriterion buyAndHold = new VersusBuyAndHoldCriterion(new TotalProfitCriterion());

            Assert.AreEqual(1.3571428571428571428571428571M, buyAndHold.Calculate(series, trade)); // (100M / 70) / (100M / 95)
        }
Пример #6
0
        public void CalculateWithNumberOfTicks()
        {
            var series        = GenerateTimeSeries.From(100, 95, 100, 80, 85, 130);
            var tradingRecord = new TradingRecord(Order.BuyAt(0), Order.SellAt(1), Order.BuyAt(2), Order.SellAt(5));

            IAnalysisCriterion buyAndHold = new VersusBuyAndHoldCriterion(new NumberOfTicksCriterion());

            Assert.AreEqual(6d / 6d, buyAndHold.Calculate(series, tradingRecord), TaTestsUtils.TaOffset);
        }
Пример #7
0
        public void CalculateWithAverageProfit()
        {
            var series        = GenerateTimeSeries.From(100, 95, 100, 80, 85, 130);
            var tradingRecord = new TradingRecord(Order.BuyAt(0), Order.SellAt(1), Order.BuyAt(2), Order.SellAt(5));

            IAnalysisCriterion buyAndHold = new VersusBuyAndHoldCriterion(new AverageProfitCriterion());

            Assert.AreEqual(Math.Pow(95d / 100 * 130d / 100, 1d / 6) / Math.Pow(130d / 100, 1d / 6), buyAndHold.Calculate(series, tradingRecord), TaTestsUtils.TaOffset);
        }
Пример #8
0
        public void CalculateWithOnlyOneTrade()
        {
            var series = GenerateTimeSeries.From(100, 95, 100, 80, 85, 70);
            var trade  = new Trade(Order.BuyAt(0), Order.SellAt(1));

            IAnalysisCriterion buyAndHold = new VersusBuyAndHoldCriterion(new TotalProfitCriterion());

            Assert.AreEqual((100d / 70) / (100d / 95), buyAndHold.Calculate(series, trade), TaTestsUtils.TaOffset);
        }
Пример #9
0
        public void CalculateOnlyWithLossTrades()
        {
            var series        = GenerateTimeSeries.From(100, 95, 100, 80, 85, 70);
            var tradingRecord = new TradingRecord(Order.BuyAt(0), Order.SellAt(1), Order.BuyAt(2), Order.SellAt(5));

            IAnalysisCriterion buyAndHold = new VersusBuyAndHoldCriterion(new TotalProfitCriterion());

            Assert.AreEqual(0.95 * 0.7 / 0.7, buyAndHold.Calculate(series, tradingRecord), TaTestsUtils.TaOffset);
        }
Пример #10
0
        public void CalculateOnlyWithGainTrades()
        {
            var series        = GenerateTimeSeries.From(100, 105, 110, 100, 95, 105);
            var tradingRecord = new TradingRecord(Order.BuyAt(0), Order.SellAt(2), Order.BuyAt(3), Order.SellAt(5));

            IAnalysisCriterion buyAndHold = new VersusBuyAndHoldCriterion(new TotalProfitCriterion());

            Assert.AreEqual(1.10 * 1.05 / 1.05, buyAndHold.Calculate(series, tradingRecord), TaTestsUtils.TaOffset);
        }
        public void CalculateWithNumberOfBars()
        {
            MockTimeSeries series        = new MockTimeSeries(100, 95, 100, 80, 85, 130);
            ITradingRecord tradingRecord = new BaseTradingRecord(
                Order.buyAt(0, series), Order.sellAt(1, series),
                Order.buyAt(2, series), Order.sellAt(5, series));

            AbstractAnalysisCriterion buyAndHold = new VersusBuyAndHoldCriterion(new NumberOfBarsCriterion());

            Assert.AreEqual(6M / 6M, buyAndHold.Calculate(series, tradingRecord));
        }
        public void CalculateWithAverageProfit()
        {
            MockTimeSeries series        = new MockTimeSeries(100, 95, 100, 80, 85, 130);
            ITradingRecord tradingRecord = new BaseTradingRecord(
                Order.buyAt(0, Decimals.NaN, Decimals.NaN), Order.sellAt(1, Decimals.NaN, Decimals.NaN),
                Order.buyAt(2, Decimals.NaN, Decimals.NaN), Order.sellAt(5, Decimals.NaN, Decimals.NaN));

            AbstractAnalysisCriterion buyAndHold = new VersusBuyAndHoldCriterion(new AverageProfitCriterion());

            Assert.AreEqual((95M / 100 * 130M / 100).Pow(1M / 6) / (130M / 100).Pow(1M / 6), buyAndHold.Calculate(series, tradingRecord));
        }
        public void CalculateOnlyWithLossTrades()
        {
            MockTimeSeries series        = new MockTimeSeries(100, 95, 100, 80, 85, 70);
            ITradingRecord tradingRecord = new BaseTradingRecord(
                Order.buyAt(0, series), Order.sellAt(1, series),
                Order.buyAt(2, series), Order.sellAt(5, series));

            AbstractAnalysisCriterion buyAndHold = new VersusBuyAndHoldCriterion(new TotalProfitCriterion());

            Assert.AreEqual(0.95M * 0.7M / 0.7M, buyAndHold.Calculate(series, tradingRecord));
        }
        public void CalculateOnlyWithGainTrades()
        {
            MockTimeSeries series        = new MockTimeSeries(100, 105, 110, 100, 95, 105);
            ITradingRecord tradingRecord = new BaseTradingRecord(
                Order.buyAt(0, series), Order.sellAt(2, series),
                Order.buyAt(3, series), Order.sellAt(5, series));

            AbstractAnalysisCriterion buyAndHold = new VersusBuyAndHoldCriterion(new TotalProfitCriterion());

            Assert.AreEqual(1.10M * 1.05M / 1.05M, buyAndHold.Calculate(series, tradingRecord));
        }
Пример #15
0
        public void QuickStart()
        {
            // Getting a time series (from any provider: CSV, web service, etc.)
            var series = CsvTradesLoader.LoadBitstampSeries();

            // Getting the close price of the ticks
            var firstClosePrice = series.GetTick(0).ClosePrice;

            Console.WriteLine("First close price: " + firstClosePrice.ToDouble());
            // Or within an indicator:
            var closePrice = new ClosePriceIndicator(series);

            // Here is the same close price:
            Console.WriteLine(firstClosePrice.IsEqual(closePrice.GetValue(0))); // equal to firstClosePrice

            // Getting the simple moving average (SMA) of the close price over the last 5 ticks
            var shortSma = new SmaIndicator(closePrice, 5);

            // Here is the 5-ticks-SMA value at the 42nd index
            Console.WriteLine("5-ticks-SMA value at the 42nd index: " + shortSma.GetValue(42).ToDouble());

            // Getting a longer SMA (e.g. over the 30 last ticks)
            var longSma = new SmaIndicator(closePrice, 30);


            // Ok, now let's building our trading rules!

            // Buying rules
            // We want to buy:
            //  - if the 5-ticks SMA crosses over 30-ticks SMA
            //  - or if the price goes below a defined price (e.g $800.00)
            var buyingRule = (new CrossedUpIndicatorRule(shortSma, longSma))
                             .Or(new CrossedDownIndicatorRule(closePrice, Decimal.ValueOf("800")));

            // Selling rules
            // We want to sell:
            //  - if the 5-ticks SMA crosses under 30-ticks SMA
            //  - or if if the price looses more than 3%
            //  - or if the price earns more than 2%
            var sellingRule = (new CrossedDownIndicatorRule(shortSma, longSma))
                              //.Or(new CrossedDownIndicatorRule(new TrailingStopLossIndicator(closePrice, Decimal.ValueOf("30")), closePrice ))
                              .Or(new StopLossRule(closePrice, Decimal.ValueOf("3")))
                              .Or(new StopGainRule(closePrice, Decimal.ValueOf("2")));

            // Running our juicy trading strategy...
            var tradingRecord = series.Run(new Strategy(buyingRule, sellingRule));

            Console.WriteLine("Number of trades for our strategy: " + tradingRecord.TradeCount);

            // Analysis

            // Getting the cash flow of the resulting trades
            var cashFlow = new CashFlow(series, tradingRecord);

            // Getting the profitable trades ratio
            IAnalysisCriterion profitTradesRatio = new AverageProfitableTradesCriterion();

            Console.WriteLine("Profitable trades ratio: " + profitTradesRatio.Calculate(series, tradingRecord));
            // Getting the reward-risk ratio
            IAnalysisCriterion rewardRiskRatio = new RewardRiskRatioCriterion();

            Console.WriteLine("Reward-risk ratio: " + rewardRiskRatio.Calculate(series, tradingRecord));

            // Total profit of our strategy
            // vs total profit of a buy-and-hold strategy
            IAnalysisCriterion vsBuyAndHold = new VersusBuyAndHoldCriterion(new TotalProfitCriterion());

            Console.WriteLine("Our profit vs buy-and-hold profit: " + vsBuyAndHold.Calculate(series, tradingRecord));

            // Your turn!
        }