Free cookie consent management tool by TermsFeed Policy Generator

source: addons/HeuristicLab.DataImporter/HeuristicLab.DataImporter.Command/ChangeColumnGroup/CreateTimeSeriesColumnsCommand.cs @ 16566

Last change on this file since 16566 was 16566, checked in by gkronber, 5 years ago

#2520: updated HeuristicLab.DataImporter addon for new Persistence (introduced in 3.3.16)

File size: 10.1 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System.Collections.Generic;
23using System.Linq;
24using System.Windows.Forms.DataVisualization.Charting;
25using HeuristicLab.DataImporter.Data;
26using HeuristicLab.DataImporter.Data.CommandBase;
27using HeuristicLab.DataImporter.Data.Model;
28using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
29using HEAL.Attic;
30
31namespace HeuristicLab.DataImporter.Command {
32  [StorableType("421841E2-B771-4A53-AEE2-6D8A4B68542D")]
33  [ViewableCommandInfo("Create time series columns", 1, ColumnGroupState.DoubleColumnSelected, "Column Commands",
34    Position = 16, SelectedColumns = 4)]
35  public class CreateTimeSeriesColumnsCommand : ColumnGroupCommandWithAffectedColumnsBase {
36    private int addedColumnsCount;
37    [StorableConstructor]
38    protected CreateTimeSeriesColumnsCommand(bool deserializing) : base(deserializing) { }
39    public CreateTimeSeriesColumnsCommand(DataSet dataSet, string columnGroupName, int[] affectedColumns)
40      : base(dataSet, columnGroupName, affectedColumns) {
41    }
42
43    public override string Description {
44      get { return "Create time series columns"; }
45    }
46
47    public override void Execute() {
48      base.Execute();
49      if (AffectedColumns.Length != 4) throw new CommandExecutionException("The selected columns must include high, low, open, and close price.", this);
50      string[] seriesNames = { "high", "low", "open", "close" };
51      Chart chart1 = new Chart();
52      // Y = high
53      // Y2 = low
54      // Y3 = open
55      // Y4 = close
56      List<DoubleColumn> columns = new List<DoubleColumn>();
57      for (int i = 0; i < 4; i++) {
58        int columnIndex = AffectedColumns[i];
59        DoubleColumn doubleColumn = ColumnGroup.GetColumn(columnIndex) as DoubleColumn;
60        if (doubleColumn == null) throw new CommandExecutionException("The selection column does not contain double columns.", this);
61        columns.Add(doubleColumn);
62      }
63      Series series = new Series();
64      series.ChartArea = "Default";
65      series.ChartType = SeriesChartType.Stock;
66      series.Name = "Input";
67      series.YValuesPerPoint = 4;
68      for (int i = 0; i < columns[0].TotalValuesCount; i++) {
69        DataPoint point = new DataPoint();
70        List<double> values = new List<double>();
71        for (int j = 0; j < 4; j++) {
72          double? v = (double?)columns[j].GetValue(i);
73          if (!v.HasValue) throw new CommandExecutionException("Columns must not contain missing values.", this);
74          values.Add(v.Value);
75        }
76        point.YValues = values.ToArray();
77        series.Points.AddXY(i, values[0]);
78        series.Points[i].YValues[1] = values[1];
79        series.Points[i].YValues[2] = values[2];
80        series.Points[i].YValues[3] = values[3];
81      }
82      chart1.Series.Add(series);
83
84
85      DoubleColumn firstAffectedColumn = (DoubleColumn)ColumnGroup.GetColumn(AffectedColumns[0]);
86      int lastAffectedColumn = AffectedColumns[3];
87
88      // formulas using only the close price
89      FinancialFormula[] formulae = new FinancialFormula[] {
90        FinancialFormula.DetrendedPriceOscillator,
91        FinancialFormula.MovingAverageConvergenceDivergence,
92        FinancialFormula.Performance,
93        FinancialFormula.RateOfChange,
94        FinancialFormula.RelativeStrengthIndex,
95        FinancialFormula.StandardDeviation };
96      int currentColumnIndex = lastAffectedColumn + 1;
97      addedColumnsCount = 0;
98      foreach (var formula in formulae) {
99        chart1.DataManipulator.FinancialFormula(formula, "10", "Input:Y4", "Indicators");
100
101        DoubleColumn newColumn = (DoubleColumn)firstAffectedColumn.CreateCopyOfColumnWithoutValues();
102        newColumn.Name = formula + "(" + firstAffectedColumn.Name + ")";
103        for (int i = 0; i < chart1.Series["Indicators"].Points.First().XValue; i++) {
104          newColumn.AddValue(null);
105        }
106        foreach (var value in chart1.Series["Indicators"].Points) {
107          newColumn.AddValue(value.YValues[0]);
108        }
109        this.ColumnGroup.InsertColumn(currentColumnIndex, newColumn);
110        currentColumnIndex++;
111        addedColumnsCount++;
112      }
113
114      // Formulas with two input value
115      formulae = new FinancialFormula[] {
116        FinancialFormula.MassIndex,
117        FinancialFormula.VolatilityChaikins
118      };
119      foreach (var formula in formulae) {
120        chart1.DataManipulator.FinancialFormula(formula, "20", "Input:Y,Input:Y2", "Indicators");
121
122        DoubleColumn newColumn = (DoubleColumn)firstAffectedColumn.CreateCopyOfColumnWithoutValues();
123        newColumn.Name = formula + "(" + firstAffectedColumn.Name + ")";
124        for (int i = 0; i < chart1.Series["Indicators"].Points.First().XValue; i++) {
125          newColumn.AddValue(null);
126        }
127        foreach (var value in chart1.Series["Indicators"].Points) {
128          newColumn.AddValue(value.YValues[0]);
129        }
130        this.ColumnGroup.InsertColumn(currentColumnIndex, newColumn);
131        currentColumnIndex++;
132        addedColumnsCount++;
133      }
134
135      // Williams %R
136      {
137        chart1.DataManipulator.FinancialFormula(FinancialFormula.WilliamsR, "Input:Y,Input:Y2,Input:Y4", "Indicators");
138        DoubleColumn newColumn = (DoubleColumn)firstAffectedColumn.CreateCopyOfColumnWithoutValues();
139        newColumn.Name = "WilliamsR(" + firstAffectedColumn.Name + ")";
140        for (int i = 0; i < chart1.Series["Indicators"].Points.First().XValue; i++) {
141          newColumn.AddValue(null);
142        }
143        foreach (var value in chart1.Series["Indicators"].Points) {
144          newColumn.AddValue(value.YValues[0]);
145        }
146        this.ColumnGroup.InsertColumn(currentColumnIndex, newColumn);
147        currentColumnIndex++;
148        addedColumnsCount++;
149      }
150
151      // StochasticIndicator
152      {
153        chart1.DataManipulator.FinancialFormula(FinancialFormula.StochasticIndicator, "15", "Input:Y,Input:Y2,Input:Y4", "Indicators,SMA");
154        DoubleColumn newColumn = (DoubleColumn)firstAffectedColumn.CreateCopyOfColumnWithoutValues();
155        newColumn.Name = "StochasticIndicator(" + firstAffectedColumn.Name + ")";
156        for (int i = 0; i < chart1.Series["Indicators"].Points.First().XValue; i++) {
157          newColumn.AddValue(null);
158        }
159        foreach (var value in chart1.Series["Indicators"].Points) {
160          newColumn.AddValue(value.YValues[0]);
161        }
162        this.ColumnGroup.InsertColumn(currentColumnIndex, newColumn);
163        currentColumnIndex++;
164        addedColumnsCount++;
165
166        DoubleColumn newColumnSma = (DoubleColumn)firstAffectedColumn.CreateCopyOfColumnWithoutValues();
167        newColumnSma.Name = "StochasticIndicator-SMA(" + firstAffectedColumn.Name + ")";
168        for (int i = 0; i < chart1.Series["SMA"].Points.First().XValue; i++) {
169          newColumnSma.AddValue(null);
170        }
171        foreach (var value in chart1.Series["SMA"].Points) {
172          newColumnSma.AddValue(value.YValues[0]);
173        }
174        this.ColumnGroup.InsertColumn(currentColumnIndex, newColumnSma);
175        currentColumnIndex++;
176        addedColumnsCount++;
177      }
178
179
180      // All other formulas.
181      formulae = new FinancialFormula[] {
182        FinancialFormula.AverageTrueRange,
183        FinancialFormula.CommodityChannelIndex,
184      };
185      foreach (var formula in formulae) {
186        chart1.DataManipulator.FinancialFormula(formula, "Input:Y,Input:Y2,Input:Y4", "Indicators");
187        DoubleColumn newColumn = (DoubleColumn)firstAffectedColumn.CreateCopyOfColumnWithoutValues();
188        newColumn.Name = formula + "(" + firstAffectedColumn.Name + ")";
189        for (int i = 0; i < chart1.Series["Indicators"].Points.First().XValue; i++) {
190          newColumn.AddValue(null);
191        }
192        foreach (var value in chart1.Series["Indicators"].Points) {
193          newColumn.AddValue(value.YValues[0]);
194        }
195        this.ColumnGroup.InsertColumn(currentColumnIndex, newColumn);
196        currentColumnIndex++;
197        addedColumnsCount++;
198      }
199
200      // moving averages.
201      formulae = new FinancialFormula[] {
202        FinancialFormula.ExponentialMovingAverage,
203        FinancialFormula.MovingAverage,
204        FinancialFormula.TriangularMovingAverage,
205        FinancialFormula.TripleExponentialMovingAverage,
206        FinancialFormula.WeightedMovingAverage,
207      };
208      foreach (var formula in formulae) {
209        chart1.DataManipulator.FinancialFormula(formula, "15", "Input:Y4", "Indicators");
210        DoubleColumn newColumn = (DoubleColumn)firstAffectedColumn.CreateCopyOfColumnWithoutValues();
211        newColumn.Name = formula + "(" + firstAffectedColumn.Name + ")";
212        for (int i = 0; i < chart1.Series["Indicators"].Points.First().XValue; i++) {
213          newColumn.AddValue(null);
214        }
215        foreach (var value in chart1.Series["Indicators"].Points) {
216          newColumn.AddValue(value.YValues[0]);
217        }
218        this.ColumnGroup.InsertColumn(currentColumnIndex, newColumn);
219        currentColumnIndex++;
220        addedColumnsCount++;
221      }
222
223      ColumnGroup.FireChanged();
224    }
225
226    public override void UndoExecute() {
227      base.UndoExecute();
228      int lastAffectedColumnIndex = AffectedColumns[3];
229      for (int i = 0; i < addedColumnsCount; i++)
230        this.ColumnGroup.RemoveColumn(lastAffectedColumnIndex + 1);
231      addedColumnsCount = 0;
232      ColumnGroup.FireChanged();
233    }
234  }
235}
Note: See TracBrowser for help on using the repository browser.