public override MarketEnteringComponentResult CanEnter(ITradingObject tradingObject)
        {
            var result = new MarketEnteringComponentResult();

            var bar = Context.GetBarOfTradingObjectForCurrentPeriod(tradingObject);

            var upShadowPercentage = Math.Abs(bar.LowestPrice - bar.HighestPrice) < 1e-6
                ? 0.0
                : (bar.HighestPrice - bar.ClosePrice) / (bar.HighestPrice - bar.LowestPrice) * 100.0;

            var priceChangePercentage  = _priceChangeMetricProxy.GetMetricValues(tradingObject)[0];
            var volumeChangePercentage = _volumeChangeMetricProxy.GetMetricValues(tradingObject)[0];

            if (priceChangePercentage >= MinPriceChangePercentage &&
                priceChangePercentage <= MaxPriceChangePercentage &&
                volumeChangePercentage >= MinVolumeChangePercentage &&
                volumeChangePercentage <= MaxVolumeChangePercentage &&
                upShadowPercentage <= MaxPercentageOfUpShadow)
            {
                result.Comments = string.Format(
                    "ROC[1]={0:0.000}% VC[{1}]={2:0.000}% UpShadow={3:0.00}%",
                    priceChangePercentage,
                    VolumeLookbackWindow,
                    volumeChangePercentage,
                    upShadowPercentage);

                result.CanEnter = true;
            }

            return(result);
        }
예제 #2
0
        public override MarketEnteringComponentResult CanEnter(ITradingObject tradingObject)
        {
            var result = new MarketEnteringComponentResult();

            var previousDayBarValues = _previousDayBar.GetMetricValues(tradingObject);

            var    todayBar             = Context.GetBarOfTradingObjectForCurrentPeriod(tradingObject);
            double movingAverage        = _movingAverage == null ? 1000000.00 : _movingAverage.GetMetricValues(tradingObject)[0];
            var    previousDayBarLowest = previousDayBarValues[3];
            var    previousDayBarClose  = previousDayBarValues[0];

            if (previousDayBarClose < movingAverage * (100.0 - MinPercentageBelowMovingAverage) / 100.0 && // below average
                todayBar.OpenPrice < previousDayBarLowest * (100.0 - MinPercentageOfGapDown) / 100.0 && // gap down
                todayBar.HighestPrice > previousDayBarLowest    // bounce over last day lowest
                )
            {
                result.Comments = string.Format(
                    "MA[{0}]={1:0.000} Highest:{2:0.000} Open:{3:0.000} LastLowest:{4:0.000}",
                    MovingAveragePeriod,
                    movingAverage,
                    todayBar.HighestPrice,
                    todayBar.OpenPrice,
                    previousDayBarLowest);

                result.CanEnter = true;

                result.Price = new TradingPrice(TradingPricePeriod.CurrentPeriod, TradingPriceOption.CustomPrice, previousDayBarLowest);
            }

            return(result);
        }
예제 #3
0
        public override MarketEnteringComponentResult CanEnter(ITradingObject tradingObject)
        {
            var result = new MarketEnteringComponentResult();

            if (_numberOfValidTradingObjectsInThisPeriod != 0)
            {
                var order = _sorter.LatestOrders[tradingObject.Index];

                var relativeStrength =
                    (double)(_numberOfValidTradingObjectsInThisPeriod - order)
                    / _numberOfValidTradingObjectsInThisPeriod
                    * 100.0;

                if (relativeStrength > RelativeStrengthThreshold)
                {
                    result.Comments = string.Format(
                        "RelativeStrength: {0:0.000}%",
                        relativeStrength);

                    result.CanEnter = true;
                }
            }

            return(result);
        }
예제 #4
0
        public override MarketEnteringComponentResult CanEnter(ITradingObject tradingObject)
        {
            var result = new MarketEnteringComponentResult();

            var longSlope    = _longMetricProxy.GetMetricValues(tradingObject)[0];
            var longDegree   = Math.Atan(longSlope) * 180.0 / Math.PI;
            var middleSlope  = _middleMetricProxy.GetMetricValues(tradingObject)[0];
            var middleDegree = Math.Atan(middleSlope) * 180.0 / Math.PI;
            var shortSlope   = _shortMetricProxy.GetMetricValues(tradingObject)[0];
            var shortDegree  = Math.Atan(shortSlope) * 180.0 / Math.PI;

            if (longDegree > LongDegreeThreshold &&
                middleDegree > MiddleDegreeThreshold &&
                shortDegree > ShortDegreeThreshold)
            {
                result.Comments = string.Format(
                    "LR Degree: L{0:0.000}, M{1:0.000}, S{2:0.000}",
                    longDegree,
                    middleDegree,
                    shortDegree);

                result.CanEnter = true;
            }

            return(result);
        }
        public override MarketEnteringComponentResult CanEnter(ITradingObject tradingObject)
        {
            var result = new MarketEnteringComponentResult();

            if (Context.RelationshipManager == null)
            {
                result.CanEnter = true;

                return(result);
            }

            var blocks = Context.RelationshipManager.GetBlocksForStock(tradingObject.Code);

            // if the stock's blocks has no intersect with blocks in config, we ignore the stock.
            var intersectedBlocks = _blockConfigMap.Keys.Intersect(blocks);

            if (!intersectedBlocks.Any())
            {
                return(result);
            }

            foreach (var block in intersectedBlocks)
            {
                BlockConfig blockConfig = _blockConfigMap[block];

                var upRateFromLowest = GetBlockUpRateFromLowest(block);

                if (upRateFromLowest < blockConfig.MinimumUpRate ||
                    upRateFromLowest > blockConfig.MaximumUpRate)
                {
                    return(result);
                }
            }

            foreach (var block in blocks)
            {
                var indexRateOfChange = _blockToPriceIndexChangeRateMap[block].Value;

                if (indexRateOfChange > MininumRateOfChange)
                {
                    result.Comments = string.Format(
                        "Block {0} price index change rate {1:0.000}",
                        block,
                        indexRateOfChange);

                    result.RelatedObject = new BlockUpRatesFromLowestForCode()
                    {
                        Code = tradingObject.Code,
                        BlockUpRatesFromLowest = blocks.ToDictionary(b => b, b => GetBlockUpRateFromLowest(b))
                    };

                    result.CanEnter = true;
                }
            }

            return(result);
        }
        public override MarketEnteringComponentResult CanEnter(ITradingObject tradingObject)
        {
            var result = new MarketEnteringComponentResult();

            if ((WeekdayMask & (1 << (int)CurrentPeriod.DayOfWeek)) != 0)
            {
                result.Comments = CurrentPeriod.DayOfWeek.ToString();
                result.CanEnter = true;
            }

            return(result);
        }
        public override MarketEnteringComponentResult CanEnter(ITradingObject tradingObject)
        {
            var result = new MarketEnteringComponentResult();

            var metric = (RebreakoutRuntimeMetric)_metricProxy.GetMetric(tradingObject);

            if (metric.Rebreakout)
            {
                result.Comments = string.Format("Rebreakout: {0:0.0000}, Interval: {1}", metric.CurrentHighest, metric.IntervalSinceLastBreakout);
            }

            result.CanEnter = metric.Rebreakout;
            return(result);
        }
        public override MarketEnteringComponentResult CanEnter(ITradingObject tradingObject)
        {
            var result = new MarketEnteringComponentResult();

            int rand = _random.Next(RandomRange);

            if (rand < EnterMarketThreshold)
            {
                result.Comments = string.Format("Random: {0}", rand);
                result.CanEnter = true;
            }

            return(result);
        }
예제 #9
0
        public override MarketEnteringComponentResult CanEnter(ITradingObject tradingObject)
        {
            var result = new MarketEnteringComponentResult();

            var metrics = _trinMetrics[tradingObject.Index];

            bool triggered = true;

            if (TriggeringCondition == 0)
            {
                for (int i = 0; i < metrics.Length; ++i)
                {
                    if (metrics[i] >= Threshold)
                    {
                        triggered = false;
                        break;
                    }
                }
            }
            else
            {
                for (int i = 0; i < metrics.Length; ++i)
                {
                    if (metrics[i] <= Threshold)
                    {
                        triggered = false;
                        break;
                    }
                }
            }

            if (triggered)
            {
                result.Comments = string.Format(
                    "TRIN[{0}][0..{1}] {2} {3:0.000}",
                    TrinWindow,
                    ConsecutivePeriods - 1,
                    TriggeringCondition == 0 ? '<' : '>',
                    Threshold);

                result.CanEnter = true;
            }

            return(result);
        }
        public override MarketEnteringComponentResult CanEnter(ITradingObject tradingObject)
        {
            var result = new MarketEnteringComponentResult();

            var metric = (BreakoutAndReturnRuntimeMetric)_metricProxy.GetMetric(tradingObject);

            if (metric.Triggered)
            {
                result.Comments = string.Format(
                    "Breakout: {0:0.0000}, LowestPrice: {1:0.0000}",
                    metric.LatestBreakoutPrice,
                    metric.LowestPriceAfterBreakout);

                result.CanEnter = true;
            }

            return(result);
        }
        public override MarketEnteringComponentResult CanEnter(ITradingObject tradingObject)
        {
            var result = new MarketEnteringComponentResult();

            if (_trendDetector.HasTrend(tradingObject))
            {
                for (int i = 0; i < _trendDetector.PeriodsCount; ++i)
                {
                    result.Comments += string.Format(
                        "MA[{0}]:{1:0.000} ",
                        _trendDetector.GetPeriod(i),
                        _trendDetector.GetMovingAverage(tradingObject, i));
                }

                result.CanEnter = true;
            }

            return(result);
        }
        public override MarketEnteringComponentResult CanEnter(ITradingObject tradingObject)
        {
            var result = new MarketEnteringComponentResult();

            var metric = (BounceRuntimeMetric)_bounceMetricProxy.GetMetric(tradingObject);

            if (metric.Values[0] > 0.0)
            {
                result.Comments = string.Format(
                    "Lowest:{0:0.000}; Current:{1:0.000}; BouncePercentage:{2:0.000}%",
                    metric.LowestPrice,
                    metric.BouncePrice,
                    metric.BouncePercentage);

                result.CanEnter = true;
            }

            return(result);
        }
예제 #13
0
        public override MarketEnteringComponentResult CanEnter(ITradingObject tradingObject)
        {
            var result = new MarketEnteringComponentResult();

            var previousDayBarValues = _previousDayBar.GetMetricValues(tradingObject);

            var    todayBar             = Context.GetBarOfTradingObjectForCurrentPeriod(tradingObject);
            double movingAverage        = _movingAverage == null ? 1000000.00 : _movingAverage.GetMetricValues(tradingObject)[0];
            var    previousDayBarLowest = previousDayBarValues[3];
            var    lowest   = _lowest == null ? 0.0 : _lowest.GetMetricValues(tradingObject)[0];
            bool   isLowest = _lowest == null ? true : lowest == todayBar.LowestPrice;

            var upShadowPercentage = Math.Abs(todayBar.HighestPrice - todayBar.LowestPrice) < 1e-6
                ? 100.0
                : (todayBar.HighestPrice - todayBar.ClosePrice) / (todayBar.HighestPrice - todayBar.LowestPrice) * 100.0;

            var downShadowPercentage = Math.Abs(todayBar.HighestPrice - todayBar.LowestPrice) < 1e-6
                ? 0.0
                : (todayBar.OpenPrice - todayBar.LowestPrice) / (todayBar.HighestPrice - todayBar.LowestPrice) * 100.0;

            if (todayBar.ClosePrice < movingAverage * (100.0 - MinPercentageBelowMovingAverage) / 100.0 && // below average
                todayBar.OpenPrice < previousDayBarLowest * (100.0 - MinPercentageOfGapDown) / 100.0 && // gap down
                todayBar.ClosePrice > previousDayBarLowest * (100.0 + MinBouncePercentageOverLastLowestPrice) / 100.0 && // bounce over last day
                isLowest &&  // is lowest in recent bars
                upShadowPercentage <= MaxUpShadowPercentage &&
                downShadowPercentage <= MaxDownShadowPercentage
                )
            {
                result.Comments = string.Format(
                    "MA[{0}]={1:0.000} Close:{2:0.000} Open:{3:0.000} LastLowest:{4:0.000} UpShadow%:{5:0.000}% DownShadow%:{6:0.000}%",
                    MovingAveragePeriod,
                    movingAverage,
                    todayBar.ClosePrice,
                    todayBar.OpenPrice,
                    previousDayBarLowest,
                    upShadowPercentage,
                    downShadowPercentage);

                result.CanEnter = true;
            }

            return(result);
        }