コード例 #1
0
        private void CalculateGaps(Optional <double> previousClose)
        {
            double pc = 0;

            previousClose.IfExistsThen(x =>
            {
                pc = x;
            }).IfEmpty(() =>
            {
                // First candle is only used for gap calculation on new data
                // (when previous close is not passed in) so removed from list
                pc = DailyCandles[0].Close;
                DailyCandles.RemoveAt(0);
            });

            double total = 0;

            foreach (var candle in DailyCandles)
            {
                var gap = new Gap(pc, candle.Open, candle.Date.Date);
                total     += gap.AbsoluteGapPoints;
                candle.Gap = gap;
                pc         = candle.Close;
            }

            _averageGapSize = total / DailyCandles.Count;
        }
コード例 #2
0
 public void ClearData()
 {
     DailyCandles.Clear();
     MinuteData.Clear();
     UnfilledGaps.Clear();
     GapFibRetraceLevels   = NewFibRetraceDictionary();
     GapFibExtensionLevels = NewFibExtensionDictionary();
 }
コード例 #3
0
        public void DeriveDailyFromMinute(Del counter)
        {
            DailyCandles.Clear();

            foreach (var(date, minuteCandles) in MinuteData)
            {
                var    cash          = false;
                double high          = 0;
                var    low           = double.PositiveInfinity;
                double open          = 0;
                double close         = 0;
                double previousClose = 0;

                var length = minuteCandles.Count;
                var i      = 0;

                foreach (var candle in minuteCandles)
                {
                    if (!cash && candle.IsCash)
                    {
                        open = (candle.AskOpen - candle.BidOpen) / 2 + candle.BidOpen;
                        cash = true;
                    }

                    if (candle.AskHigh > high && candle.IsCash)
                    {
                        high = candle.AskHigh;
                    }

                    if (candle.BidLow < low && candle.IsCash)
                    {
                        low = candle.BidLow;
                    }

                    if (cash && !candle.IsCash)
                    {
                        close = previousClose;
                        cash  = false;
                    }

                    previousClose = (candle.AskClose - candle.BidClose) / 2 + candle.BidClose;

                    // Handle cash only list
                    i++;
                    if (i == length && candle.IsCash)
                    {
                        close = (candle.AskClose - candle.BidClose) / 2 + candle.BidClose;
                    }
                }

                if (close != 0)
                {
                    var dailyCandle = new DailyCandle(date, open, high, low, close, 0);
                    DailyCandles.Add(dailyCandle);
                    counter();
                }
            }
        }
コード例 #4
0
        private void GenerateDetails()
        {
            var startDate = DateTime.MinValue;
            var endDate   = DateTime.MaxValue;

            foreach (var dailyCandle in DailyCandles.Where(dailyCandle => MinuteData.ContainsKey(dailyCandle.Date.Date)))
            {
                startDate = dailyCandle.Date;
                break;
            }

            for (var i = DailyCandles.Count - 1; i > 0; i--)
            {
                if (MinuteData.ContainsKey(DailyCandles[i].Date.Date))
                {
                    endDate = DailyCandles[i].Date;
                    break;
                }
            }

            var high     = double.MinValue;
            var low      = double.MaxValue;
            var date     = startDate;
            var highTime = DateTime.MinValue;
            var lowTime  = DateTime.MinValue;

            while (date <= endDate)
            {
                if (MinuteData.TryGetValue(date.Date, out var minuteCandles))
                {
                    foreach (var candle in minuteCandles.Where(candle => candle.IsCash))
                    {
                        if (candle.AskHigh > high)
                        {
                            high     = candle.AskHigh;
                            highTime = candle.DateTime;
                        }

                        if (candle.BidLow < low)
                        {
                            low     = candle.BidLow;
                            lowTime = candle.DateTime;
                        }
                    }
                }

                date = date.AddDays(1);
            }

            var openTime  = new TimeSpan(14, 30, 00);
            var closeTime = new TimeSpan(21, 00, 00);

            if (IsUkData)
            {
                openTime  = new TimeSpan(8, 00, 00);
                closeTime = new TimeSpan(16, 30, 00);
            }

            DataDetails = new DataDetails(startDate, endDate, high, highTime, low, lowTime, _averageGapSize, openTime,
                                          closeTime);
        }