예제 #1
0
        public void WhenPriceGoesUpAndThenDownThenTakesTheMinimumSustainedIncrease()
        {
            var positionAcquired = new PositionAcquired(1.0M);

            stopLossManager.Consume(positionAcquired);

            var priceUpdated = new PriceUpdated {
                Price = 1.5M
            };

            stopLossManager.Consume(priceUpdated);

            priceUpdated = new PriceUpdated {
                Price = 1.2M
            };
            stopLossManager.Consume(priceUpdated);

            bus.Clear();

            priceUpdated = new PriceUpdated {
                Price = 1.5M
            };
            var sendToMeInX = new SendToMeInX <PriceUpdated>(10.0M, priceUpdated);

            stopLossManager.Consume(sendToMeInX);

            var targetUpdated = bus.GetLastMessage <TargetUpdated>();

            Assert.NotNull(targetUpdated);
            Assert.Equal(targetUpdated.TargetPrice, 1.1M);
        }
예제 #2
0
        public void WhenPriceGoesDownAndIsNotSustainedForLongerThan7SecondsThenDoesntTriggerStopLoss()
        {
            var positionAcquired = new PositionAcquired(1.0M);

            stopLossManager.Consume(positionAcquired);

            var priceUpdated = new PriceUpdated {
                Price = 0.89M
            };

            stopLossManager.Consume(priceUpdated);

            var priceUpdated2 = new PriceUpdated {
                Price = 0.91M
            };

            stopLossManager.Consume(priceUpdated2);

            var sendToMeInX = new SendToMeInX <PriceUpdated>(7.0M, priceUpdated);

            stopLossManager.Consume(sendToMeInX);

            var stopLossTriggered = bus.GetLastMessage <StopLossTriggered>();

            Assert.Null(stopLossTriggered);
        }
예제 #3
0
        public void WhenPriceUpdatedAfterThresholdThenTargetUpdatedWithNewPriceWithoutObsoletePricesAffectingIt()
        {
            var positionAcquired = new PositionAcquired(1.0M);

            stopLossManager.Consume(positionAcquired);

            var priceUpdated = new PriceUpdated {
                Price = 1.0M
            };

            stopLossManager.Consume(priceUpdated);

            var priceUpdated2 = new PriceUpdated {
                Price = 1.2M
            };

            stopLossManager.Consume(priceUpdated2);

            bus.Clear();

            stopLossManager.Consume(new SendToMeInX <PriceUpdated>(10.0M, priceUpdated));
            stopLossManager.Consume(new SendToMeInX <PriceUpdated>(10.0M, priceUpdated2));

            var targetUpdated = bus.GetLastMessage <TargetUpdated>();

            Assert.NotNull(targetUpdated);
            Assert.Equal(targetUpdated.TargetPrice, 1.1M);
        }
예제 #4
0
        public void AfterSellingDoesntSellAgain()
        {
            var positionAcquired = new PositionAcquired(1.0M);

            stopLossManager.Consume(positionAcquired);

            var priceUpdated = new PriceUpdated {
                Price = 0.89M
            };

            stopLossManager.Consume(priceUpdated);

            var priceUpdated2 = new PriceUpdated {
                Price = 0.5M
            };

            stopLossManager.Consume(priceUpdated);

            stopLossManager.Consume(new SendToMeInX <PriceUpdated>(7.0M, priceUpdated));

            bus.Clear();
            stopLossManager.Consume(new SendToMeInX <PriceUpdated>(7.0M, priceUpdated2));

            var stopLossTriggered = bus.GetLastMessage <StopLossTriggered>();

            Assert.Null(stopLossTriggered);
        }
예제 #5
0
        public void WhenPriceUpdatedWithinTenSecondsThenRaisesTwoSendInX()
        {
            var positionAcquired = new PositionAcquired(1.0M);

            stopLossManager.Consume(positionAcquired);

            var priceUpdated = new PriceUpdated {
                Price = 1.5M
            };

            stopLossManager.Consume(priceUpdated);

            var events = bus.GetMessages().OfType <SendToMeInX <PriceUpdated> >().ToArray();

            Assert.Equal(events.Length, 2);
            var sendToMeInX1 = events.First();
            var sendToMeInX2 = events.Last();


            Assert.NotNull(sendToMeInX1);
            Assert.Equal(sendToMeInX1.Message, priceUpdated);
            Assert.Equal(sendToMeInX1.X, 10.0M);

            Assert.NotNull(sendToMeInX2);
            Assert.Equal(sendToMeInX2.Message, priceUpdated);
            Assert.Equal(sendToMeInX2.X, 7.0M);
        }
예제 #6
0
        public void WhenPriceNotSustainedForLongerThan10SecondsThenTargetNotUpdated()
        {
            var positionAcquired = new PositionAcquired(1.0M);

            stopLossManager.Consume(positionAcquired);

            var priceUpdated = new PriceUpdated {
                Price = 0.8M
            };

            stopLossManager.Consume(priceUpdated);

            bus.Clear();

            priceUpdated = new PriceUpdated {
                Price = 1.5M
            };
            var sendToMeInX = new SendToMeInX <PriceUpdated>(10.0M, priceUpdated);

            stopLossManager.Consume(sendToMeInX);

            var targetUpdated = bus.GetLastMessage <TargetUpdated>();

            Assert.Null(targetUpdated);
        }
예제 #7
0
        public void WhenPositionAcquiredThenTargetUpdated()
        {
            var  positionAcquired = new PositionAcquired(1.0M);
            stopLossManager.Consume(positionAcquired);

            var events = bus.GetMessages();
            var targetUpdated = events.First() as TargetUpdated;
            Assert.That(targetUpdated, Is.Not.Null, "Should be TargetUpdated");
            Assert.That(targetUpdated.TargetPrice, Is.EqualTo(0.9M));
        }
예제 #8
0
        public void WhenPositionAcquiredThenTargetUpdated()
        {
            var positionAcquired = new PositionAcquired(1.0M);

            stopLossManager.Consume(positionAcquired);

            var events        = bus.GetMessages();
            var targetUpdated = events.First() as TargetUpdated;

            Assert.That(targetUpdated, Is.Not.Null, "Should be TargetUpdated");
            Assert.That(targetUpdated.TargetPrice, Is.EqualTo(0.9M));
        }
예제 #9
0
        public void WhenPositionAcquiredThenTargetUpdated()
        {
            var positionAcquired = new PositionAcquired(1.0M);

            stopLossManager.Consume(positionAcquired);

            var events        = bus.GetMessages();
            var targetUpdated = events.First() as TargetUpdated;

            Assert.NotNull(targetUpdated);
            Assert.Equal(targetUpdated.TargetPrice, 0.9M);
        }
        public void AquirePosition(PositionAcquired newPosition)
        {
            if (newPosition == null)
            {
                throw new ArgumentNullException("newPosition");
            }

            if (newPosition.Price <= 0)
            {
                throw new ArgumentException("Price must be > 0 (zero)", "newPosition");
            }

            _state = _stateProvider.CalculateState(newPosition.Price, newPosition.Price);
        }
예제 #11
0
        public void WhenPriceSustainedForLongerThan10SecondsThenTargetUpdated()
        {
            var positionAcquired = new PositionAcquired(1.0M);
            stopLossManager.Consume(positionAcquired);

            var priceUpdated = new PriceUpdated { Price = 1.5M };
            stopLossManager.Consume(priceUpdated);
            var sendToMeInX = new SendToMeInX<PriceUpdated>(10.0M, priceUpdated);
            stopLossManager.Consume(sendToMeInX);

            var targetUpdated = bus.GetLastMessage<TargetUpdated>();

            Assert.That(targetUpdated, Is.Not.Null);
            Assert.That(targetUpdated.TargetPrice, Is.EqualTo(1.4M));
        }
        public void Handle(PositionAcquired message)
        {
            _price10SecondWindow.Add(message.Price);
            _price13SecondWindow.Add(message.Price);

            UpdateStopLossPrice();
            _publisher.Publish(new SendToMeIn {
                DelayInSeconds = 10, Inner = new RemoveFrom10SecondWindow {
                    Price = message.Price
                }
            });
            _publisher.Publish(new SendToMeIn {
                DelayInSeconds = 13, Inner = new RemoveFrom13SecondWindow {
                    Price = message.Price
                }
            });
        }
예제 #13
0
        public void WhenPriceSustainedForLongerThan10SecondsThenTargetUpdated()
        {
            var positionAcquired = new PositionAcquired(1.0M);

            stopLossManager.Consume(positionAcquired);

            var priceUpdated = new PriceUpdated {
                Price = 1.5M
            };

            stopLossManager.Consume(priceUpdated);
            var sendToMeInX = new SendToMeInX <PriceUpdated>(10.0M, priceUpdated);

            stopLossManager.Consume(sendToMeInX);

            var targetUpdated = bus.GetLastMessage <TargetUpdated>();

            Assert.That(targetUpdated, Is.Not.Null);
            Assert.That(targetUpdated.TargetPrice, Is.EqualTo(1.4M));
        }
예제 #14
0
        public void Handle(PositionAcquired message)
        {
            _possibleStopLossPrices.Add(message.Price);
            _currentPrices.Add(message.Price);

            UpdateStopLossPrice();

            _publisher.Publish(new StopLossPriceUpdated {
                Price = _currentStopLossPrice
            });
            _publisher.Publish(new SendMessageIn {
                MessageToSend = new PriceExpiredFromStopLossWindow {
                    Price = message.Price
                }
            });
            _publisher.Publish(new SendMessageIn {
                MessageToSend = new PriceExpiredFromStopLossHitWindow {
                    Price = message.Price
                }
            });
        }
예제 #15
0
        public void WhenPriceUpdatedWithinTenSecondsThenRaisesTwoSendInX()
        {
            var positionAcquired = new PositionAcquired(1.0M);
            stopLossManager.Consume(positionAcquired);

            var priceUpdated = new PriceUpdated {Price = 1.5M};
            stopLossManager.Consume(priceUpdated);

            var events = bus.GetMessages().OfType<SendToMeInX<PriceUpdated>>().ToArray();
            Assert.That(events, Has.Length.EqualTo(2));
            var sendToMeInX1 = events.First();
            var sendToMeInX2 = events.Last();


            Assert.That(sendToMeInX1, Is.Not.Null);
            Assert.That(sendToMeInX1.Message, Is.EqualTo(priceUpdated));
            Assert.That(sendToMeInX1.X, Is.EqualTo(10.0M));

            Assert.That(sendToMeInX2, Is.Not.Null);
            Assert.That(sendToMeInX2.Message, Is.EqualTo(priceUpdated));
            Assert.That(sendToMeInX2.X, Is.EqualTo(7.0M));
        }
예제 #16
0
        public void WhenPriceGoesUpAndThenDownThenTakesTheMinimumSustainedIncrease()
        {
            var positionAcquired = new PositionAcquired(1.0M);
            stopLossManager.Consume(positionAcquired);

            var priceUpdated = new PriceUpdated { Price = 1.5M };
            stopLossManager.Consume(priceUpdated);

            priceUpdated = new PriceUpdated { Price = 1.2M };
            stopLossManager.Consume(priceUpdated);

            bus.Clear();

            priceUpdated = new PriceUpdated { Price = 1.5M };
            var sendToMeInX = new SendToMeInX<PriceUpdated>(10.0M, priceUpdated);
            stopLossManager.Consume(sendToMeInX);

            var targetUpdated = bus.GetLastMessage<TargetUpdated>();

            Assert.That(targetUpdated, Is.Not.Null);
            Assert.That(targetUpdated.TargetPrice, Is.EqualTo(1.1M));
        }
예제 #17
0
        public void WhenPriceGoesDownAndIsNotSustainedForLongerThan7SecondsThenDoesntTriggerStopLoss()
        {
            var positionAcquired = new PositionAcquired(1.0M);
            stopLossManager.Consume(positionAcquired);

            var priceUpdated = new PriceUpdated { Price = 0.89M };
            stopLossManager.Consume(priceUpdated);

            var priceUpdated2 = new PriceUpdated { Price = 0.91M };
            stopLossManager.Consume(priceUpdated2);

            var sendToMeInX = new SendToMeInX<PriceUpdated>(7.0M, priceUpdated);
            stopLossManager.Consume(sendToMeInX);

            var stopLossTriggered = bus.GetLastMessage<StopLossTriggered>();

            Assert.That(stopLossTriggered, Is.Null);
        }
예제 #18
0
        public void WhenPriceUpdatedAfterThresholdThenTargetUpdatedWithNewPriceWithoutObsoletePricesAffectingIt()
        {
            var positionAcquired = new PositionAcquired(1.0M);
            stopLossManager.Consume(positionAcquired);

            var priceUpdated = new PriceUpdated { Price = 1.0M };
            stopLossManager.Consume(priceUpdated);

            var priceUpdated2 = new PriceUpdated { Price = 1.2M };
            stopLossManager.Consume(priceUpdated2);

            bus.Clear();

            stopLossManager.Consume(new SendToMeInX<PriceUpdated>(10.0M, priceUpdated));
            stopLossManager.Consume(new SendToMeInX<PriceUpdated>(10.0M, priceUpdated2));

            var targetUpdated = bus.GetLastMessage<TargetUpdated>();

            Assert.That(targetUpdated, Is.Not.Null);
            Assert.That(targetUpdated.TargetPrice, Is.EqualTo(1.1M));
        }
예제 #19
0
        public void AfterSellingDoesntSellAgain()
        {
            var positionAcquired = new PositionAcquired(1.0M);
            stopLossManager.Consume(positionAcquired);

            var priceUpdated = new PriceUpdated { Price = 0.89M };
            stopLossManager.Consume(priceUpdated);

            var priceUpdated2 = new PriceUpdated { Price = 0.5M };
            stopLossManager.Consume(priceUpdated);

            stopLossManager.Consume(new SendToMeInX<PriceUpdated>(7.0M, priceUpdated));

            bus.Clear();
            stopLossManager.Consume(new SendToMeInX<PriceUpdated>(7.0M, priceUpdated2));

            var stopLossTriggered = bus.GetLastMessage<StopLossTriggered>();

            Assert.That(stopLossTriggered, Is.Null);
        }