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(); } }