Esempio n. 1
0
        public virtual int CompareTo(object obj)
        {
            QueueEntry queueEntry = obj as QueueEntry;

            if (this.Object.DateTime > queueEntry.Object.DateTime)
            {
                return(1);
            }
            if (this.Object.DateTime < queueEntry.Object.DateTime)
            {
                return(-1);
            }
            return(0);
        }
        private void InsertEntry(ArrayList queue, QueueEntry entry)
        {
            if (queue.Count == 0)
            {
                queue.Add(entry);
                return;
            }
            bool flag = entry is QueueEntry2;
            int  num  = entry.CompareTo(queue[0]);

            if (num < 0 || (num == 0 && flag))
            {
                queue.Insert(0, entry);
                return;
            }
            num = entry.CompareTo(queue[queue.Count - 1]);
            if (num > 0 || (num == 0 && !flag))
            {
                queue.Add(entry);
                return;
            }
            DateTime dateTime = entry.Object.DateTime;
            int      num2     = 0;
            int      num3     = queue.Count - 1;
            int      num4;

            while (true)
            {
                num4 = (num3 + num2) / 2;
                DateTime dateTime2 = (queue[num4] as QueueEntry).Object.DateTime;
                DateTime dateTime3 = (queue[num4 + 1] as QueueEntry).Object.DateTime;
                if (flag)
                {
                    if (dateTime2 < dateTime && dateTime <= dateTime3)
                    {
                        break;
                    }
                    if (dateTime > dateTime3)
                    {
                        num2 = num4 + 1;
                    }
                    else
                    {
                        if (dateTime <= dateTime2)
                        {
                            num3 = num4;
                        }
                    }
                }
                else
                {
                    if (dateTime2 <= dateTime && dateTime < dateTime3)
                    {
                        break;
                    }
                    if (dateTime >= dateTime3)
                    {
                        num2 = num4 + 1;
                    }
                    else
                    {
                        if (dateTime < dateTime2)
                        {
                            num3 = num4;
                        }
                    }
                }
            }
            queue.Insert(num4 + 1, entry);
        }
        private void Run()
        {
            try
            {
                Clock.ClockMode = ClockMode.Simulation;
                this.state      = SimulatorState.Running;
                this.EmitStateChanged();
                this.EmitEnterSimulationEvent();
                foreach (Interval interval in this.intervals)
                {
                    if (!this.doWork)
                    {
                        break;
                    }
                    Clock.SetDateTime(interval.Begin);
                    this.EmitEnterIntervalEvent(interval);
                    ArrayList arrayList = new ArrayList();
                    this.objectsInInterval = 0;
                    foreach (IDataSeries dataSeries in new ArrayList(this.inputSeries))
                    {
                        int num  = dataSeries.IndexOf(interval.Begin, SearchOption.Next);
                        int num2 = dataSeries.IndexOf(interval.End.AddMilliseconds(1.0), SearchOption.Prev);
                        if (num != -1 && num <= num2)
                        {
                            QueueEntry queueEntry = new QueueEntry();
                            queueEntry.Series          = dataSeries;
                            queueEntry.Object          = (dataSeries[num] as IDataObject);
                            queueEntry.CurrentPosition = num + 1;
                            queueEntry.EndPosition     = num2;
                            arrayList.Add(queueEntry);
                            int num3 = (queueEntry.Object is Bar) ? 2 : 1;
                            this.objectsInInterval += (num2 - num + 1) * num3;
                        }
                    }
                    if (arrayList.Count > 0)
                    {
                        arrayList.Sort();
                        DateTime dateTime  = (arrayList[0] as QueueEntry).Object.DateTime;
                        DateTime dateTime2 = (this.simulationMode == SimulationMode.MaxSpeed) ? interval.End.AddYears(1) : dateTime;
                        DateTime dateTime3 = (this.step == 0) ? DateTime.MaxValue : dateTime.AddSeconds((double)this.step);
                        DateTime d         = DateTime.Now;
                        DateTime dateTime4 = dateTime2;
                        while (arrayList.Count > 0 && this.doWork)
                        {
                            while (true)
                            {
                                if (this.doPause)
                                {
                                    this.state = SimulatorState.Paused;
                                    this.EmitStateChanged();
                                    DateTime now = DateTime.Now;
                                    while (this.doPause)
                                    {
                                        Thread.Sleep(1);
                                    }
                                    DateTime now2 = DateTime.Now;
                                    if (this.doWork)
                                    {
                                        if (this.simulationMode == SimulationMode.UserDefinedSpeed)
                                        {
                                            d = d.AddTicks(now2.Ticks - now.Ticks);
                                        }
                                        if (this.simulationMode == SimulationMode.MaxSpeed && dateTime3 < Clock.Now)
                                        {
                                            dateTime3 = Clock.Now.AddSeconds((double)this.step);
                                        }
                                        this.state = SimulatorState.Running;
                                        this.EmitStateChanged();
                                    }
                                }
                                if (!this.doWork)
                                {
                                    break;
                                }
                                bool       flag        = false;
                                QueueEntry queueEntry2 = arrayList[0] as QueueEntry;
                                if ((this.simulationMode != SimulationMode.UserDefinedSpeed || !(dateTime2 >= dateTime3)) && (this.simulationMode != SimulationMode.MaxSpeed || !(queueEntry2.Object.DateTime >= dateTime3)))
                                {
                                    goto IL_2D9;
                                }
                                dateTime3 = dateTime3.AddSeconds((double)this.step);
                                if (!this.stepEnabled)
                                {
                                    goto IL_2D9;
                                }
                                this.doPause = true;
                                flag         = true;
IL_4FA:
                                if (!flag)
                                {
                                    break;
                                }
                                continue;
IL_2D9:
                                if (dateTime2 >= queueEntry2.Object.DateTime)
                                {
                                    arrayList.RemoveAt(0);
                                    if (queueEntry2.Object is Bar || queueEntry2.Object is BarObject)
                                    {
                                        if (queueEntry2 is QueueEntry2)
                                        {
                                            BarObject   barObject   = queueEntry2.Object as BarObject;
                                            QueueEntry2 queueEntry3 = queueEntry2 as QueueEntry2;
                                            queueEntry3.Bar.High       = barObject.Bar.High;
                                            queueEntry3.Bar.Low        = barObject.Bar.Low;
                                            queueEntry3.Bar.Close      = barObject.Bar.Close;
                                            queueEntry3.Bar.Volume     = barObject.Bar.Volume;
                                            queueEntry3.Bar.OpenInt    = barObject.Bar.OpenInt;
                                            queueEntry3.Bar.EndTime    = barObject.Bar.EndTime;
                                            queueEntry3.Bar.IsComplete = true;
                                            queueEntry3.Object         = queueEntry3.Bar;
                                        }
                                        else
                                        {
                                            Bar         bar         = queueEntry2.Object as Bar;
                                            QueueEntry2 queueEntry4 = new QueueEntry2
                                            {
                                                Bar             = bar,
                                                Series          = queueEntry2.Series,
                                                Object          = new BarObject(bar),
                                                CurrentPosition = 1,
                                                EndPosition     = 0
                                            };
                                            queueEntry4.Object.DateTime = bar.EndTime;
                                            this.InsertEntry(arrayList, queueEntry4);

                                            bar.High       = bar.Open;
                                            bar.Low        = bar.Open;
                                            bar.Close      = bar.Open;
                                            bar.Volume     = 0L;
                                            bar.OpenInt    = 0L;
                                            bar.IsComplete = false;
                                        }
                                    }
                                    this.EmitNewObject(queueEntry2.Series, queueEntry2.Object);
                                    if (queueEntry2.CurrentPosition <= queueEntry2.EndPosition)
                                    {
                                        queueEntry2.Object = (queueEntry2.Series[queueEntry2.CurrentPosition] as IDataObject);
                                        queueEntry2.CurrentPosition++;
                                        this.InsertEntry(arrayList, queueEntry2);
                                    }
                                    flag = (arrayList.Count > 0);
                                    goto IL_4FA;
                                }
                                goto IL_4FA;
                            }
                            if (this.simulationMode == SimulationMode.UserDefinedSpeed)
                            {
                                Clock.SetDateTime(dateTime2);
                                Thread.Sleep(1);
                                DateTime now3 = DateTime.Now;
                                dateTime2 = dateTime4.Add(new TimeSpan((long)((double)(now3 - d).Ticks * this.speedMultiplier)));
                            }
                        }
                    }
                    Clock.FireAllReminders();
                    this.EmitLeaveIntervalEvent(interval);
                }
            }
            finally
            {
                Clock.ClockMode = ClockMode.Realtime;
                this.EmitExitSimulationEvent();
                this.state = SimulatorState.Stopped;
                this.EmitStateChanged();
            }
        }