public static DailyStockData FromCsv(string csvLineAsString) { DailyStockData values = null; try { string [] parsed = csvLineAsString.Split(','); values = new DailyStockData(parsed [0], parsed [1], parsed [2], parsed [3], parsed [4], parsed [5], parsed [6]); } catch (Exception ex) { Utils.WriteToConsole(Utils.ExToString(ex), true, "DailyStockData.FromCsv"); } return(values); }
private static Result <List <DailyStockData>, Exception> ReadStockFile(this string inputFile) { try { return(Result <List <DailyStockData>, Exception> .Succeeded( File.ReadAllLines (inputFile) .Skip (1) .Select (v => DailyStockData.FromCsv(v)) .ToList())); } catch (Exception ex) { Utils.WriteToConsole($"{Utils.ExToString (ex)} { currentTicker}", true, "ReadStockFile"); return(Result <List <DailyStockData>, Exception> .Failed(ex)); } }
private DailyFloatData CalculateFloat(List <DailyStockData> values, long flt, int idx) { DailyFloatData fv = null; try { var cnt = values.Count; long vol = 0; decimal high = 0; decimal low = 0; DateTime? endDate = null; DateTime? startDate = null; DailyStockData today = null; for (var i = idx; i >= 0; i--) { today = values [i]; if (!endDate.HasValue) { endDate = today.Date; } if (high < today.High) { high = today.High; } if (low == 0 || low > today.Low) { low = today.Low; } vol += today.Volume; if (vol >= flt) { startDate = today.Date; break; } } fv = new DailyFloatData { EndDate = endDate.Value, High = high, Low = low, Signal = (vol < flt) ? FloatSignal.Unknown : FloatSignal.Neutral, StartDate = (vol < flt) ? today.Date : startDate.Value }; if (vol >= flt && idx > 0) { today = values [idx]; var yesterday = values [idx - 1]; if (today.High == high && yesterday.High < high) { fv.Signal = FloatSignal.Buy; } else if (today.Low == low && yesterday.Low > low) { fv.Signal = FloatSignal.Sell; } } } catch (Exception ex) { Utils.WriteToConsole($"{Utils.ExToString (ex)} {Ticker}", true, "CalculateFloat"); } return(fv); }
public SimpleAverageList(List <DailyStockData> values, string ticker, int numDays1, int numDays2) { Ticker = ticker; NumDays1 = numDays1; NumDays2 = numDays2; int _i = -1, _j = -1, _k = -1; try { for (var i = 0; i < values.Count; i++) { _i = i; DailyStockData data = values[i]; // MA 1 int downTo1 = i >= (numDays1 - 1) ? i - (numDays1 - 1) : 0; decimal acc1 = 0; for (var j = i; j >= downTo1; j--) { _j = j; acc1 += values[j].Close; } int divDays1 = i >= (numDays1 - 1) ? numDays1 : i + 1; decimal avgPrice1 = acc1 / divDays1; // MA 2 int downTo2 = i >= (numDays2 - 1) ? i - (numDays2 - 1) : 0; decimal acc2 = 0; for (var k = i; k >= downTo2; k--) { _k = k; acc2 += values[k].Close; } int divDays2 = i >= (numDays2 - 1) ? numDays2 : i + 1; decimal avgPrice2 = acc2 / divDays2; // Create data record string signal = string.Empty; if (data.Close >= avgPrice1 && data.Close >= avgPrice2) { if (avgPrice1 >= avgPrice2) { signal = "P12"; } else { signal = "P21"; } } else if (avgPrice1 >= data.Close && avgPrice1 >= avgPrice2) { if (data.Close >= avgPrice2) { signal = "1P2"; } else { signal = "12P"; } } else { if (data.Close >= avgPrice1) { signal = "2P1"; } else { signal = "21P"; } } this.Add(new DailyAverageData { Date = data.Date, Close = data.Close, MA1 = avgPrice1, MA2 = avgPrice2, Signal = signal }); } } catch (Exception ex) { Utils.WriteToConsole($"{Utils.ExToString(ex)}\ni: {_i} j: {_j} k: {_k}", true, "SimpleAverageList"); } }
public ExponentialAverageList(List <DailyStockData> values, string ticker, int numDays1, int numDays2) { Ticker = ticker; NumDays1 = numDays1; NumDays2 = numDays2; int _i = -1, _j = -1, _k = -1; decimal mult1 = 2.0M / (numDays1 + 1); decimal mult2 = 2.0M / (numDays2 + 1); decimal yema1 = 0, yema2 = 0; decimal ema1, ema2; int divDays1, divDays2; decimal avgPrice1 = 0, avgPrice2 = 0; try { for (var i = 0; i < values.Count; i++) { _i = i; DailyStockData data = values[i]; // Skip when (i < (NumDays1 - 1)) if (i == (NumDays1 - 1)) { // SMA 1 int downTo1 = i >= (numDays1 - 1) ? i - (numDays1 - 1) : 0; decimal acc1 = 0; for (var j = i; j >= downTo1; j--) { _j = j; acc1 += values[j].Close; } divDays1 = i >= (numDays1 - 1) ? numDays1 : i + 1; yema1 = avgPrice1 = acc1 / divDays1; } else if (i >= NumDays1) { // Calculate the EMA ema1 = data.Close * mult1 + yema1 * (1 - mult1); yema1 = avgPrice1 = ema1; } // Skip when (i < (NumDays2 - 1)) if (i == (NumDays2 - 1)) { // SMA 2 int downTo2 = i >= (numDays2 - 1) ? i - (numDays2 - 1) : 0; decimal acc2 = 0; for (var k = i; k >= downTo2; k--) { _k = k; acc2 += values[k].Close; } divDays2 = i >= (numDays2 - 1) ? numDays2 : i + 1; yema2 = avgPrice2 = acc2 / divDays2; } else if (i >= NumDays2) { // Calculate the EMA ema2 = data.Close * mult2 + yema2 * (1 - mult2); yema2 = avgPrice2 = ema2; } // Create data record string signal = string.Empty; if (avgPrice1 == 0 || avgPrice2 == 0) { signal = "-"; } else if (data.Close >= avgPrice1 && data.Close >= avgPrice2) { if (avgPrice1 >= avgPrice2) { signal = "P12"; } else { signal = "P21"; } } else if (avgPrice1 >= data.Close && avgPrice1 >= avgPrice2) { if (data.Close >= avgPrice2) { signal = "1P2"; } else { signal = "12P"; } } else { if (data.Close >= avgPrice1) { signal = "2P1"; } else { signal = "21P"; } } this.Add(new DailyAverageData { Date = data.Date, Close = data.Close, MA1 = avgPrice1, MA2 = avgPrice2, Signal = signal }); } } catch (Exception ex) { Utils.WriteToConsole($"{Utils.ExToString(ex)}\ni: {_i} j: {_j} k: {_k}", true, "ExponentialAverageList"); } }
private DailyPointData CalculatePoint(DailyStockData value, List <decimal> scale, DailyPointData lastPoints, List <int> highs, List <int> lows) { DailyPointData newPoints = null; decimal newPoint; int newIndex; try { (newPoint, newIndex) = FindPointValue(scale, value.Close, lastPoints.Signal); newPoints = new DailyPointData { Close = value.Close, Date = value.Date }; switch (lastPoints.Signal) { case PointSignal.Unknown: // This is the first data point. if (lastPoints.PointIndex == -1) { newPoints.HighLowIndex = newIndex; newPoints.HighLow = newPoint; newPoints.PointIndex = newIndex; newPoints.Point = newPoint; newPoints.Signal = PointSignal.Unknown; newPoints.TargetIndex = -1; newPoints.Target = 0; } // The Close went up. else if (lastPoints.Close < value.Close) { newPoints.HighLowIndex = newIndex; newPoints.HighLow = newPoint; newPoints.PointIndex = newIndex; newPoints.Point = newPoint; newPoints.Signal = PointSignal.Up; newPoints.TargetIndex = newIndex + 3; newPoints.Target = scale [newPoints.TargetIndex]; } // The Close went down. else if (lastPoints.Close > value.Close) { // Because Unknown is rounded as if it were Up, we need to adjust it back down. newIndex -= 1; newPoint = scale [newIndex]; newPoints.HighLowIndex = newIndex; newPoints.HighLow = newPoint; newPoints.PointIndex = newIndex; newPoints.Point = newPoint; newPoints.Signal = PointSignal.Down; newPoints.TargetIndex = newIndex >= 3 ? newIndex - 3 : 0; newPoints.Target = scale [newPoints.TargetIndex]; } // The Close was the same. else { newPoints.HighLowIndex = newIndex; newPoints.HighLow = newPoint; newPoints.PointIndex = newIndex; newPoints.Point = newPoint; newPoints.Signal = PointSignal.Unknown; newPoints.TargetIndex = -1; newPoints.Target = 0; } break; case PointSignal.Buy: case PointSignal.Up: // The Close went below the Target. if (value.Close <= lastPoints.Target) { newIndex -= 1; newPoint = scale [newIndex]; var newTargetIndex = newIndex >= 3 ? newIndex - 3 : 0; newPoints.HighLowIndex = newIndex; newPoints.HighLow = newPoint; newPoints.PointIndex = newIndex; newPoints.Point = newPoint; if (lows.Count > 0 && newIndex > lows.Last()) { newPoints.Signal = PointSignal.Sell; } else { newPoints.Signal = PointSignal.Down; } newPoints.TargetIndex = newTargetIndex; newPoints.Target = scale [newTargetIndex]; } // The Close went up. else if (value.Close > lastPoints.HighLow) { var newTargetIndex = newIndex + 3; newPoints.HighLowIndex = newIndex; newPoints.HighLow = newPoint; newPoints.PointIndex = newIndex; newPoints.Point = newPoint; newPoints.Signal = PointSignal.Up; newPoints.TargetIndex = newTargetIndex; newPoints.Target = scale [newTargetIndex]; } // The Close was the same or not high enough to make the Target. else { newPoints.HighLowIndex = lastPoints.HighLowIndex; newPoints.HighLow = lastPoints.HighLow; newPoints.PointIndex = newIndex; newPoints.Point = newPoint; newPoints.Signal = PointSignal.Up; newPoints.TargetIndex = lastPoints.TargetIndex; newPoints.Target = lastPoints.Target; } break; case PointSignal.Sell: case PointSignal.Down: // The Close went above the Target. if (value.Close >= lastPoints.Target) { newIndex += 1; newPoint = scale [newIndex]; var newTargetIndex = newIndex + 3; newPoints.HighLowIndex = newIndex; newPoints.HighLow = newPoint; newPoints.PointIndex = newIndex; newPoints.Point = newPoint; if (highs.Count > 0 && newIndex < highs.Last()) { newPoints.Signal = PointSignal.Buy; } else { newPoints.Signal = PointSignal.Up; } newPoints.TargetIndex = newTargetIndex; newPoints.Target = scale [newTargetIndex]; } // The Close went down. else if (value.Close < lastPoints.HighLow) { var newTargetIndex = newIndex >= 3 ? newIndex - 3 : 0; newPoints.HighLowIndex = newIndex; newPoints.HighLow = newPoint; newPoints.PointIndex = newIndex; newPoints.Point = newPoint; newPoints.Signal = PointSignal.Down; newPoints.TargetIndex = newTargetIndex; newPoints.Target = scale [newTargetIndex]; } // The Close was the same or not high enough to make the Target. else { newPoints.HighLowIndex = lastPoints.HighLowIndex; newPoints.HighLow = lastPoints.HighLow; newPoints.PointIndex = newIndex; newPoints.Point = newPoint; newPoints.Signal = PointSignal.Down; newPoints.TargetIndex = lastPoints.TargetIndex; newPoints.Target = lastPoints.Target; } break; } } catch (Exception ex) { Utils.WriteToConsole($"{Utils.ExToString (ex)} {Ticker}", true, "CalculatePoint"); } return(newPoints); }