diff --git a/Algorithm/QCAlgorithm.Indicators.cs b/Algorithm/QCAlgorithm.Indicators.cs index 5a3b41179413..00d605aa9ded 100644 --- a/Algorithm/QCAlgorithm.Indicators.cs +++ b/Algorithm/QCAlgorithm.Indicators.cs @@ -2811,6 +2811,24 @@ public ZeroLagExponentialMovingAverage ZLEMA(Symbol symbol, int period, Resoluti return zeroLagExponentialMovingAverage; } + /// + /// Creates a ZigZag indicator for the specified symbol, with adjustable sensitivity and minimum trend length. + /// + /// The symbol for which to create the ZigZag indicator. + /// The sensitivity for detecting pivots. + /// The minimum number of bars required for a trend before a pivot is confirmed. + /// The resolution + /// Selects a value from the BaseData to send into the indicator, if null defaults to the Value property of BaseData (x => x.Value) + /// The configured ZigZag indicator. + [DocumentationAttribute(Indicators)] + public ZigZag ZZ(Symbol symbol, decimal sensitivity = 0.05m, int minTrendLength = 1, Resolution? resolution = null, Func selector = null) + { + var name = CreateIndicatorName(symbol, $"ZZ({sensitivity},{minTrendLength})", resolution); + var zigZag = new ZigZag(name, sensitivity, minTrendLength); + InitializeIndicator(zigZag, resolution, selector, symbol); + return zigZag; + } + /// /// Creates a new name for an indicator created with the convenience functions (SMA, EMA, ect...) /// diff --git a/Indicators/ZigZag.cs b/Indicators/ZigZag.cs new file mode 100644 index 000000000000..b8e2562bf082 --- /dev/null +++ b/Indicators/ZigZag.cs @@ -0,0 +1,208 @@ +/* + * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals. + * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +using System; +using QuantConnect.Data; +using QuantConnect.Data.Market; + +namespace QuantConnect.Indicators +{ + /// + /// The ZigZag indicator identifies significant turning points in price movements, + /// filtering out noise using a sensitivity threshold and a minimum trend length. + /// It alternates between high and low pivots to determine market trends. + /// + public class ZigZag : BarIndicator, IIndicatorWarmUpPeriodProvider + { + /// + /// The most recent pivot point, represented as a bar of market data. + /// Used as a reference for calculating subsequent pivots. + /// + private IBaseDataBar _lastPivot; + + /// + /// The minimum number of bars required to confirm a valid trend. + /// Ensures that minor fluctuations in price do not create false pivots. + /// + private readonly int _minTrendLength; + + /// + /// The sensitivity threshold for detecting significant price movements. + /// A decimal value between 0 and 1 that determines the percentage change required + /// to recognize a new pivot. + /// + private readonly decimal _sensitivity; + + /// + /// A counter to track the number of bars since the last pivot was identified. + /// Used to enforce the minimum trend length requirement. + /// + private int _count; + + /// + /// Tracks whether the most recent pivot was a low pivot. + /// Used to alternate between identifying high and low pivots. + /// + private bool _lastPivotWasLow; + + /// + /// Stores the most recent high pivot value in the ZigZag calculation. + /// Updated whenever a valid high pivot is identified. + /// + public IndicatorBase HighPivot { get; } + + /// + /// Stores the most recent low pivot value in the ZigZag calculation. + /// Updated whenever a valid low pivot is identified. + /// + public IndicatorBase LowPivot { get; } + + /// + /// Represents the current type of pivot (High or Low) in the ZigZag calculation. + /// The value is updated based on the most recent pivot identified: + /// + public PivotPointType PivotType { get; private set; } + + /// + /// Initializes a new instance of the class with the specified parameters. + /// + /// The name of the indicator. + /// The sensitivity threshold as a decimal value between 0 and 1. + /// The minimum number of bars required to form a valid trend. + public ZigZag(string name, decimal sensitivity = 0.05m, int minTrendLength = 1) : base(name) + { + if (sensitivity <= 0 || sensitivity >= 1) + { + throw new ArgumentException("Sensitivity must be between 0 and 1.", nameof(sensitivity)); + } + + if (minTrendLength < 1) + { + throw new ArgumentException("Minimum trend length must be greater than 0.", nameof(minTrendLength)); + } + HighPivot = new Identity(name + "_HighPivot"); + LowPivot = new Identity(name + "_LowPivot"); + _sensitivity = sensitivity; + _minTrendLength = minTrendLength; + PivotType = PivotPointType.Low; + } + + /// + /// Initializes a new instance of the class using default parameters. + /// + /// The sensitivity threshold as a decimal value between 0 and 1. + /// The minimum number of bars required to form a valid trend. + public ZigZag(decimal sensitivity = 0.05m, int minTrendLength = 1) + : this($"ZZ({sensitivity},{minTrendLength})", sensitivity, minTrendLength) + { + } + + /// + /// Indicates whether the indicator has enough data to produce meaningful output. + /// The indicator is considered "ready" when the number of samples exceeds the minimum trend length. + /// + public override bool IsReady => Samples > _minTrendLength; + + /// + /// Gets the number of periods required for the indicator to warm up. + /// This is equal to the minimum trend length plus one additional bar for initialization. + /// + public int WarmUpPeriod => _minTrendLength + 1; + + /// + /// Computes the next value of the ZigZag indicator based on the input bar. + /// Determines whether the input bar forms a new pivot or updates the current trend. + /// + /// The current bar of market data used for the calculation. + /// + /// The value of the most recent pivot, either a high or low, depending on the current trend. + /// + protected override decimal ComputeNextValue(IBaseDataBar input) + { + if (_lastPivot == null) + { + UpdatePivot(input, true); + return decimal.Zero; + } + + var currentPivot = _lastPivotWasLow ? _lastPivot.Low : _lastPivot.High; + + if (_lastPivotWasLow) + { + if (input.High >= _lastPivot.Low * (1m + _sensitivity) && _count >= _minTrendLength) + { + UpdatePivot(input, false); + currentPivot = HighPivot; + } + else if (input.Low <= _lastPivot.Low) + { + UpdatePivot(input, true); + currentPivot = LowPivot; + } + } + else + { + if (input.Low <= _lastPivot.High * (1m - _sensitivity) && _count >= _minTrendLength) + { + UpdatePivot(input, true); + currentPivot = LowPivot; + } + else if (input.High >= _lastPivot.High) + { + UpdatePivot(input, false); + currentPivot = HighPivot; + } + } + _count++; + return currentPivot; + } + + /// + /// Updates the pivot point based on the given input bar. + /// If a change in trend is detected, the pivot type is switched and the corresponding pivot (high or low) is updated. + /// + /// The current bar of market data used for the update. + /// Indicates whether the trend has reversed. + private void UpdatePivot(IBaseDataBar input, bool pivotDirection) + { + _lastPivot = input; + _count = 0; + if (_lastPivotWasLow == pivotDirection) + { + //Update previous pivot + (_lastPivotWasLow ? LowPivot : HighPivot).Update(input.EndTime, _lastPivotWasLow ? input.Low : input.High); + } + else + { + //Create new pivot + (_lastPivotWasLow ? HighPivot : LowPivot).Update(input.EndTime, _lastPivotWasLow ? input.High : input.Low); + PivotType = _lastPivotWasLow ? PivotPointType.High : PivotPointType.Low; + } + _lastPivotWasLow = pivotDirection; + } + + /// + /// Resets this indicator to its initial state + /// + public override void Reset() + { + _lastPivot = null; + PivotType = PivotPointType.Low; + HighPivot.Reset(); + LowPivot.Reset(); + base.Reset(); + } + } +} diff --git a/Tests/Indicators/ZigZagTests.cs b/Tests/Indicators/ZigZagTests.cs new file mode 100644 index 000000000000..45a11e2b69d0 --- /dev/null +++ b/Tests/Indicators/ZigZagTests.cs @@ -0,0 +1,77 @@ +/* + * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals. + * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +using System; +using NUnit.Framework; +using QuantConnect.Data.Market; +using QuantConnect.Indicators; + +namespace QuantConnect.Tests.Indicators +{ + [TestFixture] + public class ZigZagTests : CommonIndicatorTests + { + protected override IndicatorBase CreateIndicator() + { + return new ZigZag("ZigZag", 0.05m, 10); + } + protected override string TestFileName => "spy_zigzag.csv"; + + protected override string TestColumnName => "zigzag"; + + [Test] + public void HighPivotShouldBeZeroWhenAllValuesAreEqual() + { + var zigzag = new ZigZag("ZigZag", 0.05m, 5); + var date = new DateTime(2024, 12, 2, 12, 0, 0); + + for (int i = 0; i < 10; i++) + { + var data = new TradeBar + { + Symbol = Symbol.Empty, + Time = date, + Open = 5, + Low = 5, + High = 5, + }; + zigzag.Update(data); + } + Assert.AreEqual(0m, zigzag.HighPivot.Current.Value); + } + + [Test] + public void LowPivotReflectsInputWhenValuesAreEqual() + { + var zigzag = new ZigZag("ZigZag", 0.05m, 5); + var date = new DateTime(2024, 12, 2, 12, 0, 0); + var value = 5m; + + for (int i = 0; i < 10; i++) + { + var data = new TradeBar + { + Symbol = Symbol.Empty, + Time = date, + Open = value, + Low = value, + High = value, + }; + zigzag.Update(data); + } + Assert.AreEqual(value, zigzag.LowPivot.Current.Value); + } + } +} \ No newline at end of file diff --git a/Tests/QuantConnect.Tests.csproj b/Tests/QuantConnect.Tests.csproj index c18980710c7a..04d86fb0a8e3 100644 --- a/Tests/QuantConnect.Tests.csproj +++ b/Tests/QuantConnect.Tests.csproj @@ -626,6 +626,9 @@ PreserveNewest + + PreserveNewest + diff --git a/Tests/TestData/spy_zigzag.csv b/Tests/TestData/spy_zigzag.csv new file mode 100644 index 000000000000..10e9c3925c56 --- /dev/null +++ b/Tests/TestData/spy_zigzag.csv @@ -0,0 +1,501 @@ +date,open,high,low,close,volume,zigzag,type +19980102 00:00,973100,975300,965300,973600,2150000,, +19980105 00:00,978400,984400,967800,977500,4030800,, +19980106 00:00,972500,972800,961900,966300,2821800,, +19980107 00:00,960900,965000,952200,964700,5225400,, +19980108 00:00,963100,963100,955000,957800,3249100,, +19980109 00:00,952500,955000,919100,924700,10000200,, +19980112 00:00,911300,941900,909100,940600,11953200,909100,Low +19980113 00:00,946300,956300,942200,952200,5006400,, +19980114 00:00,956900,959700,947200,958100,3738000,, +19980115 00:00,955000,957500,948100,949400,2726400,, +19980116 00:00,962500,966900,956600,962300,4185400,, +19980120 00:00,966900,980000,965000,980000,4373400,, +19980121 00:00,972200,976900,961600,971600,4526300,, +19980122 00:00,961600,968800,958800,963000,4484300,, +19980123 00:00,965000,967800,950000,956600,6231300,, +19980126 00:00,963800,967300,937500,957500,4280800,, +19980127 00:00,958100,980000,956600,970000,6639000,, +19980128 00:00,974100,981100,971700,978800,4089900,, +19980129 00:00,978400,995600,975600,987500,7706300,, +19980130 00:00,987800,989700,980000,983100,3333000,, +19980202 00:00,999100,1005000,997500,1002500,5587200,, +19980203 00:00,1000000,1008100,997200,1006900,2656800,, +19980204 00:00,1002800,1011600,998800,1005900,3283800,, +19980205 00:00,1013100,1015900,1000300,1003800,4970800,, +19980206 00:00,1010000,1015000,1006900,1012800,5531800,, +19980209 00:00,1017200,1017500,1007200,1011400,2277100,, +19980210 00:00,1014400,1024700,1011900,1020500,3624500,, +19980211 00:00,1020900,1031900,1017000,1021300,4020500,, +19980212 00:00,1017200,1029400,1008800,1026600,5102800,, +19980213 00:00,1021900,1029400,1018800,1021600,1889500,, +19980217 00:00,1028100,1030900,1021600,1023400,2945300,, +19980218 00:00,1023100,1034700,1022800,1034100,2919600,, +19980219 00:00,1032500,1034100,1027500,1030000,3330600,, +19980220 00:00,1030800,1037500,1023800,1035600,3594700,, +19980223 00:00,1042500,1042500,1033400,1040000,3131700,, +19980224 00:00,1039100,1040900,1029400,1031900,3241700,, +19980225 00:00,1037500,1048800,1036300,1044800,3348400,, +19980226 00:00,1044400,1051600,1041900,1050600,3604100,, +19980227 00:00,1049700,1055300,1043100,1052000,3335400,, +19980302 00:00,1052500,1057500,1046300,1048100,4126000,, +19980303 00:00,1045300,1054700,1045000,1054100,3177500,, +19980304 00:00,1050900,1054100,1040600,1049700,4395900,, +19980305 00:00,1035000,1044400,1031600,1037500,7153500,, +19980306 00:00,1045600,1058800,1044400,1057500,6702600,, +19980309 00:00,1055300,1062200,1052500,1054400,3282800,, +19980310 00:00,1062200,1068400,1053800,1066600,5582900,, +19980311 00:00,1069700,1073100,1067300,1072500,3426500,, +19980312 00:00,1070900,1075900,1065000,1072500,3057400,, +19980313 00:00,1078400,1080000,1068800,1072200,2743800,, +19980316 00:00,1078400,1082800,1075300,1082500,3073800,, +19980317 00:00,1083100,1085000,1076600,1084700,4577900,, +19980318 00:00,1082500,1089400,1080000,1087800,1820900,, +19980319 00:00,1089700,1093800,1086600,1093400,2450000,, +19980320 00:00,1095600,1101900,1088800,1100000,2828600,, +19980323 00:00,1097200,1103100,1094100,1095000,4383400,, +19980324 00:00,1100600,1108100,1099400,1105900,3293800,, +19980325 00:00,1114100,1115300,1091900,1101900,4484900,, +19980326 00:00,1098800,1107500,1096300,1101300,3319600,, +19980327 00:00,1107500,1107800,1090000,1095300,2512200,, +19980330 00:00,1096300,1100900,1089700,1093400,2776500,, +19980331 00:00,1101600,1111900,1097500,1100900,5726500,, +19980401 00:00,1103100,1110800,1094100,1109800,2828500,, +19980402 00:00,1109400,1122500,1107500,1120300,3947500,, +19980403 00:00,1123400,1128100,1118400,1121900,3726100,, +19980406 00:00,1132500,1133800,1120600,1122500,4029500,, +19980407 00:00,1117500,1119400,1101600,1110000,5200100,, +19980408 00:00,1112200,1112800,1097500,1101300,4762900,, +19980409 00:00,1105600,1112800,1105300,1110000,4367800,, +19980413 00:00,1113800,1113800,1100000,1110000,4216000,, +19980414 00:00,1111300,1117200,1109100,1116900,3219500,, +19980415 00:00,1119700,1121300,1111600,1120200,3811700,, +19980416 00:00,1113100,1115000,1105000,1109100,7242500,, +19980417 00:00,1107200,1124100,1104400,1122200,5414800,, +19980420 00:00,1120000,1125600,1118800,1124100,3606300,, +19980421 00:00,1124400,1131600,1119100,1126300,4573300,, +19980422 00:00,1128800,1134400,1128100,1130000,2288400,1134400,High +19980423 00:00,1126300,1130000,1117500,1120900,4848500,, +19980424 00:00,1117500,1124700,1103400,1108800,11129100,, +19980427 00:00,1093800,1106600,1076300,1085900,14372900,, +19980428 00:00,1097800,1098100,1081300,1086300,6213200,, +19980429 00:00,1090300,1099700,1084400,1095300,7582100,, +19980430 00:00,1105600,1119200,1104100,1114400,8226200,, +19980501 00:00,1117500,1123100,1113100,1121900,3768600,, +19980504 00:00,1127200,1133100,1121600,1122500,4332900,, +19980505 00:00,1120000,1121600,1111300,1116600,4969800,, +19980506 00:00,1121300,1121300,1104700,1105000,5221600,, +19980507 00:00,1105000,1105600,1094100,1095900,6769900,, +19980508 00:00,1100000,1113800,1100000,1110000,7888200,, +19980511 00:00,1115600,1122200,1103800,1108600,6219300,, +19980512 00:00,1108100,1118800,1102500,1116400,5983800,, +19980513 00:00,1120600,1125600,1115900,1120600,4355500,, +19980514 00:00,1115300,1126900,1113400,1119700,4229300,, +19980515 00:00,1120000,1122200,1108100,1110000,6807000,, +19980518 00:00,1107200,1115900,1098300,1108400,4751100,, +19980519 00:00,1110000,1116900,1107800,1110600,5877900,, +19980520 00:00,1120900,1125000,1108800,1122800,5775400,, +19980521 00:00,1123800,1127800,1113100,1116900,6427100,, +19980522 00:00,1117500,1120600,1109400,1111600,4659700,, +19980526 00:00,1120900,1120900,1094400,1095300,6262300,, +19980527 00:00,1093100,1099100,1075800,1096300,10286000,1075800,Low +19980528 00:00,1098800,1103800,1087300,1100000,4778900,, +19980529 00:00,1106300,1108100,1093800,1093800,4583900,, +19980601 00:00,1089700,1102200,1085600,1095000,5829200,, +19980602 00:00,1100000,1103400,1091600,1095900,6477900,, +19980603 00:00,1098800,1101900,1082200,1085000,6262700,, +19980604 00:00,1082500,1100600,1080600,1099100,6317300,, +19980605 00:00,1103800,1118800,1098800,1118100,8140300,, +19980608 00:00,1119400,1124700,1116600,1118800,4056700,, +19980609 00:00,1117200,1124200,1114100,1122800,2680400,, +19980610 00:00,1116300,1130600,1112500,1113800,6336300,, +19980611 00:00,1114400,1118800,1092800,1096600,7897100,, +19980612 00:00,1098800,1104400,1082500,1102500,9700700,, +19980615 00:00,1088100,1099100,1078800,1080000,9754800,, +19980616 00:00,1084100,1091600,1077500,1090600,7245000,, +19980617 00:00,1101600,1117800,1099400,1112500,11964800,, +19980618 00:00,1111900,1114400,1107500,1111600,3749600,, +19980619 00:00,1110600,1112300,1096300,1100300,3538200,, +19980622 00:00,1102500,1110600,1100600,1103800,5357100,, +19980623 00:00,1110900,1121900,1110000,1119700,5205600,, +19980624 00:00,1121600,1136900,1116100,1134700,8222700,, +19980625 00:00,1139100,1144700,1128100,1130000,5837700,, +19980626 00:00,1133100,1138400,1131300,1134100,4753900,, +19980629 00:00,1142500,1146900,1138000,1138900,6537200,, +19980630 00:00,1139100,1141900,1130600,1133600,4126100,, +19980701 00:00,1140600,1149400,1136300,1149400,3241200,, +19980702 00:00,1147200,1148800,1142500,1146300,3432900,, +19980706 00:00,1147800,1158400,1145600,1157800,3042100,, +19980707 00:00,1159800,1161300,1152800,1155600,4847300,, +19980708 00:00,1158800,1169400,1157500,1168100,6773100,, +19980709 00:00,1162800,1167200,1156300,1160000,7258600,, +19980710 00:00,1160300,1169100,1150600,1165300,7739800,, +19980713 00:00,1165600,1168400,1160600,1167500,6846100,, +19980714 00:00,1169400,1181600,1169400,1178100,7119900,, +19980715 00:00,1180600,1182800,1174400,1175600,4908000,, +19980716 00:00,1176900,1185900,1170600,1184400,6239600,, +19980717 00:00,1186300,1190000,1183100,1187500,3478600,, +19980720 00:00,1187500,1192300,1179400,1185000,2238300,, +19980721 00:00,1190000,1190000,1162800,1165300,5107200,, +19980722 00:00,1163400,1195900,1155300,1166300,10611500,1195900,High +19980723 00:00,1163100,1168400,1138800,1141900,14881000,, +19980724 00:00,1149700,1150900,1128800,1141600,11706000,, +19980727 00:00,1136300,1150000,1128400,1149800,9360300,, +19980728 00:00,1144400,1146600,1118800,1133100,13422500,, +19980729 00:00,1137200,1141300,1122500,1126600,6932100,, +19980730 00:00,1136300,1145900,1134100,1143400,6617400,, +19980731 00:00,1143400,1145000,1113100,1120600,7679600,, +19980803 00:00,1117800,1124200,1110300,1113800,10349100,, +19980804 00:00,1122200,1122200,1072500,1076100,14468800,, +19980805 00:00,1079400,1088800,1055900,1081600,21457200,, +19980806 00:00,1081300,1095200,1075600,1090900,13163000,, +19980807 00:00,1096900,1105900,1084700,1090300,11718400,, +19980810 00:00,1087500,1096600,1081900,1085900,6055400,, +19980811 00:00,1067800,1074400,1055000,1070600,14385600,, +19980812 00:00,1077500,1088100,1075000,1085000,10997500,, +19980813 00:00,1088100,1096600,1076300,1076400,8529600,, +19980814 00:00,1083400,1087200,1057800,1064800,7995800,, +19980817 00:00,1060000,1089400,1055000,1085000,11035000,, +19980818 00:00,1090000,1105900,1087800,1102500,7245000,, +19980819 00:00,1110900,1110900,1096300,1100000,6054300,, +19980820 00:00,1096900,1104100,1091600,1092500,7590600,, +19980821 00:00,1081900,1087200,1055000,1083800,16427600,, +19980824 00:00,1092500,1099400,1083100,1090600,7902200,, +19980825 00:00,1103800,1112500,1086400,1095000,9623400,, +19980826 00:00,1082800,1096300,1077500,1085000,9090300,, +19980827 00:00,1070000,1078400,1038900,1042500,24042400,, +19980828 00:00,1049700,1057200,1021600,1030000,23196400,, +19980831 00:00,1037500,1040200,950000,962500,22799800,, +19980901 00:00,960600,1005600,936300,996900,24391500,936300,Low +19980902 00:00,998100,1017500,987800,990000,13984400,, +19980903 00:00,976300,993800,966900,985200,16873300,, +19980904 00:00,994400,998100,957800,976300,16414800,, +19980908 00:00,1008800,1029700,998100,1025900,14307900,, +19980909 00:00,1027500,1031300,1004800,1007500,12026000,, +19980910 00:00,984400,993400,968100,982500,19666100,, +19980911 00:00,981900,1015000,970000,1012500,20203300,, +19980914 00:00,1028800,1044500,1020900,1031600,10318300,, +19980915 00:00,1028800,1043100,1022800,1042000,8166200,, +19980916 00:00,1047500,1052500,1031600,1050000,11125300,, +19980917 00:00,1022500,1030300,1017800,1022300,12549700,, +19980918 00:00,1023800,1024100,1010900,1019700,6667900,, +19980921 00:00,996300,1034100,989400,1021900,8552400,, +19980922 00:00,1035000,1036600,1021600,1030000,7070200,, +19980923 00:00,1038800,1070000,1037800,1066300,12804500,1070000,High +19980924 00:00,1063100,1068100,1032500,1043800,10809300,, +19980925 00:00,1031300,1054200,1026300,1043000,10051500,, +19980928 00:00,1053100,1063100,1042500,1049100,8368600,, +19980929 00:00,1053800,1059400,1033800,1049400,10488400,, +19980930 00:00,1035000,1043100,1013800,1018400,7537300,, +19981001 00:00,1000300,1015500,980900,986300,12833400,, +19981002 00:00,988800,1008800,972200,1003100,14014100,, +19981005 00:00,995900,1000000,963400,990000,12408900,, +19981006 00:00,1007500,1012800,975300,985300,12216900,, +19981007 00:00,986300,1000300,957500,972200,13942400,, +19981008 00:00,945600,967500,922200,962200,20019400,922200,Low +19981009 00:00,970000,995600,940600,986300,11865900,, +19981012 00:00,1006300,1014400,996900,997800,9127600,, +19981013 00:00,995600,1004100,987500,995300,5916200,, +19981014 00:00,989400,1018100,988400,1005000,8056200,, +19981015 00:00,1001300,1072500,999400,1050300,19735400,, +19981016 00:00,1061300,1067500,1050000,1056600,16305900,, +19981019 00:00,1056900,1068100,1055000,1063400,7627400,, +19981020 00:00,1075600,1088000,1060900,1065000,14236900,, +19981021 00:00,1068800,1076300,1058800,1071300,8997900,, +19981022 00:00,1067800,1084700,1061600,1080000,8012900,, +19981023 00:00,1079700,1080000,1067800,1071300,6188800,, +19981026 00:00,1077200,1085600,1067800,1075500,5654900,, +19981027 00:00,1084400,1089700,1062800,1066300,9865800,, +19981028 00:00,1065600,1078100,1060300,1067800,5499700,, +19981029 00:00,1070900,1089700,1066300,1089700,8847200,, +19981030 00:00,1101300,1109100,1095000,1100000,9498800,, +19981102 00:00,1108100,1117500,1101900,1114800,6351000,, +19981103 00:00,1115900,1118100,1107500,1111300,6573900,, +19981104 00:00,1124700,1130900,1110900,1118400,7788100,, +19981105 00:00,1115300,1138100,1111300,1137300,6686200,, +19981106 00:00,1134700,1145000,1133100,1142800,5136100,, +19981109 00:00,1139400,1142500,1125000,1131400,5908800,, +19981110 00:00,1130000,1139400,1125000,1126900,9142100,, +19981111 00:00,1138100,1140600,1118900,1123800,10735000,, +19981112 00:00,1123100,1131300,1116900,1120300,5396300,, +19981113 00:00,1122200,1130600,1121300,1127700,5531900,, +19981116 00:00,1142200,1143600,1128900,1138400,5934200,, +19981117 00:00,1136600,1156300,1130000,1143400,8944500,, +19981118 00:00,1143100,1149400,1135000,1147500,4538000,, +19981119 00:00,1152800,1159100,1146300,1155000,5115600,, +19981120 00:00,1163600,1167500,1158400,1166300,5351500,, +19981123 00:00,1174700,1192200,1171600,1191600,6442400,, +19981124 00:00,1190000,1196600,1184500,1186900,5121600,, +19981125 00:00,1189400,1191900,1181600,1188800,4268500,, +19981127 00:00,1194700,1197200,1190000,1195000,4562000,, +19981130 00:00,1190200,1193800,1166600,1166900,7991700,, +19981201 00:00,1161300,1180300,1152200,1178100,8773600,, +19981202 00:00,1172200,1179100,1160000,1175000,7322100,, +19981203 00:00,1172500,1183100,1151900,1152800,11737800,, +19981204 00:00,1166300,1188800,1155900,1179700,10616800,, +19981207 00:00,1180600,1195300,1180000,1192500,4105700,, +19981208 00:00,1185300,1197500,1175000,1184700,9996400,, +19981209 00:00,1186900,1189700,1178800,1188100,5259600,, +19981210 00:00,1188400,1188400,1167200,1168100,5844400,, +19981211 00:00,1164400,1173400,1155600,1170600,8669100,, +19981214 00:00,1161600,1164100,1139100,1144700,9276400,, +19981215 00:00,1146900,1167500,1145300,1166300,9482100,, +19981216 00:00,1171300,1171300,1157500,1164100,7183500,, +19981217 00:00,1172200,1185600,1170200,1185000,6720200,, +19981218 00:00,1183100,1191300,1178800,1190200,4027900,, +19981221 00:00,1192500,1213400,1190000,1203100,8465700,, +19981222 00:00,1204100,1212200,1191900,1205300,5581100,, +19981223 00:00,1211900,1231900,1208100,1228100,7558200,, +19981224 00:00,1231600,1238800,1222800,1226900,1557500,, +19981228 00:00,1232500,1233100,1220000,1226300,4031000,, +19981229 00:00,1227200,1244400,1221300,1243100,3747300,, +19981230 00:00,1239400,1247500,1230300,1233800,6962800,, +19981231 00:00,1233100,1239400,1224700,1228800,6480500,, +19990104 00:00,1233800,1252200,1217200,1228800,9480700,, +19990105 00:00,1229400,1248800,1229400,1244400,7840800,, +19990106 00:00,1258100,1276300,1257500,1275000,7648500,, +19990107 00:00,1263800,1272200,1257800,1269400,5364300,, +19990108 00:00,1281900,1285000,1259700,1275000,6076900,1285000,High +19990111 00:00,1276900,1276900,1252200,1262800,7455600,, +19990112 00:00,1262200,1262200,1238100,1240000,7434300,, +19990113 00:00,1204100,1251300,1203800,1233100,10563100,, +19990114 00:00,1236300,1239100,1209100,1211600,11370000,, +19990115 00:00,1223800,1247800,1220300,1243100,7757900,, +19990119 00:00,1253000,1274700,1235000,1252800,6270400,, +19990120 00:00,1260900,1279400,1250300,1256300,6222800,, +19990121 00:00,1255800,1258400,1232200,1235900,6408000,, +19990122 00:00,1221300,1238400,1217800,1225600,7249900,, +19990125 00:00,1232800,1240000,1219100,1236300,5008100,, +19990126 00:00,1241300,1257200,1236300,1255000,5893300,, +19990127 00:00,1263800,1266300,1244100,1244700,7089500,, +19990128 00:00,1252500,1269700,1251900,1266600,5763500,, +19990129 00:00,1273400,1283000,1254100,1278800,5990400,, +19990201 00:00,1286900,1286900,1270000,1270900,9098500,, +19990202 00:00,1270800,1272200,1247700,1262800,9197400,, +19990203 00:00,1256900,1279400,1256600,1271900,10155700,, +19990204 00:00,1273800,1275000,1248100,1248400,6727600,, +19990205 00:00,1256600,1256600,1232200,1240000,7444000,, +19990208 00:00,1250900,1250900,1233400,1243800,8364900,, +19990209 00:00,1243800,1245000,1215600,1218600,8502300,, +19990210 00:00,1221300,1230000,1213300,1226900,6492100,, +19990211 00:00,1230600,1256900,1225000,1256900,8880800,, +19990212 00:00,1248100,1255000,1226300,1235000,10496300,, +19990216 00:00,1247500,1256300,1233800,1243800,6590400,, +19990217 00:00,1231900,1253600,1222500,1227500,7447000,, +19990218 00:00,1231900,1243800,1222200,1239400,8844800,, +19990219 00:00,1240000,1257500,1233800,1239400,5219200,, +19990222 00:00,1244400,1277200,1242800,1276900,10212200,, +19990223 00:00,1275900,1285000,1265900,1275000,7631500,, +19990224 00:00,1278400,1288400,1254100,1254100,6777300,, +19990225 00:00,1245300,1252800,1225900,1247500,11219400,, +19990226 00:00,1247500,1248400,1228100,1239100,9233600,, +19990301 00:00,1236600,1243100,1208800,1237800,7594300,1208800,Low +19990302 00:00,1245000,1253100,1223100,1228100,9311200,, +19990303 00:00,1230900,1235600,1217800,1231300,7558900,, +19990304 00:00,1240600,1252300,1232700,1250000,7787300,, +19990305 00:00,1275000,1281300,1259200,1278100,10091200,, +19990308 00:00,1282800,1288000,1272500,1285200,4553000,, +19990309 00:00,1281300,1299400,1274400,1282500,7703600,, +19990310 00:00,1284700,1292200,1277800,1290300,3748200,, +19990311 00:00,1296900,1311900,1288800,1302200,6543200,, +19990312 00:00,1310000,1310300,1292200,1295300,4963300,, +19990315 00:00,1299400,1311900,1295000,1311600,5257400,, +19990316 00:00,1311300,1316600,1304700,1309800,4422900,, +19990317 00:00,1306900,1309400,1296300,1302500,4380300,, +19990318 00:00,1297800,1323400,1297500,1321600,3537400,, +19990319 00:00,1323100,1326300,1298400,1300600,5265200,, +19990322 00:00,1300600,1305900,1294200,1299100,4422000,, +19990323 00:00,1293100,1296300,1257000,1264100,9302400,, +19990324 00:00,1268400,1271600,1256300,1269400,5950500,, +19990325 00:00,1280600,1292500,1277500,1291300,6432000,, +19990326 00:00,1286300,1291300,1277200,1284700,5881500,, +19990329 00:00,1291600,1314400,1291600,1312200,5395500,, +19990330 00:00,1299400,1312200,1295600,1303400,5090200,, +19990331 00:00,1311600,1316100,1284400,1286300,7029600,, +19990401 00:00,1296900,1296900,1281300,1293800,7473900,, +19990405 00:00,1309400,1323800,1302500,1323800,5533700,, +19990406 00:00,1321900,1329800,1311600,1319400,5022000,, +19990407 00:00,1326900,1333800,1313800,1328800,6056300,, +19990408 00:00,1331900,1347800,1322800,1345300,5645500,, +19990409 00:00,1344400,1356900,1335900,1348800,4132000,, +19990412 00:00,1334700,1362500,1332200,1360600,7944600,, +19990413 00:00,1362500,1364700,1340300,1351900,10581100,, +19990414 00:00,1360600,1360600,1326900,1330300,11566600,, +19990415 00:00,1334400,1335600,1310000,1326300,11010600,, +19990416 00:00,1329100,1329100,1311900,1321300,6139800,, +19990419 00:00,1326900,1345300,1283800,1289100,12557100,, +19990420 00:00,1298100,1310300,1288800,1306300,8576400,, +19990421 00:00,1310600,1337800,1257800,1336900,5330700,, +19990422 00:00,1351300,1362500,1343900,1359700,6576600,, +19990423 00:00,1358800,1367500,1350000,1357500,4218900,, +19990426 00:00,1365000,1368100,1354700,1361300,3304000,, +19990427 00:00,1371300,1375000,1358400,1365600,4907600,1375000,High +19990428 00:00,1364400,1372500,1350000,1353400,5446900,, +19990429 00:00,1355600,1360600,1338100,1345600,9593600,, +19990430 00:00,1350900,1356300,1315000,1334700,10538700,, +19990503 00:00,1334400,1357200,1330300,1356300,10658900,, +19990504 00:00,1351300,1358100,1331300,1333100,10221800,, +19990505 00:00,1339400,1350000,1318400,1349700,9747000,, +19990506 00:00,1344400,1351300,1323800,1335000,13134000,, +19990507 00:00,1345000,1349800,1334400,1346300,8344100,, +19990510 00:00,1348400,1357200,1335300,1342200,5372100,, +19990511 00:00,1353100,1368800,1257800,1357200,6679600,, +19990512 00:00,1357500,1372200,1315000,1366300,15070800,, +19990513 00:00,1372500,1380000,1368100,1370200,4174600,, +19990514 00:00,1345600,1362500,1333100,1343000,8210400,, +19990517 00:00,1336300,1344800,1323100,1343100,6277500,, +19990518 00:00,1345300,1349800,1326300,1336300,8114700,, +19990519 00:00,1344700,1348800,1332500,1348100,4273700,, +19990520 00:00,1351300,1355900,1300600,1343100,4349700,, +19990521 00:00,1341300,1346900,1195800,1334200,6117400,1195800,Low +19990524 00:00,1338400,1338400,1303900,1310900,7687100,, +19990525 00:00,1313800,1323400,1286900,1288400,9523800,, +19990526 00:00,1293100,1310000,1280900,1306600,12776900,, +19990527 00:00,1298400,1302800,1280000,1284400,13998900,, +19990528 00:00,1290000,1307500,1285900,1305900,8348100,, +19990601 00:00,1301300,1301600,1283800,1298800,6391500,, +19990602 00:00,1297500,1301900,1206300,1297800,6812100,, +19990603 00:00,1306900,1309100,1297800,1302800,5933500,, +19990604 00:00,1314700,1331900,1309400,1319400,9507800,, +19990607 00:00,1334400,1341900,1329100,1337500,5078600,, +19990608 00:00,1333800,1338000,1315900,1321600,5000500,, +19990609 00:00,1324100,1330900,1318100,1321600,7428700,, +19990610 00:00,1314400,1315000,1295900,1309100,6785900,, +19990611 00:00,1312200,1322200,1290900,1298100,12587100,, +19990614 00:00,1306900,1307500,1295500,1297800,6542000,, +19990615 00:00,1304700,1316600,1300800,1305900,5438900,, +19990616 00:00,1323800,1338800,1321600,1334800,7562200,, +19990617 00:00,1328800,1355600,1326300,1346600,8476400,, +19990618 00:00,1340600,1346900,1333800,1343100,2601000,, +19990621 00:00,1344700,1350000,1336600,1349400,4452000,, +19990622 00:00,1340000,1351900,1333400,1337000,5603600,, +19990623 00:00,1330000,1336300,1321300,1332800,9474700,, +19990624 00:00,1328800,1338100,1306600,1316900,9029400,, +19990625 00:00,1325900,1330200,1312500,1316600,3966300,, +19990628 00:00,1326900,1336300,1324700,1333800,5175700,, +19990629 00:00,1330000,1351300,1327800,1351300,6514400,, +19990630 00:00,1346300,1375000,1338400,1367500,16362400,, +19990701 00:00,1370000,1385000,1360600,1380600,9586200,, +19990702 00:00,1381300,1393000,1379100,1391900,3637300,, +19990706 00:00,1392500,1407500,1385900,1387200,10954800,, +19990707 00:00,1390600,1397200,1385200,1395600,3052600,, +19990708 00:00,1390600,1406300,1387500,1395600,7133500,, +19990709 00:00,1400000,1404700,1393800,1402200,2770400,, +19990712 00:00,1409400,1409400,1395000,1400600,4233900,, +19990713 00:00,1393800,1399200,1386600,1395000,6359600,, +19990714 00:00,1400000,1402200,1387500,1398400,4246900,, +19990715 00:00,1407800,1488800,1403100,1411300,3236000,1488800,High +19990716 00:00,1412500,1421600,1407500,1420000,2078000,, +19990719 00:00,1421900,1422500,1405600,1410000,4029000,, +19990720 00:00,1401300,1404100,1375300,1378000,6843600,, +19990721 00:00,1380900,1389100,1370000,1378800,4599000,, +19990722 00:00,1374400,1380000,1354700,1361400,7580400,, +19990723 00:00,1366600,1370000,1351300,1357500,4432000,, +19990726 00:00,1348800,1361300,1346300,1350000,4026700,, +19990727 00:00,1360000,1372000,1353800,1365000,5722800,, +19990728 00:00,1362500,1373100,1355900,1367300,3803200,, +19990729 00:00,1349400,1352500,1333100,1343800,7638800,, +19990730 00:00,1348100,1353400,1328800,1330900,5569700,, +19990802 00:00,1327500,1347500,1325000,1329400,5783300,, +19990803 00:00,1337200,1338400,1313800,1323600,5268700,, +19990804 00:00,1327200,1338800,1305300,1306900,5986000,, +19990805 00:00,1308800,1317200,1288400,1315600,9910600,, +19990806 00:00,1312200,1320000,1295000,1300600,7129800,, +19990809 00:00,1305900,1318000,1297200,1300500,5162600,, +19990810 00:00,1298800,1301600,1270000,1282200,9971000,1270000,Low +19990811 00:00,1296900,1305300,1286300,1305300,7796900,, +19990812 00:00,1306900,1318100,1300000,1300200,6292100,, +19990813 00:00,1316300,1332500,1311300,1331900,5609100,, +19990816 00:00,1331300,1339700,1322500,1333800,3637600,, +19990817 00:00,1344400,1351600,1331300,1347000,4708500,, +19990818 00:00,1342000,1343800,1334100,1335600,4046500,, +19990819 00:00,1323800,1332300,1316900,1328800,6345700,, +19990820 00:00,1330600,1339100,1326900,1338800,3054700,, +19990823 00:00,1348100,1364500,1346600,1363900,5284900,, +19990824 00:00,1360600,1379700,1353800,1365000,9108100,, +19990825 00:00,1371900,1387800,1279100,1384400,5894000,1387800,High +19990826 00:00,1382800,1384200,1365000,1365000,4057900,, +19990827 00:00,1368800,1370600,1351300,1351600,5935300,, +19990830 00:00,1353400,1355000,1323900,1326600,4286300,, +19990831 00:00,1329400,1337500,1307500,1325000,11968000,, +19990901 00:00,1329400,1335600,1323100,1335600,6137800,, +19990902 00:00,1321300,1326700,1306600,1322500,11370700,, +19990903 00:00,1348800,1362800,1346900,1361900,9796800,, +19990907 00:00,1360600,1366300,1342800,1355200,4507400,, +19990908 00:00,1348400,1360600,1335000,1349100,6999800,, +19990909 00:00,1347500,1352500,1336900,1351300,5950500,, +19990910 00:00,1362500,1363600,1349400,1354500,2671700,, +19990913 00:00,1351300,1354700,1345000,1348100,2130600,, +19990914 00:00,1340600,1345600,1333800,1340600,3558700,, +19990915 00:00,1354400,1354400,1320600,1320800,6522800,, +19990916 00:00,1325000,1328100,1303100,1323800,15114200,, +19990917 00:00,1326300,1339400,1321600,1337200,8371300,, +19990920 00:00,1339400,1340000,1330900,1336300,2602800,, +19990921 00:00,1322500,1324700,1301600,1309100,9018700,, +19990922 00:00,1312500,1318400,1297500,1311600,12758600,, +19990923 00:00,1318100,1342500,1237800,1280000,11455200,1237800,Low +19990924 00:00,1277500,1283800,1263100,1280600,13686000,, +19990927 00:00,1287500,1297500,1282800,1282800,6797200,, +19990928 00:00,1279400,1288100,1255600,1281900,11184900,, +19990929 00:00,1284400,1291300,1267800,1267800,7351000,, +19990930 00:00,1274400,1294400,1269700,1283800,7185300,, +19991001 00:00,1279400,1285600,1266300,1283400,10818900,, +19991004 00:00,1291900,1306300,1287500,1306300,6202900,, +19991005 00:00,1307200,1319700,1286900,1301900,11376700,, +19991006 00:00,1307500,1328100,1306900,1326300,11399000,, +19991007 00:00,1328600,1330000,1315000,1320000,5986000,, +19991008 00:00,1317500,1338800,1312300,1337200,9560400,, +19991011 00:00,1335900,1341300,1333100,1338100,3970800,, +19991012 00:00,1331300,1333100,1311900,1314100,8223800,, +19991013 00:00,1306900,1313100,1282500,1286600,10731100,, +19991014 00:00,1284800,1291900,1267500,1284100,10461400,, +19991015 00:00,1260000,1267500,1245000,1248100,14030700,, +19991018 00:00,1249400,1257500,1234400,1255600,9088500,, +19991019 00:00,1271900,1282500,1259400,1260800,17208700,, +19991020 00:00,1277500,1292500,1271300,1292200,8467400,, +19991021 00:00,1272200,1288800,1266300,1286300,9352900,, +19991022 00:00,1297500,1312200,1295600,1303400,8087900,, +19991025 00:00,1293100,1304700,1287500,1295000,7667400,, +19991026 00:00,1301900,1306900,1281900,1282500,5696200,, +19991027 00:00,1283800,1303100,1282500,1301300,5049600,, +19991028 00:00,1324400,1345000,1321900,1345000,10053700,, +19991029 00:00,1358400,1376900,1357200,1365600,10480000,, +19991101 00:00,1365000,1370000,1356300,1359400,3631400,, +19991102 00:00,1359700,1372500,1347500,1348100,5787700,, +19991103 00:00,1360000,1363800,1351300,1356900,7310900,, +19991104 00:00,1367500,1373600,1357700,1364700,7695600,, +19991105 00:00,1386300,1391100,1367800,1372200,7618700,, +19991108 00:00,1370000,1383800,1367500,1379400,4517900,, +19991109 00:00,1385000,1386900,1362800,1367200,4361300,, +19991110 00:00,1362500,1383900,1360800,1377500,6173600,, +19991111 00:00,1381900,1385600,1374700,1383800,4724400,, +19991112 00:00,1392500,1399700,1371300,1397500,15589200,, +19991115 00:00,1398400,1402500,1394100,1398100,2101000,, +19991116 00:00,1405600,1426300,1400900,1424400,7442900,, +19991117 00:00,1422500,1429400,1413100,1415600,9129600,, +19991118 00:00,1424400,1430000,1416300,1428100,11360400,, +19991119 00:00,1424100,1429700,1420000,1425000,4641100,, +19991122 00:00,1424400,1430000,1415000,1424700,4149600,, +19991123 00:00,1428400,1428400,1400600,1408800,5948300,, +19991124 00:00,1407500,1424400,1400000,1420600,4357200,, +19991126 00:00,1424700,1428800,1412500,1414400,1694900,, +19991129 00:00,1408800,1419200,1404400,1410000,7653200,, +19991130 00:00,1407500,1423100,1390000,1392500,8403900,, +19991201 00:00,1393100,1405000,1390000,1401300,6790400,, +19991202 00:00,1406300,1413600,1403800,1411300,6706200,, +19991203 00:00,1430300,1454100,1430300,1436900,9860300,, +19991206 00:00,1435300,1437200,1422500,1427500,2950200,, +19991207 00:00,1432800,1433100,1413800,1419400,10334900,, +19991208 00:00,1413400,1420600,1406300,1406300,4357000,, +19991209 00:00,1418100,1422200,1393800,1410000,6029100,, +19991210 00:00,1422800,1428100,1408800,1420000,4698200,, +19991213 00:00,1414400,1427200,1412800,1421300,3919800,, +19991214 00:00,1416300,1424800,1406300,1408100,5625700,, +19991215 00:00,1403800,1422000,1400000,1418000,6539200,, +19991216 00:00,1421900,1426600,1411600,1423800,5503200,, +19991217 00:00,1430000,1433100,1420600,1423800,4355000,, +19991220 00:00,1425600,1431900,1410900,1416900,4888100,, +19991221 00:00,1415900,1440600,1413400,1433400,7829500,, +19991222 00:00,1436300,1441900,1429700,1437500,5250700,, +19991223 00:00,1450200,1464400,1449700,1460900,5566200,, +19991227 00:00,1465000,1467800,1450600,1458100,2602500,, \ No newline at end of file