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);
        }
Beispiel #2
0
 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));
     }
 }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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");
            }
        }
Beispiel #5
0
        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");
            }
        }
Beispiel #6
0
        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);
        }