예제 #1
0
        public virtual void WaitForSinceLastBuyRuleIsSatisfied()
        {
            // Waits for 3 ticks since last buy order
            _rule = new WaitForRule(OrderType.Buy, 3);

            Assert.IsFalse(_rule.IsSatisfied(0, null));
            Assert.IsFalse(_rule.IsSatisfied(1, _tradingRecord));

            _tradingRecord.Enter(10);
            Assert.IsFalse(_rule.IsSatisfied(10, _tradingRecord));
            Assert.IsFalse(_rule.IsSatisfied(11, _tradingRecord));
            Assert.IsFalse(_rule.IsSatisfied(12, _tradingRecord));
            Assert.IsTrue(_rule.IsSatisfied(13, _tradingRecord));
            Assert.IsTrue(_rule.IsSatisfied(14, _tradingRecord));

            _tradingRecord.Exit(15);
            Assert.IsTrue(_rule.IsSatisfied(15, _tradingRecord));
            Assert.IsTrue(_rule.IsSatisfied(16, _tradingRecord));

            _tradingRecord.Enter(17);
            Assert.IsFalse(_rule.IsSatisfied(17, _tradingRecord));
            Assert.IsFalse(_rule.IsSatisfied(18, _tradingRecord));
            Assert.IsFalse(_rule.IsSatisfied(19, _tradingRecord));
            Assert.IsTrue(_rule.IsSatisfied(20, _tradingRecord));
        }
        public override double Calculate(TimeSeries series, Trade trade)
        {
            var fakeRecord = new TradingRecord();

            fakeRecord.Enter(series.Begin);
            fakeRecord.Exit(series.End);

            return(_criterion.Calculate(series, trade) / _criterion.Calculate(series, fakeRecord));
        }
예제 #3
0
        public void DynamicAddTrade()
        {
            var data = new double[] { 2, 1, 3, 5, 6, 3, 20, 20, 3 };

            // We will rely on this being correct as it duplicates tests above...
            TimeSeries confirmedSeries        = GenerateTimeSeries.From(data);
            var        confirmedTradingRecord = new TradingRecord(Order.BuyAt(0), Order.SellAt(2), Order.BuyAt(3), Order.SellAt(4), Order.BuyAt(5), Order.SellAt(6), Order.BuyAt(7), Order.SellAt(8));
            // use these results to check against the dynamically added Trades
            var confirmedCashFlow = new CashFlow(confirmedSeries, confirmedTradingRecord);

            TimeSeries sampleTimeSeries = new TimeSeries();
            var        tradingRecord    = new TradingRecord();
            var        cashFlow         = new CashFlow(sampleTimeSeries, tradingRecord);

            for (var i = 0; i < data.Length; i++)
            {
                sampleTimeSeries.AddTick(GenerateTick.From((new LocalDateTime()).WithMillisOfSecond(i), data[i]));
                switch (i)
                {
                case 0:     // buy
                case 3:     // buy
                case 5:     // buy
                case 7:     // buy
                    tradingRecord.Enter(i);
                    break;

                case 2:     // sell
                case 4:     // sell
                case 6:     // sell
                case 8:     // sell
                    tradingRecord.Exit(i);
                    cashFlow.AddTrade(tradingRecord.LastTrade);
                    break;

                default:
                    // don't do anything
                    break;
                }
            }

            // Check all the data off...
            Assert.Multiple(() =>
            {
                for (var i = 0; i < data.Length; i++)
                {
                    TaTestsUtils.AssertDecimalEquals(cashFlow.GetValue(i), confirmedCashFlow.GetValue(i).ToDouble());
                }
            });
        }
예제 #4
0
        public virtual void IsSatisfied()
        {
            Decimal tradedAmount = Decimal.One;

            // 30% stop-gain
            _rule = new StopGainRule(_closePrice, Decimal.ValueOf("30"));

            Assert.IsFalse(_rule.IsSatisfied(0, null));
            Assert.IsFalse(_rule.IsSatisfied(1, _tradingRecord));

            // Enter at 108
            _tradingRecord.Enter(2, Decimal.ValueOf("108"), tradedAmount);
            Assert.IsFalse(_rule.IsSatisfied(2, _tradingRecord));
            Assert.IsFalse(_rule.IsSatisfied(3, _tradingRecord));
            Assert.IsTrue(_rule.IsSatisfied(4, _tradingRecord));
            // Exit
            _tradingRecord.Exit(5);

            // Enter at 118
            _tradingRecord.Enter(5, Decimal.ValueOf("118"), tradedAmount);
            Assert.IsFalse(_rule.IsSatisfied(5, _tradingRecord));
            Assert.IsTrue(_rule.IsSatisfied(6, _tradingRecord));
            Assert.IsTrue(_rule.IsSatisfied(7, _tradingRecord));
        }
예제 #5
0
        public virtual void IsSatisfied()
        {
            Decimal tradedAmount = Decimal.One;

            // 5% stop-loss
            _rule = new StopLossRule(_closePrice, Decimal.ValueOf("5"));

            Assert.IsFalse(_rule.IsSatisfied(0, null));
            Assert.IsFalse(_rule.IsSatisfied(1, _tradingRecord));

            // Enter at 114
            _tradingRecord.Enter(2, Decimal.ValueOf("114"), tradedAmount);
            Assert.IsFalse(_rule.IsSatisfied(2, _tradingRecord));
            Assert.IsFalse(_rule.IsSatisfied(3, _tradingRecord));
            Assert.IsTrue(_rule.IsSatisfied(4, _tradingRecord));
            // Exit
            _tradingRecord.Exit(5);

            // Enter at 128
            _tradingRecord.Enter(5, Decimal.ValueOf("128"), tradedAmount);
            Assert.IsFalse(_rule.IsSatisfied(5, _tradingRecord));
            Assert.IsTrue(_rule.IsSatisfied(6, _tradingRecord));
            Assert.IsTrue(_rule.IsSatisfied(7, _tradingRecord));
        }