Exemple #1
0
        public void UpdateMinMax()
        {
            // Update Min Max
            DerivativeSymbolQuote maxDi = MaxTick.Di;
            DerivativeSymbolQuote minDi = MinTick.Di;

            PercChangeFromMax = 100 * ((StockUtils.GetPriceForAnalysis(CurrTick.Di) - StockUtils.GetPriceForAnalysis(maxDi)) / StockUtils.GetPriceForAnalysis(maxDi));
            PercChangeFromMin = 100 * ((StockUtils.GetPriceForAnalysis(CurrTick.Di) - StockUtils.GetPriceForAnalysis(minDi)) / StockUtils.GetPriceForAnalysis(minDi));

            if (PercChangeFromMax >= 0)
            {
                // New Max
                MaxTick = CurrTick;
            }
            else if (PercChangeFromMin <= 0)
            {
                // New Min
                MinTick = CurrTick;
            }

            // Get trend
            if (Math.Abs(CurrTick.Di.PercChangeFromPrevious) > 1.5)
            {
                DominantDirection = CurrTick.Di.PercChangeFromPrevious > 0 ? MarketDirection.UP : MarketDirection.DOWN;
            }
        }
        public async Task ProcessMarket(string[] stockItems)
        {
            log.LogDebug("Processing market");
            var sentimentTask = await twitterAnalysis.GetTrackingResults(new SentimentRequest(stockItems.Select(item => $"${item}").ToArray()) { Hours = new[] { 24 } }, CancellationToken.None)
                                .ConfigureAwait(false);

            foreach (string stock in stockItems)
            {
                log.LogInformation("Processing {0}", stock);

                PredictionResult result = await instance().Start(stock).ConfigureAwait(false);

                double sellAccuracy = result.Performance.PerClassMatrices[0].Accuracy;
                double buyAccuracy  = result.Performance.PerClassMatrices[1].Accuracy;
                string header       = $"${stock} trading signals ({sellAccuracy * 100:F0}%/{buyAccuracy * 100:F0}%)";
                var    text         = new StringBuilder();

                if (sentimentTask.TryGetValue($"${stock}", out var sentiment))
                {
                    var sentimentValue = sentiment.First();
                    text.AppendFormat(
                        "Average sentiment: {2}{0:F2}({1})\r\n",
                        sentimentValue.Average,
                        sentimentValue.TotalMessages,
                        sentimentValue.GetEmoji());
                }
                else
                {
                    log.LogWarning("Not found sentiment for {0}", stock);
                }

                for (int i = 0; i < result.Predictions.Length || i < 2; i++)
                {
                    MarketDirection prediction = result.Predictions[result.Predictions.Length - i - 1];
                    log.LogInformation("{2}, Predicted T-{0}: {1}\r\n", i, prediction, stock);
                    string icon = prediction == MarketDirection.Buy ? Emoji.CHART_WITH_UPWARDS_TREND.Unicode : Emoji.CHART_WITH_DOWNWARDS_TREND.Unicode;
                    text.AppendFormat("T-{0}: {2}{1}\r\n", i, prediction, icon);
                }

                var message = new MultiItemMessage(header, new[] { text.ToString() });
                publisher.PublishMessage(message);
            }
        }