public static string InvestmentSimulations(string stockDataFileName, string predictionsFileName, double investorStartMoney = 100000.0)
        {
            var spfr = new StockPredictionsFileReader(predictionsFileName);
            var rsdr = new RawStockDataReader(stockDataFileName);

            int diffrence = 0;

            List<InvestorRow> mergedData = new List<InvestorRow>();
            for (int i = 0; i < rsdr.GetCount(); i++)
            {
                if (spfr.GetDate(0) == rsdr.GetDates()[i])
                {
                    diffrence = i;
                    break;
                }
            }

            for (int i = diffrence; i < rsdr.GetCount() && i - diffrence < spfr.GetCount(); i++)
            {
                var row = new InvestorRow();
                row.Closing = rsdr.GetClosing()[i];
                row.Date = rsdr.GetDates()[i];
                row.Highest = rsdr.GetHighest()[i];
                row.Lowest = rsdr.GetLowest()[i];
                row.Opening = rsdr.GetOpening()[i];
                row.Volume = rsdr.GetVolume()[i];

                row.NetworkFitness = spfr.GetFitness(i - diffrence);
                row.PredictionForTommorow = spfr.GetPredicted(i - diffrence);
                row.AccualClosingForTommorow = spfr.GetAccual(i - diffrence);

                mergedData.Add(row);
            }

            Investor.Investor investor = new Investor.Investor(mergedData);
            investor.StartMoney = investorStartMoney;
            investor.SimulateAll();

            //save the output
            string f = Utilities.OutputFileName("investor.csv");
            System.IO.StreamWriter file = new System.IO.StreamWriter(f);
            file.Write(investor.GetCSVOutput());
            file.Close();

            return f;
        }
        public string PreprocesData()
        {
            var rsdr = new RawStockDataReader(_filename);
            int cnt = rsdr.GetCount();

            if (rsdr.GetCount() < _period + 1)
                throw new IndexOutOfRangeException("Dataset is to small");

            var closing = rsdr.GetClosing();
            var highest = rsdr.GetHighest();
            var opening = rsdr.GetOpening();
            var lowest = rsdr.GetLowest();
            var volume = rsdr.GetVolume();

            var dates = rsdr.GetDates();

            var sma = TechnicalAnalisysMethods.SimpleMovingAverage(closing, _period, 0, cnt-1);
            sma = NormalizeColumnRescaling(sma).ToArray();

            var ema = TechnicalAnalisysMethods.ExponentialMovingAverage(closing, _period, 0, cnt - 1);
            ema = NormalizeColumnRescaling(ema).ToArray();

            var dema = TechnicalAnalisysMethods.DoubleExponentialMovingAverage(closing, _period, 0, cnt - 1);
            dema = NormalizeColumnRescaling(dema).ToArray();

            var roc = TechnicalAnalisysMethods.ROC(closing, _period, 0, cnt - 1);

            var rsi = TechnicalAnalisysMethods.RSI(closing, _period, 0, cnt - 1);
            rsi = NormalizeColumnRescaling(rsi).ToArray();

            var natr = TechnicalAnalisysMethods.NormalizedAverageTrueRange(closing, highest, lowest, _period, 0, cnt - 1);
            natr = NormalizeColumnRescaling(natr).ToArray();

            var obv = TechnicalAnalisysMethods.OnBalanceVolume(closing, volume, 0, cnt - 1);
            obv = NormalizeColumnRescaling(obv).ToArray();

            var chosc = TechnicalAnalisysMethods.ChaikinOscilator(closing, highest, lowest, volume, _period, _period*2, 0, cnt - 1);
            chosc = NormalizeColumnRescaling(chosc).ToArray();

            var adx = TechnicalAnalisysMethods.AverageDirectionalMovementIndex(closing, highest, lowest, _period, 0, cnt - 1);
            adx = NormalizeColumnRescaling(adx).ToArray();

            closing = NormalizeColumnRescaling(closing).ToArray();
            highest = NormalizeColumnRescaling(highest).ToArray();
            opening = NormalizeColumnRescaling(opening).ToArray();
            lowest = NormalizeColumnRescaling(lowest).ToArray();
            volume = NormalizeColumnRescaling(volume).ToArray();

            var tsf = TechnicalAnalisysMethods.TimeSeriesForecast(closing, _period, 0, cnt - 1);

            for (int i = _period; i < cnt -1; i++)
            {
                _outputDates.Add(dates[i]);

                List<double> learingExample = new List<double>();

                for (int j = _period-1; j >= 0; j--)
                {
                    //Opening,Highest,Lowest,Closing,Volume

                    List<double> day = new List<double>();
                    int i_day = i - j;
                    day.Add(opening[i_day]); //0
                    day.Add(highest[i_day]); //1
                    day.Add(lowest[i_day]); //2
                    day.Add(closing[i_day]); //3
                    day.Add(volume[i_day]); //4

                    day.AddRange(rsdr.Records[i_day].CalculatePercentChange(rsdr.Records[i_day-1])); //+5 kolumn

                    day.Add(sma[i_day]); //9
                    day.Add(ema[i_day]); //10
                    day.Add(dema[i_day]); //11
                    day.Add(roc[i_day]); //12
                    day.Add(rsi[i_day]); //13
                    day.Add(natr[i_day]); //14
                    day.Add(obv[i_day]); //15
                    day.Add(chosc[i_day]); //16
                    day.Add(tsf[i_day]); //17 nowosc
                    day.Add(adx[i_day]); //18 nowosc

                    learingExample.AddRange(day);

                }

                learingExample.Add(GetNextDayOfWeek(rsdr.Records[i].Date));

                double desiredOutput = (rsdr.Records[i+1].Closing - rsdr.Records[i].Closing) / rsdr.Records[i].Closing;
                learingExample.Add(desiredOutput);

                _outputNumbers.Add(learingExample);
            }

            SaveResults();
            return _outputFilename;
        }