public void Open__AddsToActive_SubsCash(PositionDir dir, float price, float vol, StockDataRange range, int intradayInterval)
 {
     _testObj.Open(_stock, dir, CurrentTS, price, vol, Commission, range, intradayInterval, EntrySignal);
     _testObj.Cash.ShouldBe(CashValue - _testObj.PositionsActive[0].DirectionMultiplier() * (price * vol) - Commission);
     _testObj.PositionsActive.Count.ShouldBe(1);
     CheckOpenedPosition(_testObj.PositionsActive[0], _stock, dir, price, vol, Commission, CurrentTS, range, intradayInterval);
 }
 private Position CreatePosition(PositionDir dir, float open, float vol) => new Position()
 {
     Stock     = _stock,
     Direction = dir,
     Open      = open,
     Volume    = vol
 };
 private void CheckClosedPosition(int index, PositionDir dir, float open, float close, float vol, float commission, DateTime ts, float prevValueOnPosition)
 {
     _testObj.PositionsClosed[index].Close.ShouldBe(close);
     _testObj.PositionsClosed[index].CloseCommission.ShouldBe(commission);
     _testObj.PositionsClosed[index].TSClose.ShouldBe(ts);
     _testObj.ClosedPositionsEquity[index].Value.ShouldBe(prevValueOnPosition + (close - open) * vol * (dir == PositionDir.Long ? 1 : -1) - commission);
     _testObj.ClosedPositionsEquity[index].TS.ShouldBe(ts);
 }
 public void OnPrice(PositionDir positionDir, float price, bool expected)
 {
     SignalSelector.OnPrice(
         new Signal()
     {
         Type = SignalType.EnterOnPrice, Direction = positionDir, Price = price
     },
         StockPricesDataUtils.CreatePricesData(0, 100, 50, 0),
         0).ShouldBe(expected);
 }
Beispiel #5
0
 public void OnStopHit(PositionDir positionDir, float price, float expected)
 {
     ClosePriceSelector.OnStopHit(
         new Position()
     {
         Direction = positionDir, CloseModePrice = price
     },
         StockPricesDataUtils.CreatePricesData(10, 100, 5, 20),
         0).ShouldBe(expected);
 }
 public void OnPrice(PositionDir positionDir, float price, float expected)
 {
     OpenPriceSelector.OnPrice(
         new Signal()
     {
         Direction = positionDir, Price = price
     },
         StockPricesDataUtils.CreatePricesData(10, 100, 5, 20),
         0).ShouldBe(expected);
 }
 public void Calc_WithActivePosition__ReturnsCashAndPositionValue(PositionDir dir)
 {
     _testSys.PositionsActive.Add(new Position()
     {
         Stock     = new StockDefinition(),
         Direction = dir,
         Volume    = Vol
     });
     _testObj.Calc(_testSys, CurrentTS, _dataLoader).ShouldBe(CashValue + dir.DirectionMultiplier() * PriceL * Vol);
 }
Beispiel #8
0
 public void OnStopHit(PositionDir positionDir, float closeModePrice, bool expected)
 {
     ClosingPositionSelector.OnStopHit(
         new Position()
     {
         Direction = positionDir, CloseMode = PositionCloseMode.OnStopHit, CloseModePrice = closeModePrice
     },
         StockPricesDataUtils.CreatePricesData(0, 100, 50, 0),
         0).ShouldBe(expected);
 }
Beispiel #9
0
 private Signal CreateSignal(PositionDir dir, SystemState systemState, float currentClosePrice) =>
 new Signal()
 {
     Stock            = _stock,
     DataRange        = _dataRange,
     IntradayInterval = 0,
     Type             = SignalType.EnterOnOpen,
     Direction        = dir,
     ReversePosition  = false,
     Volume           = _signalVolumeCalculator.Calculate(systemState, _stock.Type, currentClosePrice)
 };
        public void Close__MovesToClosed_AddsCash_AddsValueOnPosition(PositionDir dir, float open, float close, float vol)
        {
            Position pos = CreatePosition(dir, open, vol);

            _testObj.PositionsActive.Add(pos);
            _testObj.Close(0, CurrentTS, close, Commission);
            _testObj.Cash.ShouldBe(CashValue + pos.DirectionMultiplier() * (close * vol) - Commission);
            _testObj.PositionsActive.Count.ShouldBe(0);
            _testObj.PositionsClosed.Count.ShouldBe(1);
            _testObj.ClosedPositionsEquity.Count.ShouldBe(1);
            CheckClosedPosition(0, dir, open, close, vol, Commission, CurrentTS, 0);
        }
        public void AddToPosition_NewVolNegative__ClosesCurrent(PositionDir dir, float open, float vol, float addPrice, float addVol)
        {
            Position pos = CreatePosition(dir, open, vol);

            _testObj.PositionsActive.Add(pos);
            _testObj.AddToPosition(0, CurrentTS, addPrice, addVol, EntrySignal, _slippage, _commission);
            _testObj.Cash.ShouldBe(CashValue + pos.DirectionMultiplier() * (addPrice * vol) - Commission);
            _testObj.PositionsClosed.Count.ShouldBe(1);
            _testObj.ClosedPositionsEquity.Count.ShouldBe(1);
            CheckClosedPosition(0, dir, open, addPrice, vol, Commission, CurrentTS, 0);
            _testObj.PositionsActive.Count.ShouldBe(0);
        }
 private void CheckOpenedPosition(Position pos, StockDefinition stock, PositionDir dir, float open, float vol, float commission, DateTime ts, StockDataRange range, int interval)
 {
     pos.Stock.ShouldBe(stock);
     pos.Direction.ShouldBe(dir);
     pos.TSOpen.ShouldBe(ts);
     pos.Open.ShouldBe(open);
     pos.OpenCommission.ShouldBe(commission);
     pos.Volume.ShouldBe(vol);
     pos.DataRange.ShouldBe(range);
     pos.IntradayInterval.ShouldBe(interval);
     pos.EntrySignal.ShouldBe(EntrySignal);
 }
        private void ReversePosition(Signal signal, DateTime ts, SystemState systemState, float openPrice)
        {
            PositionDir newPosDir = signal.Direction;
            int         currPos   = FindActivePositionIndex(systemState, signal.Stock);

            if (currPos > -1)
            {
                newPosDir = systemState.PositionsActive[currPos].ReversedDirection();
                systemState.Close(currPos, ts, openPrice, _slippage, _commission);
            }
            systemState.Open(ts, newPosDir, openPrice, signal, _slippage, _commission);
        }
        public void ReducePosition__ClosesCurrent_CreatesNewWithReducedVolume(PositionDir dir, float open, float vol, float reducePrice, float reduceVol)
        {
            Position pos = CreatePosition(dir, open, vol);

            _testObj.PositionsActive.Add(pos);
            _testObj.ReducePosition(0, CurrentTS, reducePrice, reduceVol, EntrySignal, _slippage, _commission);
            _testObj.Cash.ShouldBe(CashValue + pos.DirectionMultiplier() * (reducePrice * reduceVol) - 2 * Commission);
            _testObj.PositionsClosed.Count.ShouldBe(1);
            _testObj.ClosedPositionsEquity.Count.ShouldBe(1);
            CheckClosedPosition(0, dir, open, reducePrice, vol, Commission, CurrentTS, 0);
            _testObj.PositionsActive.Count.ShouldBe(1);
            CheckOpenedPosition(_testObj.PositionsActive[0], _stock, dir, reducePrice, vol - reduceVol, Commission, CurrentTS, StockDataRange.Daily, 0);
        }
        public void Calc_WithTwoActivePositions__ReturnsCashAndPositionsValue(PositionDir dir)
        {
            const int posCount = 2;

            for (int i = 0; i < posCount; i++)
            {
                _testSys.PositionsActive.Add(new Position()
                {
                    Stock     = new StockDefinition(),
                    Direction = dir,
                    Volume    = Vol
                });
            }
            _testObj.Calc(_testSys, CurrentTS, _dataLoader).ShouldBe(CashValue + dir.DirectionMultiplier() * PriceL * Vol * posCount);
        }
Beispiel #16
0
        public static void Open(this SystemState systemState, StockDefinition stock, PositionDir dir, DateTime ts, float price, float volume, float commission, StockDataRange dataRange, int intradayInterval, Signal entrySignal)
        {
            Position pos = new Position
            {
                Stock            = stock,
                DataRange        = dataRange,
                IntradayInterval = intradayInterval,
                Direction        = dir,
                Open             = price,
                OpenCommission   = commission,
                TSOpen           = ts,
                Volume           = volume,
                EntrySignal      = entrySignal,
                TicksActive      = 1
            };

            systemState.PositionsActive.Add(pos);
            systemState.Cash -= pos.DirectionMultiplier() * pos.OpenValue();
            systemState.Cash -= pos.OpenCommission;
        }
Beispiel #17
0
        private static void AddAnnotation(PriceVolumeChart chart, int imageIndex, PositionDir dir, DateTime ts)
        {
            DataPoint dataPoint = chart.PricesCandles.Points.FindByValue(ts.ToOADate(), "X");

            if (dataPoint == null)
            {
                return;
            }

            ImageAnnotation annotation = new ImageAnnotation()
            {
                AnchorDataPoint = dataPoint,
                AnchorY         = dataPoint.YValues[PositionOpenCloseImages.AnnotationAnchorYValueIndex[dir][imageIndex]],
                AnchorAlignment = PositionOpenCloseImages.AnnotationContentAlignment[dir][imageIndex],
                Image           = PositionOpenCloseImages.ImageName[dir][imageIndex],
                AnchorOffsetY   = 2
            };

            chart.PVChartControl.Annotations.Add(annotation);
        }
Beispiel #18
0
 public static float DirectionMultiplier(this PositionDir postionDir)
 {
     return(postionDir == PositionDir.Long ? 1 : -1);
 }
Beispiel #19
0
 public void CalculateOpen__ValueNotChanged(PositionDir dir, float value)
 {
     _testObj.CalculateOpen(StockType.Stock, DateTime.Now, dir, value).ShouldBe(value);
 }
 public float CalculateOpen(StockType stockType, DateTime ts, PositionDir dir, float value)
 {
     return(value);
 }
 public void ReverseDirection(PositionDir dir, PositionDir expected)
 {
     dir.ReverseDirection().ShouldBe(expected);
 }
 public void DirectionMultiplier(PositionDir dir, float expected)
 {
     dir.DirectionMultiplier().ShouldBe(expected);
 }
 public float CalculateOpen(StockType stockType, DateTime ts, PositionDir dir, float value)
 {
     return(_tickAdder.AddTicks(stockType, ts, value, (dir == PositionDir.Long ? 1 : -1) * _ticks));
 }
 public void DirectionMultiplier(PositionDir dir, float expected)
 {
     _testObj.Direction = dir;
     _testObj.DirectionMultiplier().ShouldBe(expected);
 }
 public void ReversedDirection(PositionDir dir, PositionDir expected)
 {
     _testObj.Direction = dir;
     _testObj.ReversedDirection().ShouldBe(expected);
 }
        public void CalculateOpen__ValueChanged(PositionDir dir, float value, int ticks, float expected)
        {
            SlippageTicks testObj = new SlippageTicks(_tickAdder, ticks);

            testObj.CalculateOpen(StockType.Stock, _dt, dir, value).ShouldBe(expected);
        }
Beispiel #27
0
 public static float CalculateSlippageClose(this SystemState systemState, ISlippage slippage, StockType stockType, DateTime ts, PositionDir dir, float price)
 {
     return(slippage.CalculateClose(stockType, ts, dir, price));
 }
Beispiel #28
0
 public static void Open(this SystemState systemState, DateTime ts, PositionDir dir, float price, Signal signal, ISlippage slippage, ICommission commission)
 {
     systemState.Open(ts, dir, price, signal.Volume, signal, slippage, commission);
 }
Beispiel #29
0
        public static void Open(this SystemState systemState, DateTime ts, PositionDir dir, float price, float volume, StockDefinition stock, Signal signal, ISlippage slippage, ICommission commission)
        {
            float openPrice = systemState.CalculateSlippageOpen(slippage, stock.Type, ts, signal.Direction, price);

            systemState.Open(stock, dir, ts, openPrice, volume, systemState.CalculateCommission(commission, stock.Type, signal.Volume, openPrice), signal.DataRange, signal.IntradayInterval, signal);
        }
Beispiel #30
0
 public static PositionDir ReverseDirection(this PositionDir postionDir)
 {
     return(postionDir == PositionDir.Long ? PositionDir.Short : PositionDir.Long);
 }