Beispiel #1
0
        public static Barline CreateBarline(BarlineProperties bi)
        {
            ObjectFactory factory = new ObjectFactory();
            Barline       barline = factory.createBarline();

            //create an ending
            if (bi.EndingValue != "")
            {
                Ending ending = factory.createEnding();
                ending.setType(StartStopDiscontinue.fromValue(bi.EndingType));
                ending.setValue(bi.EndingValue);
                barline.setEnding(ending);
            }

            //create a repeat
            if (bi.RepeatTimes != "")
            {
                Repeat repeat = factory.createRepeat();
                repeat.setTimes(new BigInteger(bi.RepeatTimes));
                repeat.setDirection(BackwardForward.fromValue(bi.RepeatDirection));
                barline.setRepeat(repeat);
            }

            //set bar line location
            if (bi.Location != "")
            {
                barline.setLocation(RightLeftMiddle.fromValue(bi.Location));
            }

            return(barline);
        }
Beispiel #2
0
        public void Add(List <DataType> dataPoints, DateTime?startDate = null, DateTime?endDate = null)
        {
            if (dataPoints == null)
            {
                Debug.WriteLine("MarketSeriesBase Add - NULL dataPoints - FIXME !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); return;
            }
            var lastDataEndDate = this[LastIndex].Time;

            // TODO: Fill range from startDate to endDate with "NoData" and if a range is loaded that creates a gap with existing ranges, fill that with "MissingData"

            //if (bars.Count == 0) return;
            var resultsStartDate = dataPoints.Count == 0 ? default(DateTime) : dataPoints[0].Time;
            var resultsEndDate   = dataPoints.Count == 0 ? default(DateTime) : dataPoints[dataPoints.Count - 1].Time;

            if (!startDate.HasValue)
            {
                startDate = resultsStartDate; Debug.WriteLine("WARN -!startDate.HasValue in MarketSeries.Add");
            }
            if (!endDate.HasValue)
            {
                endDate = resultsEndDate; Debug.WriteLine("WARN -!endDate.HasValue in MarketSeries.Add");
            }

#if DEBUG_BARSCOPIED
            int dataPointsCopied = 0;
#endif

            if (this.Count == 0 && DataEndDate == default(DateTime) && DataStartDate == default(DateTime))
            {
                foreach (var b in dataPoints)
                {
                    Add(b);
                    //Add(b.Time,b.Open,b.High,b.Low,b.Close,b.Volume);
                    //this.openTime.Add(b.Time);
                    //this.open.Add(b.Open);
                    //this.high.Add(b.High);
                    //this.low.Add(b.Low);
                    //this.close.Add(b.Close);
                    //this.tickVolume.Add(b.Volume);
                }
            }
            else
            {
                if (startDate <= DataStartDate) // prepending data
                {
                    int lastIndexToCopy;
                    for (lastIndexToCopy = dataPoints.Count - 1; lastIndexToCopy >= 0 && dataPoints[lastIndexToCopy].Time >= DataStartDate; lastIndexToCopy--)
                    {
                        ;                                                                                                                                        // OPTIMIZE?
                    }
                    for (int dataIndex = OpenTime.Count == 0 ? 0 : OpenTime.FirstIndex - 1; lastIndexToCopy >= 0; dataIndex--, lastIndexToCopy--)
                    {
                        //var bar = bars[lastIndexToCopy] as TimedBar;
                        //if (bar == null)
                        //{
                        //    bar = new TimedBar(bars[lastIndexToCopy]);
                        //}
                        this[dataIndex] = dataPoints[lastIndexToCopy];
#if DEBUG_BARSCOPIED
                        dataPointsCopied++;
#endif
                    }

                    if (DataStartDate != default(DateTime) && endDate.Value + TimeFrame.TimeSpan < DataStartDate)
                    {
                        Debug.WriteLine($"[DATA GAP] endDate: {endDate.Value}, DataStartDate: {DataStartDate}");
                        throw new NotImplementedException("TODO REVIEW this gap length");
                        //AddGap(endDate.Value + TimeFrame.TimeSpan, DataStartDate - TimeSpanApproximation.TimeSpan);
                    }
                }

                // Both above and below may get run

                if (endDate >= DataEndDate) // append data
                {
                    int lastIndexToCopy;
                    for (lastIndexToCopy = 0; lastIndexToCopy < dataPoints.Count && dataPoints[lastIndexToCopy].Time <= DataEndDate; lastIndexToCopy++)
                    {
                        ;                                                                                                                                 // OPTIMIZE?
                    }
                    for (int dataIndex = OpenTime.LastIndex + 1; lastIndexToCopy < dataPoints.Count; dataIndex++, lastIndexToCopy++)
                    {
                        //var bar = bars[lastIndexToCopy] as TimedBar;
                        //if (bar == null)
                        //{
                        //    bar = new TimedBar(bars[lastIndexToCopy]);
                        //}
                        this[dataIndex] = dataPoints[lastIndexToCopy];
#if DEBUG_BARSCOPIED
                        dataPointsCopied++;
#endif
                    }

                    if (DataEndDate != default(DateTime) && startDate.Value - TimeFrame.TimeSpan > DataEndDate)
                    {
                        Debug.WriteLine($"[DATA GAP] startDate: {startDate.Value}, DataEndDate: {DataEndDate}");
                        throw new NotImplementedException("TODO REVIEW this gap length");
                        //AddGap(DataEndDate + TimeFrame.TimeSpan, startDate.Value - TimeSpanApproximation.TimeSpan);
                    }
                }
            }

            var oldEnd   = DataEndDate;
            var oldStart = DataStartDate;
            if (DataEndDate == default(DateTime) || startDate.Value - TimeFrame.TimeSpan <= DataEndDate && endDate.Value > DataEndDate)
            {
                DataEndDate = endDate.Value;
            }
            if (DataStartDate == default(DateTime) || endDate.Value + TimeFrame.TimeSpan >= DataStartDate && startDate.Value < DataStartDate)
            {
                DataStartDate = startDate.Value;
            }

            var addedSpan = this[LastIndex].Time - (lastDataEndDate == default(DateTime) ? this[FirstIndex].Time : lastDataEndDate);
            if (addedSpan > TimeSpan.Zero)
            {
                BackwardForward bf = BackwardForward.None;
                if (oldEnd != DataEndDate)
                {
                    bf |= BackwardForward.Forward;
                }
                if (oldStart != DataStartDate)
                {
                    bf |= BackwardForward.Backward;
                }
                Debug.WriteLine($"[{this}] ADDED DATA: {addedSpan} {bf} ");

                DataAdded?.Invoke(bf);
            }
            //Debug.WriteLine($"[{this} - new range] {DataStartDate} - {DataEndDate} (last data: {this[LastIndex].Time})           (was {oldStart} - {oldEnd} (last data: {lastDataEndDate}))");
#if DEBUG_BARSCOPIED
            Debug.WriteLine($"{SymbolCode}-{TimeFrame.Name} Imported {dataPointsCopied} bars");
#endif
            EraseGap(startDate.Value, endDate.Value);
        }