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); }
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); }
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); }
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); }
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); }
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); }