Example #1
0
        public void Operate()
        {
            ITradingRecord record = new BaseTradingRecord();

            record.Operate(1);
            Assert.IsTrue(record.GetCurrentTrade().IsOpened());
            Assert.AreEqual(0, record.GetTradeCount());
            Assert.IsNull(record.GetLastTrade());
            Assert.AreEqual(Order.buyAt(1, Decimals.NaN, Decimals.NaN), record.GetLastOrder());
            Assert.AreEqual(Order.buyAt(1, Decimals.NaN, Decimals.NaN), record.GetLastOrder(OrderType.BUY));
            Assert.IsNull(record.GetLastOrder(OrderType.SELL));
            Assert.AreEqual(Order.buyAt(1, Decimals.NaN, Decimals.NaN), record.GetLastEntry());
            Assert.IsNull(record.GetLastExit());

            record.Operate(3);
            Assert.IsTrue(record.GetCurrentTrade().IsNew());
            Assert.AreEqual(1, record.GetTradeCount());
            Assert.AreEqual(new Trade(Order.buyAt(1, Decimals.NaN, Decimals.NaN), Order.sellAt(3, Decimals.NaN, Decimals.NaN)), record.GetLastTrade());
            Assert.AreEqual(Order.sellAt(3, Decimals.NaN, Decimals.NaN), record.GetLastOrder());
            Assert.AreEqual(Order.buyAt(1, Decimals.NaN, Decimals.NaN), record.GetLastOrder(OrderType.BUY));
            Assert.AreEqual(Order.sellAt(3, Decimals.NaN, Decimals.NaN), record.GetLastOrder(OrderType.SELL));
            Assert.AreEqual(Order.buyAt(1, Decimals.NaN, Decimals.NaN), record.GetLastEntry());
            Assert.AreEqual(Order.sellAt(3, Decimals.NaN, Decimals.NaN), record.GetLastExit());

            record.Operate(5);
            Assert.IsTrue(record.GetCurrentTrade().IsOpened());
            Assert.AreEqual(1, record.GetTradeCount());
            Assert.AreEqual(new Trade(Order.buyAt(1, Decimals.NaN, Decimals.NaN), Order.sellAt(3, Decimals.NaN, Decimals.NaN)), record.GetLastTrade());
            Assert.AreEqual(Order.buyAt(5, Decimals.NaN, Decimals.NaN), record.GetLastOrder());
            Assert.AreEqual(Order.buyAt(5, Decimals.NaN, Decimals.NaN), record.GetLastOrder(OrderType.BUY));
            Assert.AreEqual(Order.sellAt(3, Decimals.NaN, Decimals.NaN), record.GetLastOrder(OrderType.SELL));
            Assert.AreEqual(Order.buyAt(5, Decimals.NaN, Decimals.NaN), record.GetLastEntry());
            Assert.AreEqual(Order.sellAt(3, Decimals.NaN, Decimals.NaN), record.GetLastExit());
        }
Example #2
0
        public void CalculateWithASimpleTrade()
        {
            series = new MockTimeSeries(100M, 105M, 110M, 100M, 95M, 105M);
            ITradingRecord            tradingRecord = new BaseTradingRecord(Order.buyAt(0, series), Order.sellAt(2, series));
            AbstractAnalysisCriterion averageProfit = new AverageProfitCriterion();

            Assert.AreEqual(1.0322801154563671592135852251M, averageProfit.Calculate(series, tradingRecord)); // (decimal)Math.Pow(110d / 100, 1d / 3)
        }
        public void RewardRiskRatioCriterionOnlyWithGain()
        {
            MockTimeSeries series        = new MockTimeSeries(1, 2, 3, 6, 8, 20, 3);
            ITradingRecord tradingRecord = new BaseTradingRecord(
                Order.buyAt(0, series), Order.sellAt(1, series),
                Order.buyAt(2, series), Order.sellAt(5, series));

            Assert.AreEqual(Decimals.NaN, rrc.Calculate(series, tradingRecord));
        }
Example #4
0
        public void reallyLongCashFlow()
        {
            int            size             = 1000000;
            ITimeSeries    sampleTimeSeries = new MockTimeSeries(Enumerable.Range(0, size).Select(_ => new MockBar(10)).Cast <IBar>().ToList());
            ITradingRecord tradingRecord    = new BaseTradingRecord(Order.buyAt(0, sampleTimeSeries), Order.sellAt(size - 1, sampleTimeSeries));
            CashFlow       cashFlow         = new CashFlow(sampleTimeSeries, tradingRecord);

            Assert.AreEqual(cashFlow.GetValue(size - 1), 1);
        }
Example #5
0
        public override decimal Calculate(ITimeSeries series, Trade trade)
        {
            ITradingRecord fakeRecord = new BaseTradingRecord();

            fakeRecord.Enter(series.GetBeginIndex());
            fakeRecord.Exit(series.GetEndIndex());

            return(_criterion.Calculate(series, trade) / _criterion.Calculate(series, fakeRecord));
        }
Example #6
0
        public void cashFlowBuyWithOnlyOneTrade()
        {
            ITimeSeries    sampleTimeSeries = new MockTimeSeries(1, 2);
            ITradingRecord tradingRecord    = new BaseTradingRecord(Order.buyAt(0, sampleTimeSeries), Order.sellAt(1, sampleTimeSeries));

            CashFlow cashFlow = new CashFlow(sampleTimeSeries, tradingRecord);

            Assert.AreEqual(cashFlow.GetValue(0), 1);
            Assert.AreEqual(cashFlow.GetValue(1), 2);
        }
Example #7
0
        public void CalculateWithOnlyGains()
        {
            MockTimeSeries           series        = new MockTimeSeries(1, 2, 3, 6, 8, 20, 3);
            MaximumDrawdownCriterion mdd           = new MaximumDrawdownCriterion();
            ITradingRecord           tradingRecord = new BaseTradingRecord(
                Order.buyAt(0, series), Order.sellAt(1, series),
                Order.buyAt(2, series), Order.sellAt(5, series));

            Assert.AreEqual(0M, mdd.Calculate(series, tradingRecord));
        }
Example #8
0
        public void CalculateOnlyWithLossTrades()
        {
            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 averageProfit = new AverageProfitCriterion();

            Assert.AreEqual(0.934265419203025064794086149M, averageProfit.Calculate(series, tradingRecord)); // (decimal)Math.Pow(95d / 100 * 70d / 100, 1d / 6)
        }
Example #9
0
        public void CalculateOnlyWithGainTrades()
        {
            series = new MockTimeSeries(100M, 105M, 110M, 100M, 95M, 105M);
            ITradingRecord tradingRecord = new BaseTradingRecord(
                Order.buyAt(0, series), Order.sellAt(2, series),
                Order.buyAt(3, series), Order.sellAt(5, series));
            AbstractAnalysisCriterion averageProfit = new AverageProfitCriterion();

            Assert.AreEqual(1.0243074482606615553441174081M, averageProfit.Calculate(series, tradingRecord));
        }
        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 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));
        }
        public void CalculateProfitWithTradesThatStartSelling()
        {
            MockTimeSeries series        = new MockTimeSeries(100, 95, 100, 80, 85, 70);
            ITradingRecord tradingRecord = new BaseTradingRecord(
                Order.sellAt(0, series), Order.buyAt(1, series),
                Order.sellAt(2, series), Order.buyAt(5, series));

            AbstractAnalysisCriterion profit = new TotalProfitCriterion();

            Assert.AreEqual((1M / 0.95M) * (1M / 0.7M), profit.Calculate(series, tradingRecord));
        }
Example #14
0
        public void WithTradesThatSellBeforeBuying()
        {
            MockTimeSeries           series        = new MockTimeSeries(2, 1, 3, 5, 6, 3, 20);
            MaximumDrawdownCriterion mdd           = new MaximumDrawdownCriterion();
            ITradingRecord           tradingRecord = new BaseTradingRecord(
                Order.buyAt(0, series), Order.sellAt(1, series),
                Order.buyAt(3, series), Order.sellAt(4, series),
                Order.sellAt(5, series), Order.buyAt(6, series));

            Assert.AreEqual(.91M, mdd.Calculate(series, tradingRecord));
        }
Example #15
0
        public void CalculateShouldWork()
        {
            MockTimeSeries           series        = new MockTimeSeries(1, 2, 3, 6, 5, 20, 3);
            MaximumDrawdownCriterion mdd           = new MaximumDrawdownCriterion();
            ITradingRecord           tradingRecord = new BaseTradingRecord(
                Order.buyAt(0, series), Order.sellAt(1, series),
                Order.buyAt(3, series), Order.sellAt(4, series),
                Order.buyAt(5, series), Order.sellAt(6, series));

            Assert.AreEqual(.875M, mdd.Calculate(series, tradingRecord));
        }
Example #16
0
        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 BuyAndHoldCriterion();

            Assert.AreEqual(0.7M, buyAndHold.Calculate(series, tradingRecord));
        }
        public void CalculateWithTwoTrades()
        {
            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 numberOfBars = new NumberOfBarsCriterion();

            Assert.AreEqual(6, numberOfBars.Calculate(series, tradingRecord));
        }
        public void Calculate()
        {
            ITimeSeries    series        = new MockTimeSeries(100M, 95M, 102M, 105M, 97M, 113M);
            ITradingRecord tradingRecord = new BaseTradingRecord(
                Order.buyAt(0, series), Order.sellAt(1, series),
                Order.buyAt(2, series), Order.sellAt(3, series),
                Order.buyAt(4, series), Order.sellAt(5, series));

            AverageProfitableTradesCriterion average = new AverageProfitableTradesCriterion();

            Assert.AreEqual(2M / 3, average.Calculate(series, tradingRecord));
        }
Example #19
0
        public void WithSimpleTrades()
        {
            MockTimeSeries           series        = new MockTimeSeries(1, 10, 5, 6, 1);
            MaximumDrawdownCriterion mdd           = new MaximumDrawdownCriterion();
            ITradingRecord           tradingRecord = new BaseTradingRecord(
                Order.buyAt(0, series), Order.sellAt(1, series),
                Order.buyAt(1, series), Order.sellAt(2, series),
                Order.buyAt(2, series), Order.sellAt(3, series),
                Order.buyAt(3, series), Order.sellAt(4, series));

            Assert.AreEqual(.9M, mdd.Calculate(series, tradingRecord));
        }
Example #20
0
        public void cashFlowSell()
        {
            ITimeSeries    sampleTimeSeries = new MockTimeSeries(1, 2, 4, 8, 16, 32);
            ITradingRecord tradingRecord    = new BaseTradingRecord(Order.sellAt(2, sampleTimeSeries), Order.buyAt(3, sampleTimeSeries));

            CashFlow cashFlow = new CashFlow(sampleTimeSeries, tradingRecord);

            Assert.AreEqual(cashFlow.GetValue(0), 1);
            Assert.AreEqual(cashFlow.GetValue(1), 1);
            Assert.AreEqual(cashFlow.GetValue(2), 1);
            Assert.AreEqual(cashFlow.GetValue(3), 0.5M);
            Assert.AreEqual(cashFlow.GetValue(4), 0.5M);
            Assert.AreEqual(cashFlow.GetValue(5), 0.5M);
        }
Example #21
0
 public void SetUp()
 {
     emptyRecord  = new BaseTradingRecord();
     openedRecord = new BaseTradingRecord(
         Order.buyAt(0, Decimals.NaN, Decimals.NaN),
         Order.sellAt(3, Decimals.NaN, Decimals.NaN),
         Order.buyAt(7, Decimals.NaN, Decimals.NaN)
         );
     closedRecord = new BaseTradingRecord(
         Order.buyAt(0, Decimals.NaN, Decimals.NaN),
         Order.sellAt(3, Decimals.NaN, Decimals.NaN),
         Order.buyAt(7, Decimals.NaN, Decimals.NaN),
         Order.sellAt(8, Decimals.NaN, Decimals.NaN)
         );
 }
        public void RewardRiskRatioCriterion()
        {
            MockTimeSeries series        = new MockTimeSeries(100, 105, 95, 100, 90, 95, 80, 120);
            ITradingRecord tradingRecord = new BaseTradingRecord(
                Order.buyAt(0, series), Order.sellAt(1, series),
                Order.buyAt(2, series), Order.sellAt(4, series),
                Order.buyAt(5, series), Order.sellAt(7, series));

            // double totalProfit = (105d / 100) * (90d / 95d) * (120d / 95);
            // double peak = (105d / 100) * (100d / 95);
            // double low = (105d / 100) * (90d / 95) * (80d / 95);
            // totalProfit / ((peak - low) / peak)

            Assert.AreEqual(5.1899313501144164759725400496M, rrc.Calculate(series, tradingRecord));
        }
Example #23
0
        public void cashFlowValueWithTwoTradesAndLongTimeWithoutOrders()
        {
            ITimeSeries    sampleTimeSeries = new MockTimeSeries(1, 2, 4, 8, 16, 32);
            ITradingRecord tradingRecord    = new BaseTradingRecord(
                Order.buyAt(1, sampleTimeSeries), Order.sellAt(2, sampleTimeSeries),
                Order.buyAt(4, sampleTimeSeries), Order.sellAt(5, sampleTimeSeries));

            CashFlow cashFlow = new CashFlow(sampleTimeSeries, tradingRecord);

            Assert.AreEqual(cashFlow.GetValue(0), 1);
            Assert.AreEqual(cashFlow.GetValue(1), 1);
            Assert.AreEqual(cashFlow.GetValue(2), 2);
            Assert.AreEqual(cashFlow.GetValue(3), 2);
            Assert.AreEqual(cashFlow.GetValue(4), 2);
            Assert.AreEqual(cashFlow.GetValue(5), 4);
        }
Example #24
0
        public void cashFlowWithSellAndBuyOrders()
        {
            ITimeSeries    sampleTimeSeries = new MockTimeSeries(2, 1, 3, 5, 6, 3, 20);
            ITradingRecord tradingRecord    = new BaseTradingRecord(
                Order.buyAt(0, sampleTimeSeries), Order.sellAt(1, sampleTimeSeries),
                Order.buyAt(3, sampleTimeSeries), Order.sellAt(4, sampleTimeSeries),
                Order.sellAt(5, sampleTimeSeries), Order.buyAt(6, sampleTimeSeries));

            CashFlow cashFlow = new CashFlow(sampleTimeSeries, tradingRecord);

            Assert.AreEqual(cashFlow.GetValue(0), 1);
            Assert.AreEqual(cashFlow.GetValue(1), 0.5M);
            Assert.AreEqual(cashFlow.GetValue(2), 0.5M);
            Assert.AreEqual(cashFlow.GetValue(3), 0.5M);
            Assert.AreEqual(cashFlow.GetValue(4), 0.6M);
            Assert.AreEqual(cashFlow.GetValue(5), 0.6M);
            Assert.AreEqual(cashFlow.GetValue(6), 0.09M);
        }
Example #25
0
        public void cashFlowValue()
        {
            // First sample series
            ITimeSeries    sampleTimeSeries = new MockTimeSeries(3, 2, 5, 1000, 5000, 0.0001M, 4M, 7M, 6M, 7, 8, 5, 6);
            ITradingRecord tradingRecord    = new BaseTradingRecord(
                Order.buyAt(0, sampleTimeSeries), Order.sellAt(2, sampleTimeSeries),
                Order.buyAt(6, sampleTimeSeries), Order.sellAt(8, sampleTimeSeries),
                Order.buyAt(9, sampleTimeSeries), Order.sellAt(11, sampleTimeSeries));

            CashFlow cashFlow = new CashFlow(sampleTimeSeries, tradingRecord);

            Assert.AreEqual(1, cashFlow.GetValue(0));
            Assert.AreEqual(2M / 3, cashFlow.GetValue(1));
            Assert.AreEqual(5M / 3, cashFlow.GetValue(2));
            Assert.AreEqual(5M / 3, cashFlow.GetValue(3));
            Assert.AreEqual(5M / 3, cashFlow.GetValue(4));
            Assert.AreEqual(5M / 3, cashFlow.GetValue(5));
            Assert.AreEqual(5M / 3, cashFlow.GetValue(6));
            Assert.AreEqual(2.9166666666666666666666666667M, cashFlow.GetValue(7)); // 5M / 3M * 7M / 4M
            Assert.AreEqual(5M / 3 * 6M / 4, cashFlow.GetValue(8));
            Assert.AreEqual(5M / 3 * 6M / 4, cashFlow.GetValue(9));
            Assert.AreEqual(2.8571428571428571428571428572M, cashFlow.GetValue(10)); // 5M / 3 * 6M / 4 * 8M / 7
            Assert.AreEqual(1.7857142857142857142857142858M, cashFlow.GetValue(11)); // 5M / 3 * 6M / 4 * 5M / 7
            Assert.AreEqual(1.7857142857142857142857142858M, cashFlow.GetValue(12)); // 5M / 3 * 6M / 4 * 5M / 7

            // Second sample series
            sampleTimeSeries = new MockTimeSeries(5, 6, 3, 7, 8, 6, 10, 15, 6);
            tradingRecord    = new BaseTradingRecord(
                Order.buyAt(4, sampleTimeSeries), Order.sellAt(5, sampleTimeSeries),
                Order.buyAt(6, sampleTimeSeries), Order.sellAt(8, sampleTimeSeries));

            CashFlow flow = new CashFlow(sampleTimeSeries, tradingRecord);

            Assert.AreEqual(flow.GetValue(0), 1);
            Assert.AreEqual(flow.GetValue(1), 1);
            Assert.AreEqual(flow.GetValue(2), 1);
            Assert.AreEqual(flow.GetValue(3), 1);
            Assert.AreEqual(flow.GetValue(4), 1);
            Assert.AreEqual(flow.GetValue(5), 0.75M);
            Assert.AreEqual(flow.GetValue(6), 0.75M);
            Assert.AreEqual(flow.GetValue(7), 1.125M);
            Assert.AreEqual(flow.GetValue(8), 0.45M);
        }