Beispiel #1
0
 public IndicatorEMA(IndicatorWMA indicator)
     : base(indicator.Id, indicator.SignalStock, indicator.Period / 60)
 {
     if (Config.Settings.ContainsKey("TIME_DECAY_FACTOR"))
     {
         _timeDecayWeight = decimal.Parse(Config.Settings["TIME_DECAY_FACTOR"]) / 10.0m;
     }
 }
Beispiel #2
0
 public IndicatorWMA(IndicatorWMA indicator)
     : base(indicator.Id, new List <MarketData> {
     indicator.SignalStock
 })
 {
     _subPeriodSeconds   = indicator.Period;
     _periodMilliSeconds = _subPeriodSeconds * 1000m;
     _timeDecay          = indicator.TimeDecay;
 }
Beispiel #3
0
 public IndicatorCorrelation(string id, IndicatorWMA wma, IndicatorWMA wmaRef, int periodMinutes)
     : base(id, new List <MarketData> {
     wma.SignalStock
 })
 {
     _wma                = wma;
     _wmaRef             = wmaRef;
     _periodSeconds      = periodMinutes * 60;
     _periodMilliSeconds = _periodSeconds * 1000m;
     if (Config.Settings.ContainsKey("TIME_DECAY_FACTOR"))
     {
         _timeDecayWeight = decimal.Parse(Config.Settings["TIME_DECAY_FACTOR"]) / 10.0m;
     }
 }
Beispiel #4
0
 public IndicatorCorrelation(IndicatorWMA wma, IndicatorWMA wmaRef)
     : base("Cor_" + (wma.Period / 60) + "_" + wmaRef.SignalStock.Id + "_" + wma.SignalStock.Id, new List <MarketData> {
     wma.SignalStock
 })
 {
     _wma                = wma;
     _wmaRef             = wmaRef;
     _periodSeconds      = wma.Period;
     _periodMilliSeconds = _periodSeconds * 1000m;
     if (Config.Settings.ContainsKey("TIME_DECAY_FACTOR"))
     {
         _timeDecayWeight = decimal.Parse(Config.Settings["TIME_DECAY_FACTOR"]) / 10.0m;
     }
 }
Beispiel #5
0
        public override void Subscribe(string[] epics, IHandyTableListener tableListener)
        {
            Dictionary <string, List <CqlQuote> > priceData = GetReplayData(epics);

            foreach (var epic in epics)
            {
                // for each quote, associate the observed gains in the near future
                var mktData     = new MarketData(epic);
                var wmaLow      = new IndicatorWMA(mktData, 10);
                var wmaMid      = new IndicatorWMA(mktData, 30);
                var wmaHigh     = new IndicatorWMA(mktData, 90);
                var wmaDailyAvg = new IndicatorLevelMean(mktData);

                foreach (var quote in priceData[epic])
                {
                    mktData.TimeSeries.Add(quote.t, new Price(quote.MidPrice()));
                }
                foreach (var quote in ExpectedIndicatorData[wmaLow.Id])
                {
                    wmaLow.TimeSeries.Add(quote.t, new Price(quote.ScaleValue(0, 1)));
                }
                foreach (var quote in ExpectedIndicatorData[wmaLow.Id])
                {
                    wmaLow.TimeSeries.Add(quote.t, new Price(quote.ScaleValue(0, 1)));
                }

                var expectations     = new Dictionary <DateTime, KeyValuePair <CqlQuote, decimal> >();
                var gainDistribution = new SortedList <int, DateTime>();
                KeyValuePair <int, DateTime> minProfit = new KeyValuePair <int, DateTime>(1000000, DateTime.MinValue);
                KeyValuePair <int, DateTime> maxProfit = new KeyValuePair <int, DateTime>(-1000000, DateTime.MinValue);
                var rnd       = new Random(155);
                var openPrice = priceData[epic][0];
                foreach (var quote in priceData[epic])
                {
                    if (quote.t.TimeOfDay < Config.ParseDateTimeLocal(Config.Settings["TRADING_START_TIME"]).TimeOfDay)
                    {
                        continue;
                    }
                    var futureVal = wmaLow.Average(quote.t.AddMinutes(2));
                    var profit    = (int)Math.Round(futureVal.Mid() - quote.MidPrice());
                    expectations.Add(quote.t, new KeyValuePair <CqlQuote, decimal>(quote, profit));
                    if (gainDistribution.ContainsKey(profit))
                    {
                        if ((quote.t - gainDistribution[profit]).Hours > 3 && (rnd.Next(100) == 0))
                        {
                            gainDistribution[profit] = quote.t;
                        }
                    }
                    else
                    {
                        gainDistribution[profit] = quote.t;
                    }
                    if (profit < minProfit.Key)
                    {
                        minProfit = new KeyValuePair <int, DateTime>(profit, gainDistribution[profit]);
                    }
                    if (profit > maxProfit.Key)
                    {
                        maxProfit = new KeyValuePair <int, DateTime>(profit, gainDistribution[profit]);
                    }
                    quote.b -= openPrice.MidPrice();
                    quote.o -= openPrice.MidPrice();
                }
                int nbPoints  = 10;
                int idxProfit = 0;
                KeyValuePair <int, DateTime> nextProfit = minProfit;
                var selection = new SortedList <DateTime, KeyValuePair <int, CqlQuote> >();
                while (idxProfit++ < nbPoints)
                {
                    PublisherConnection.Instance.Insert(nextProfit.Value, epic, new Value(nextProfit.Key));
                    selection.Add(nextProfit.Value, new KeyValuePair <int, CqlQuote>(nextProfit.Key, expectations[nextProfit.Value].Key));
                    nextProfit = gainDistribution.First(keyVal => keyVal.Key >= ((decimal)minProfit.Key + (decimal)idxProfit * (decimal)(maxProfit.Key - minProfit.Key) / (decimal)nbPoints));
                }
                foreach (var profit in selection)
                {
                    PublisherConnection.Instance.Insert(gainDistribution[profit.Value.Key], wmaLow, wmaLow.Average(gainDistribution[profit.Value.Key]).Mid() - openPrice.MidPrice());
                    PublisherConnection.Instance.Insert(gainDistribution[profit.Value.Key], wmaMid, wmaMid.Average(gainDistribution[profit.Value.Key]).Mid() - openPrice.MidPrice());
                    PublisherConnection.Instance.Insert(gainDistribution[profit.Value.Key], wmaHigh, wmaHigh.Average(gainDistribution[profit.Value.Key]).Mid() - openPrice.MidPrice());
                    PublisherConnection.Instance.Insert(gainDistribution[profit.Value.Key], wmaDailyAvg, wmaDailyAvg.Average().Mid() - openPrice.MidPrice());
                }
                priceData[epic] = selection.Values.Select(keyVal => keyVal.Value).ToList();
            }
            replay(priceData, tableListener);
        }