示例#1
0
        public static ScannerConfig GetOptVolumeMostActiveScannerConfig()
        {
            double[] prices = { 0, 7, 14, 21, 28, 35, 42, 49, 56, 63, 70, 82, 103, 124, 194, 264 };

            var scannerConfig = new ScannerConfig()
            {
                Id        = 1,
                Enable    = true,
                StartTime = Exchange.MarketOpenHour,
                EndTime   = Exchange.MarketCloseHour,
                Frequency = 60
            };

            for (int i = 0; i < prices.Length; i++)
            {
                var parameter = new ScannerParameter()
                {
                    ScanCode     = MostActiveOption,
                    Instrument   = "STK",
                    LocationCode = "STK.US",
                    NumberOfRows = 50,
                    AbovePrice   = prices[i],
                };

                if (i != prices.Length - 1)
                {
                    parameter.BelowPrice = prices[i + 1] + 0.01;
                }

                scannerConfig.Parameters.Add(parameter);
            }

            return(scannerConfig);
        }
        public static ScannerConfig GetConfiguredScannerConfig(int scannerConfigId, string scanCode, TimeSpan startTime, TimeSpan endTime)
        {
            double[] prices = { 0, 7, 14, 21, 28, 35, 42, 49, 56, 63, 70, 82, 103, 124, 194, 264 };

            var scannerConfig = new ScannerConfig()
            {
                Id        = scannerConfigId,
                Enable    = true,
                StartTime = startTime,
                EndTime   = endTime,
                Frequency = 60
            };

            for (int i = 0; i < prices.Length; i++)
            {
                var parameter = new ScannerParameter()
                {
                    ScanCode     = scanCode,
                    Instrument   = "STK",
                    LocationCode = "STK.US",
                    NumberOfRows = 50,
                    AbovePrice   = prices[i],
                };

                if (i != prices.Length - 1)
                {
                    parameter.BelowPrice = prices[i + 1] + 0.01;
                }

                scannerConfig.Parameters.Add(parameter);
            }

            return(scannerConfig);
        }
示例#3
0
        public static Scanner CreateScanner(GridModel grid, ScannerParameter kbScanParams)
        {
            if (!GetScannerActive(grid, kbScanParams))
            {
                logger.Debug("No scanner is created, because it's explicitly deactivated!");
                return(null);
            }

            string type = GetScannerType(grid, kbScanParams);

            try { return(createScanners[type](grid, kbScanParams)); }
            catch (Exception e)
            {
                string msg;
                if (e is KeyNotFoundException)
                {
                    msg = String.Format("Scanner of type '{0}' isn't implemented!", type);
                }
                else
                {
                    msg = "Unrecognized exception occurred while creating scanner!";
                }

                throw new Exception(msg);
            }
        }
示例#4
0
 private static Scanner BuildScanner(GridModel grid, ScannerParameter kbScanParams)
 {
     try { return(ScannerFactory.CreateScanner(grid, kbScanParams)); }
     catch (Exception e)
     {
         logger.Error("Building scanner for grid '{0}' failed!\n{1}", grid.Id, e.Message);
         return(null);
     }
 }
示例#5
0
        private static void GetScanTimes(GridModel grid, ScannerParameter kbScanParams,
                                         out int initialScanDelay, out int postAcceptanceDelay, out int postInputAcceptanceTime, out int scanTime)
        {
            if (InitialScanDelayIsDefined(grid.ScanParams))
            {
                initialScanDelay = grid.ScanParams.InitialScanDelay.Value;
            }
            else if (InitialScanDelayIsDefined(kbScanParams))
            {
                initialScanDelay = kbScanParams.InitialScanDelay.Value;
            }
            else
            {
                initialScanDelay = Config.Scanner.InitialScanDelay;
            }

            if (PostAcceptanceDelayIsDefined(grid.ScanParams))
            {
                postAcceptanceDelay = grid.ScanParams.PostAcceptanceDelay.Value;
            }
            else if (PostAcceptanceDelayIsDefined(kbScanParams))
            {
                postAcceptanceDelay = kbScanParams.PostAcceptanceDelay.Value;
            }
            else
            {
                postAcceptanceDelay = Config.Scanner.PostAcceptanceDelay;
            }

            if (PostInputAcceptanceTimeIsDefined(grid.ScanParams))
            {
                postInputAcceptanceTime = grid.ScanParams.PostInputAcceptanceTime.Value;
            }
            else if (PostInputAcceptanceTimeIsDefined(kbScanParams))
            {
                postInputAcceptanceTime = kbScanParams.PostInputAcceptanceTime.Value;
            }
            else
            {
                postInputAcceptanceTime = Config.Scanner.PostInputAcceptanceTime;
            }

            if (ScanTimeIsDefined(grid.ScanParams))
            {
                scanTime = grid.ScanParams.ScanTime.Value;
            }
            else if (ScanTimeIsDefined(kbScanParams))
            {
                scanTime = kbScanParams.ScanTime.Value;
            }
            else
            {
                scanTime = Config.Scanner.ScanTime;
            }
        }
示例#6
0
        public static ScannerSubscription ToScannerSubscription(this ScannerParameter param)
        {
            var res = new ScannerSubscription();

            if (param.NumberOfRows.HasValue)
            {
                res.NumberOfRows = (int)param.NumberOfRows;
            }
            if (param.AbovePrice.HasValue)
            {
                res.AbovePrice = (double)param.AbovePrice;
            }
            if (param.BelowPrice.HasValue)
            {
                res.BelowPrice = (double)param.BelowPrice;
            }
            if (param.AboveVolume.HasValue)
            {
                res.AboveVolume = (int)param.AboveVolume;
            }
            if (param.AverageOptionVolumeAbove.HasValue)
            {
                res.AverageOptionVolumeAbove = (int)param.AverageOptionVolumeAbove;
            }
            if (param.MarketCapAbove.HasValue)
            {
                res.MarketCapAbove = (double)param.MarketCapAbove;
            }
            if (param.MarketCapBelow.HasValue)
            {
                res.MarketCapBelow = (double)param.MarketCapBelow;
            }
            if (param.CouponRateAbove.HasValue)
            {
                res.CouponRateAbove = (double)param.CouponRateAbove;
            }
            if (param.CouponRateBelow.HasValue)
            {
                res.CouponRateBelow = (double)param.CouponRateBelow;
            }
            res.Instrument          = param.Instrument;
            res.LocationCode        = param.LocationCode;
            res.ScanCode            = param.ScanCode;
            res.MoodyRatingAbove    = param.MoodyRatingAbove;
            res.MoodyRatingBelow    = param.MoodyRatingBelow;
            res.SpRatingAbove       = param.SpRatingAbove;
            res.SpRatingBelow       = param.SpRatingBelow;
            res.MaturityDateAbove   = param.MaturityDateAbove;
            res.MaturityDateBelow   = param.MaturityDateBelow;
            res.ExcludeConvertible  = param.ExcludeConvertible;
            res.ScannerSettingPairs = param.ScannerSettingPairs;
            res.StockTypeFilter     = param.StockTypeFilter;

            return(res);
        }
示例#7
0
        public static Grid BuildGrid(GridModel model, ScannerParameter kbScanParams, GeneralStyle kbStyle)
        {
            InheritStyleTillButtons(model, kbStyle);

            GridStatusImpl status = new GridStatusImpl(model);

            Drawer drawer = BuildDrawer(model, status);

            Scanner scanner = BuildScanner(model, kbScanParams);

            return(new Grid(model, status, drawer, scanner));
        }
示例#8
0
        private static Scanner CreateColumnRowScanner(GridModel grid, ScannerParameter kbScanParams)
        {
            logger.Debug("Creating ColumnRowScanner...");

            int isd, pad, piat, st;

            GetScanTimes(grid, kbScanParams, out isd, out pad, out piat, out st);

            bool top  = GetStartTop(grid, kbScanParams);
            bool left = GetStartLeft(grid, kbScanParams);
            int  lcl  = GetLocalCycleLimit(grid, kbScanParams);

            return(new ColumnRowScanner(grid, isd, pad, piat, st, top, left, lcl));
        }
示例#9
0
        public ScannerRequest(TimeSpan startTime, TimeSpan endTime, int frequency, ScannerParameter parameter, ITimeProvider timeProvider)
        {
            StartTime     = startTime;
            EndTime       = endTime;
            Frequency     = TimeSpan.FromSeconds(frequency);
            Parameter     = parameter;
            _timeProvider = timeProvider;

            _cts           = new CancellationTokenSource();
            _semaphoreSlim = new SemaphoreSlim(0, 1);

            // default
            _previousScanner = new Scanner();
        }
示例#10
0
        private static Scanner CreateTestScanner(GridModel grid, ScannerParameter kbScanParams)
        {
            logger.Debug("Creating TestScanner...");

            int isd, pad, piat, st;

            GetScanTimes(grid, kbScanParams, out isd, out pad, out piat, out st);

            //isd = 0;
            //pad = 0;
            //piat = 0;
            //st = 300;

            return(new TestScanner(grid, isd, pad, piat, st));
        }
        public Task <Scanner> GetScannerAsync(ScannerParameter scannerParameter)
        {
            var ct  = new CancellationTokenSource(DefaultTimeoutMs);
            var res = new TaskCompletionSource <Scanner>();

            ct.Token.Register(() => res.TrySetCanceled(), false);

            var reqId = new Random(DateTime.Now.Millisecond).Next();

            var ibScanner = new Scanner();

            EventHandler <ScannerEventArgs> scanner = (sender, args) =>
            {
                if (args.RequestId != reqId)
                {
                    return;
                }

                ibScanner.Rows.Add(new ScannerRow()
                {
                    Rank = args.Rank, Symbol = args.ContractDetails.Summary.Symbol
                });
            };

            EventHandler <ScannerEndEventArgs> scannerEnd = (sender, args) =>
            {
                if (args.RequestId != reqId)
                {
                    return;
                }
                res.TrySetResult(ibScanner);
            };

            EventDispatcher.Scanner    += scanner;
            EventDispatcher.ScannerEnd += scannerEnd;

            ClientSocket.reqScannerSubscription(reqId, scannerParameter.ToScannerSubscription(), new List <TagValue>());

            res.Task.ContinueWith(x =>
            {
                ClientSocket.cancelScannerSubscription(reqId);
                EventDispatcher.Scanner    -= scanner;
                EventDispatcher.ScannerEnd -= scannerEnd;
            }, TaskContinuationOptions.None);

            return(res.Task);
        }
示例#12
0
        private static bool GetStartLeft(GridModel grid, ScannerParameter kbScanParams)
        {
            bool left;

            if (StartLeftIsDefined(grid.ScanParams))
            {
                left = grid.ScanParams.StartLeft.Value;
            }
            else if (StartLeftIsDefined(kbScanParams))
            {
                left = kbScanParams.StartLeft.Value;
            }
            else
            {
                left = Config.Scanner.StartLeft;
            }

            return(left);
        }
示例#13
0
        private static string GetScannerType(GridModel grid, ScannerParameter kbScanParams)
        {
            string type;

            if (ScannerTypeIsDefined(grid.ScanParams))
            {
                type = grid.ScanParams.ScannerType;
            }
            else if (ScannerTypeIsDefined(kbScanParams))
            {
                type = kbScanParams.ScannerType;
            }
            else
            {
                type = Config.Scanner.ScannerType;
            }

            return(type);
        }
示例#14
0
        private static bool GetScannerActive(GridModel grid, ScannerParameter kbScanParams)
        {
            bool active = false;

            if (ScannerActiveIsDefined(grid.ScanParams))
            {
                active = grid.ScanParams.ScannerActive.Value;
            }
            else if (ScannerActiveIsDefined(kbScanParams))
            {
                active = kbScanParams.ScannerActive.Value;
            }
            else
            {
                active = Config.Scanner.ScannerActive;
            }

            return(active);
        }
示例#15
0
        private static bool GetMoveHorizontal(GridModel grid, ScannerParameter kbScanParams)
        {
            bool hrz;

            if (MoveHorizontalIsDefined(grid.ScanParams))
            {
                hrz = grid.ScanParams.MoveHorizontal.Value;
            }
            else if (MoveHorizontalIsDefined(kbScanParams))
            {
                hrz = kbScanParams.MoveHorizontal.Value;
            }
            else
            {
                hrz = Config.Scanner.MoveHorizontal;
            }

            return(hrz);
        }
示例#16
0
        private static bool GetStartTop(GridModel grid, ScannerParameter kbScanParams)
        {
            bool top;

            if (StartTopIsDefined(grid.ScanParams))
            {
                top = grid.ScanParams.StartTop.Value;
            }
            else if (StartTopIsDefined(kbScanParams))
            {
                top = kbScanParams.StartTop.Value;
            }
            else
            {
                top = Config.Scanner.StartTop;
            }

            return(top);
        }
示例#17
0
        private static Scanner CreateLinearScanner(GridModel grid, ScannerParameter kbScanParams)
        {
            logger.Debug("Creating LinearScanner...");

            int isd, pad, piat, st;

            GetScanTimes(grid, kbScanParams, out isd, out pad, out piat, out st);

            bool top  = GetStartTop(grid, kbScanParams);
            bool left = GetStartLeft(grid, kbScanParams);
            bool hrz  = GetMoveHorizontal(grid, kbScanParams);

            //st = 300;
            //top = false;
            //left = false;
            //hrz = false;

            return(new LinearScanner(grid, isd, pad, piat, st, top, left, hrz));
        }
示例#18
0
        private static int GetLocalCycleLimit(GridModel grid, ScannerParameter kbScanParams)
        {
            int limit;

            if (LocalCycleLimitIsDefined(grid.ScanParams))
            {
                limit = grid.ScanParams.LocalCycleLimit.Value;
            }
            else if (LocalCycleLimitIsDefined(kbScanParams))
            {
                limit = kbScanParams.LocalCycleLimit.Value;
            }
            else
            {
                limit = Config.Scanner.LocalCycleLimit;
            }

            return(limit);
        }
示例#19
0
        public void Whenever_Time_UntilExpiration_Should_Return_BusinessDay_Between_Start_And_End_Time(DateTime now)
        {
            // Arrange
            var startTime        = new TimeSpan(9, 30, 0);
            var endTime          = new TimeSpan(16, 0, 0);
            var frequency        = 60;
            var scannerParameter = new ScannerParameter();
            var timeProvider     = new Mock <ITimeProvider>();

            timeProvider.SetupGet(x => x.Now).Returns(now);

            // Act
            var scannerRequest = new ScannerRequest(startTime, endTime, frequency, scannerParameter, timeProvider.Object);
            var next           = now + scannerRequest.UntilExpiration;

            // Assert
            Assert.True(next.IsBusinessDay());
            Assert.True(next.TimeOfDay >= startTime);
            Assert.True(next.TimeOfDay <= endTime);
        }
示例#20
0
 private static bool StartTopIsDefined(ScannerParameter scanParams)
 {
     return(scanParams != null && scanParams.StartTop.HasValue);
 }
示例#21
0
 private static bool ScannerTypeIsDefined(ScannerParameter scanParams)
 {
     return(!(scanParams == null || String.IsNullOrEmpty(scanParams.ScannerType)));
 }
示例#22
0
 private static bool InitialScanDelayIsDefined(ScannerParameter scanParams)
 {
     return(scanParams != null && scanParams.InitialScanDelay.HasValue);
 }
示例#23
0
 private static bool PostAcceptanceDelayIsDefined(ScannerParameter scanParams)
 {
     return(scanParams != null && scanParams.PostAcceptanceDelay.HasValue);
 }
示例#24
0
 private static bool PostInputAcceptanceTimeIsDefined(ScannerParameter scanParams)
 {
     return(scanParams != null && scanParams.PostInputAcceptanceTime.HasValue);
 }
示例#25
0
 private static bool ScanTimeIsDefined(ScannerParameter scanParams)
 {
     return(scanParams != null && scanParams.ScanTime.HasValue);
 }
示例#26
0
 private static bool LocalCycleLimitIsDefined(ScannerParameter scanParams)
 {
     return(scanParams != null && scanParams.LocalCycleLimit.HasValue);
 }
示例#27
0
 private static bool MoveHorizontalIsDefined(ScannerParameter scanParams)
 {
     return(scanParams != null && scanParams.MoveHorizontal.HasValue);
 }