示例#1
0
        public override bool IsSatisfied(int index, TradingRecord tradingRecord)
        {
            var satisfied = _cross.GetValue(index);

            TraceIsSatisfied(index, satisfied);
            return(satisfied);
        }
示例#2
0
        public override bool IsSatisfied(int index, TradingRecord tradingRecord)
        {
            var satisfied = _ref.GetValue(index).IsLessThanOrEqual(_upper.GetValue(index)) && _ref.GetValue(index).IsGreaterThanOrEqual(_lower.GetValue(index));

            TraceIsSatisfied(index, satisfied);
            return(satisfied);
        }
示例#3
0
        public override double Calculate(TimeSeries series, TradingRecord tradingRecord)
        {
            var cashFlow        = new CashFlow(series, tradingRecord);
            var maximumDrawdown = CalculateMaximumDrawdown(series, cashFlow);

            return(maximumDrawdown.ToDouble());
        }
示例#4
0
        public override double Calculate(TimeSeries series, TradingRecord tradingRecord)
        {
            var totalCosts   = 0d;
            var tradedAmount = _initialAmount;

            foreach (var trade in tradingRecord.Trades)
            {
                var tradeCost = GetTradeCost(series, trade, tradedAmount);
                totalCosts += tradeCost;
                // To calculate the new traded amount:
                //    - Remove the cost of the first order
                //    - Multiply by the profit ratio
                tradedAmount = (tradedAmount - tradeCost) * _profit.Calculate(series, trade);
            }

            // Special case: if the current trade is open
            var currentTrade = tradingRecord.CurrentTrade;

            if (currentTrade.Opened)
            {
                totalCosts += GetOrderCost(currentTrade.Entry, tradedAmount);
            }

            return(totalCosts);
        }
示例#5
0
        public override bool IsSatisfied(int index, TradingRecord tradingRecord)
        {
            var satisfied = false;

            // No trading history or no trade opened, no gain
            if (tradingRecord != null)
            {
                var currentTrade = tradingRecord.CurrentTrade;
                if (currentTrade.Opened)
                {
                    var entryPrice   = currentTrade.Entry.Price;
                    var currentPrice = _closePrice.GetValue(index);

                    var threshold = entryPrice.MultipliedBy(_gainRatioThreshold);
                    if (currentTrade.Entry.IsBuy)
                    {
                        satisfied = currentPrice.IsGreaterThanOrEqual(threshold);
                    }
                    else
                    {
                        satisfied = currentPrice.IsLessThanOrEqual(threshold);
                    }
                }
            }
            TraceIsSatisfied(index, satisfied);
            return(satisfied);
        }
示例#6
0
        public override bool IsSatisfied(int index, TradingRecord tradingRecord)
        {
            var satisfied = _indexes.Any(t => t == index);

            TraceIsSatisfied(index, satisfied);
            return(satisfied);
        }
示例#7
0
        public override bool IsSatisfied(int index, TradingRecord tradingRecord)
        {
            var satisfied = _first.GetValue(index).IsLessThan(_second.GetValue(index));

            TraceIsSatisfied(index, satisfied);
            return(satisfied);
        }
示例#8
0
        public static void Main(string[] args)
        {
            // Splitting the series into slices
            TimeSeries         series    = CsvTradesLoader.loadBitstampSeries();
            IList <TimeSeries> subseries = series.split(Period.hours(6), Period.weeks(1));

            // Building the map of strategies
            IDictionary <Strategy, string> strategies = buildStrategiesMap(series);

            // The analysis criterion
            AnalysisCriterion profitCriterion = new TotalProfitCriterion();

            foreach (TimeSeries slice in subseries)
            {
                // For each sub-series...
                Console.WriteLine("Sub-series: " + slice.SeriesPeriodDescription);
                foreach (KeyValuePair <Strategy, string> entry in strategies.SetOfKeyValuePairs())
                {
                    Strategy strategy = entry.Key;
                    string   name     = entry.Value;
                    // For each strategy...
                    TradingRecord tradingRecord = slice.run(strategy);
                    double        profit        = profitCriterion.calculate(slice, tradingRecord);
                    Console.WriteLine("\tProfit for " + name + ": " + profit);
                }
                Strategy bestStrategy = profitCriterion.chooseBest(slice, new List <Strategy>(strategies.Keys));
                Console.WriteLine("\t\t--> Best strategy: " + strategies[bestStrategy] + "\n");
            }
        }
示例#9
0
        public void Operate()
        {
            var record = new TradingRecord();

            record.Operate(1);
            Assert.IsTrue(record.CurrentTrade.Opened);
            Assert.AreEqual(0, record.TradeCount);
            Assert.IsNull(record.LastTrade);
            Assert.AreEqual(Order.BuyAt(1), record.LastOrder);
            Assert.AreEqual(Order.BuyAt(1), record.GetLastOrder(OrderType.Buy));
            Assert.IsNull(record.GetLastOrder(OrderType.Sell));
            Assert.AreEqual(Order.BuyAt(1), record.LastEntry);
            Assert.IsNull(record.LastExit);

            record.Operate(3);
            Assert.IsTrue(record.CurrentTrade.New);
            Assert.AreEqual(1, record.TradeCount);
            Assert.AreEqual(new Trade(Order.BuyAt(1), Order.SellAt(3)), record.LastTrade);
            Assert.AreEqual(Order.SellAt(3), record.LastOrder);
            Assert.AreEqual(Order.BuyAt(1), record.GetLastOrder(OrderType.Buy));
            Assert.AreEqual(Order.SellAt(3), record.GetLastOrder(OrderType.Sell));
            Assert.AreEqual(Order.BuyAt(1), record.LastEntry);
            Assert.AreEqual(Order.SellAt(3), record.LastExit);

            record.Operate(5);
            Assert.IsTrue(record.CurrentTrade.Opened);
            Assert.AreEqual(1, record.TradeCount);
            Assert.AreEqual(new Trade(Order.BuyAt(1), Order.SellAt(3)), record.LastTrade);
            Assert.AreEqual(Order.BuyAt(5), record.LastOrder);
            Assert.AreEqual(Order.BuyAt(5), record.GetLastOrder(OrderType.Buy));
            Assert.AreEqual(Order.SellAt(3), record.GetLastOrder(OrderType.Sell));
            Assert.AreEqual(Order.BuyAt(5), record.LastEntry);
            Assert.AreEqual(Order.SellAt(3), record.LastExit);
        }
        public override double Calculate(TimeSeries series, TradingRecord tradingRecord)
        {
            var numberOfProfitable = 0;

            foreach (var trade in tradingRecord.Trades)
            {
                var entryIndex = trade.Entry.Index;
                var exitIndex  = trade.Exit.Index;

                Decimal result;
                if (trade.Entry.IsBuy)
                {
                    // buy-then-sell trade
                    result = series.GetTick(exitIndex).ClosePrice.DividedBy(series.GetTick(entryIndex).ClosePrice);
                }
                else
                {
                    // sell-then-buy trade
                    result = series.GetTick(entryIndex).ClosePrice.DividedBy(series.GetTick(exitIndex).ClosePrice);
                }
                if (result.IsGreaterThan(Decimal.One))
                {
                    numberOfProfitable++;
                }
            }
            return(((double)numberOfProfitable) / tradingRecord.TradeCount);
        }
示例#11
0
        public override bool IsSatisfied(int index, TradingRecord tradingRecord)
        {
            var satisfied = !_rule.IsSatisfied(index, tradingRecord);

            TraceIsSatisfied(index, satisfied);
            return(satisfied);
        }
        public void RewardRiskRatioCriterionOnlyWithGain()
        {
            var series        = GenerateTimeSeries.From(1, 2, 3, 6, 8, 20, 3);
            var tradingRecord = new TradingRecord(Order.BuyAt(0), Order.SellAt(1), Order.BuyAt(2), Order.SellAt(5));

            Assert.IsTrue(double.IsInfinity(_rrc.Calculate(series, tradingRecord)));
        }
示例#13
0
        public void WithSimpleTrades()
        {
            var series        = GenerateTimeSeries.From(1, 10, 5, 6, 1);
            var mdd           = new MaximumDrawdownCriterion();
            var tradingRecord = new TradingRecord(Order.BuyAt(0), Order.SellAt(1), Order.BuyAt(1), Order.SellAt(2), Order.BuyAt(2), Order.SellAt(3), Order.BuyAt(3), Order.SellAt(4));

            Assert.AreEqual(.9d, mdd.Calculate(series, tradingRecord), TaTestsUtils.TaOffset);
        }
示例#14
0
        public void WithTradesThatSellBeforeBuying()
        {
            var series        = GenerateTimeSeries.From(2, 1, 3, 5, 6, 3, 20);
            var mdd           = new MaximumDrawdownCriterion();
            var tradingRecord = new TradingRecord(Order.BuyAt(0), Order.SellAt(1), Order.BuyAt(3), Order.SellAt(4), Order.SellAt(5), Order.BuyAt(6));

            Assert.AreEqual(.91, mdd.Calculate(series, tradingRecord), TaTestsUtils.TaOffset);
        }
示例#15
0
        public void CalculateOnlyWithGainTrades()
        {
            var _series       = GenerateTimeSeries.From(100d, 105d, 110d, 100d, 95d, 105d);
            var tradingRecord = new TradingRecord(Order.BuyAt(0), Order.SellAt(2), Order.BuyAt(3), Order.SellAt(5));
            IAnalysisCriterion averageProfit = new AverageProfitCriterion();

            Assert.AreEqual(1.0243, TaTestsUtils.TaOffset, averageProfit.Calculate(_series, tradingRecord));
        }
示例#16
0
        public void CalculateWithOnlyGains()
        {
            var series        = GenerateTimeSeries.From(1, 2, 3, 6, 8, 20, 3);
            var mdd           = new MaximumDrawdownCriterion();
            var tradingRecord = new TradingRecord(Order.BuyAt(0), Order.SellAt(1), Order.BuyAt(2), Order.SellAt(5));

            Assert.AreEqual(0d, mdd.Calculate(series, tradingRecord), TaTestsUtils.TaOffset);
        }
示例#17
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 averageProfit = new AverageProfitCriterion();

            Assert.AreEqual(Math.Pow(95d / 100 * 70d / 100, 1d / 6), averageProfit.Calculate(_series, tradingRecord), TaTestsUtils.TaOffset);
        }
示例#18
0
 public override double Calculate(TimeSeries series, TradingRecord tradingRecord)
 {
     if (series.End == -1)
     {
         return(1);
     }
     return(series.GetTick(series.End).ClosePrice.DividedBy(series.GetTick(series.Begin).ClosePrice).ToDouble());
 }
示例#19
0
 public static void AddTradingRecord(TradingRecord tradingRecord)//ex DataException
 {
     using (StockMonitorEntities _dbContext = new StockMonitorEntities())
     {
         _dbContext.TradingRecords.Add(tradingRecord);
         _dbContext.SaveChanges();//ex DataException
     }
 }
示例#20
0
        public void CalculateWithASimpleTrade()
        {
            var _series       = GenerateTimeSeries.From(100d, 105d, 110d, 100d, 95d, 105d);
            var tradingRecord = new TradingRecord(Order.BuyAt(0), Order.SellAt(2));
            IAnalysisCriterion averageProfit = new AverageProfitCriterion();

            Assert.AreEqual(Math.Pow(110d / 100, 1d / 3), averageProfit.Calculate(_series, tradingRecord), TaTestsUtils.TaOffset);
        }
示例#21
0
        public void CalculateShouldWork()
        {
            var series        = GenerateTimeSeries.From(1, 2, 3, 6, 5, 20, 3);
            var mdd           = new MaximumDrawdownCriterion();
            var tradingRecord = new TradingRecord(Order.BuyAt(0), Order.SellAt(1), Order.BuyAt(3), Order.SellAt(4), Order.BuyAt(5), Order.SellAt(6));

            Assert.AreEqual(.875d, mdd.Calculate(series, tradingRecord), TaTestsUtils.TaOffset);
        }
示例#22
0
 /// <summary>
 /// Calculates the cash flow for a trading record. </summary>
 /// <param name="tradingRecord"> the trading record </param>
 private void Calculate(TradingRecord tradingRecord)
 {
     foreach (var trade in tradingRecord.Trades)
     {
         // For each trade...
         Calculate(trade);
     }
 }
示例#23
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);
        }
示例#24
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 BuyAndHoldCriterion();

            Assert.AreEqual(0.7, buyAndHold.Calculate(series, tradingRecord), TaTestsUtils.TaOffset);
        }
示例#25
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);
        }
示例#26
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 profit = new TotalProfitCriterion();

            Assert.AreEqual(1.10 * 1.05, profit.Calculate(series, tradingRecord), TaTestsUtils.TaOffset);
        }
示例#27
0
        public void CalculateProfitWithTradesThatStartSelling()
        {
            var series        = GenerateTimeSeries.From(100, 95, 100, 80, 85, 70);
            var tradingRecord = new TradingRecord(Order.SellAt(0), Order.BuyAt(1), Order.SellAt(2), Order.BuyAt(5));

            IAnalysisCriterion profit = new TotalProfitCriterion();

            Assert.AreEqual((1 / 0.95) * (1 / 0.7), profit.Calculate(series, tradingRecord), TaTestsUtils.TaOffset);
        }
示例#28
0
        public void WithConstrainedTimeSeries()
        {
            var sampleSeries  = GenerateTimeSeries.From(new double[] { 1, 1, 1, 1, 1, 10, 5, 6, 1, 1, 1 });
            var subSeries     = sampleSeries.Subseries(4, 8);
            var mdd           = new MaximumDrawdownCriterion();
            var tradingRecord = new TradingRecord(Order.BuyAt(4), Order.SellAt(5), Order.BuyAt(5), Order.SellAt(6), Order.BuyAt(6), Order.SellAt(7), Order.BuyAt(7), Order.SellAt(8));

            Assert.AreEqual(.9d, mdd.Calculate(subSeries, tradingRecord), TaTestsUtils.TaOffset);
        }
        public void CalculateWithTwoTrades()
        {
            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 numberOfTicks = new NumberOfTicksCriterion();

            Assert.AreEqual(6, numberOfTicks.Calculate(series, tradingRecord), TaTestsUtils.TaOffset);
        }
示例#30
0
        public void ReallyLongCashFlow()
        {
            const int  size             = 1000000;
            TimeSeries sampleTimeSeries = GenerateTimeSeries.From(Enumerable.Repeat((Tick)GenerateTick.From(10), size).ToList());
            var        tradingRecord    = new TradingRecord(Order.BuyAt(0), Order.SellAt(size - 1));
            var        cashFlow         = new CashFlow(sampleTimeSeries, tradingRecord);

            TaTestsUtils.AssertDecimalEquals(cashFlow.GetValue(size - 1), 1);
        }