コード例 #1
0
ファイル: Program.cs プロジェクト: RomanS2N/trading
        static void Main(string[] args)
        {
            string         symbol        = YSQSymbol.YSQIndex.SNP;
            DateTime       begin         = new DateTime(2003, 12, 1);
            DateTime       end           = new DateTime(2004, 2, 1);
            ISamplePackage samplePackage = new YSQProvider().GetHistory(new Asset(symbol, AssetType.Index), begin, end, null);
            IBarPackage    barPackage    = (IBarPackage)samplePackage;
            List <IBar>    bars          = barPackage.Samples;
            TaResult       ema13         = bars.EMA(13);
            BullPower      bullPower     = new BullPower(bars, 13);

            //var sampleValues = new List<IInstantValue<double>>();
            //sampleValues.Add(new InstantValue<double>(new DateTime(2004, 1, 1), 1.0));
            //sampleValues.Add(new InstantValue<double>(new DateTime(2004, 1, 2), -1.0));
            //sampleValues.Add(new InstantValue<double>(new DateTime(2004, 1, 3), 1.0));
            //sampleValues.Add(new InstantValue<double>(new DateTime(2004, 1, 4), -1.0));

            ChartPool.CreateChart();
            ChartPool.ClearSeries();
            ChartPool.AddSeries(
                new List <Series> {
                new Series("Prices", ChartType.Lines, Colors.Black, bars.Select(x => new Sample(x.DateTime, (double)x.Close))),
                new Series("EMA(13)", ChartType.Lines, Colors.Red, ema13.InstantValues.Select(x => new Sample(x.DateTime, x.Value))),
                new Series("BullPower(13)", ChartType.Columns, Colors.Blue, bullPower.InstantValues.Select(x => new Sample(x.DateTime, x.Value))),
            }
                );

            Console.WriteLine("Press a key to exit...");
            Console.ReadKey(true);
        }
コード例 #2
0
ファイル: SimulationRunner.cs プロジェクト: RomanS2N/trading
 public void AddSerie(string name, TaResult serie)
 {
     if (serie.Count != _bars.Count)
     {
         throw new Exception("Wrong samples qty.");
     }
     _series[name] = serie;
 }
コード例 #3
0
ファイル: Program.cs プロジェクト: RomanS2N/trading
        static void Main(string[] args)
        {
            string         symbol        = YSQSymbol.YSQIndex.SNP;
            DateTime       begin         = new DateTime(2013, 1, 1);
            DateTime       end           = new DateTime(2014, 1, 1);
            ISamplePackage samplePackage = new YSQProvider().GetHistory(new Asset(symbol, AssetType.Index), begin, end, null);
            IBarPackage    barPackage    = (IBarPackage)samplePackage;
            List <IBar>    bars          = barPackage.Samples;
            // simulation
            ISimulation bestSimulation         = default(ISimulation);
            TaResult    bestSimulationSmallEma = default(TaResult);
            TaResult    bestSimulationBigEma   = default(TaResult);

            ChartPool.CreateChart();
            int      configurationsCount = 0;
            DateTime simulationsBegin    = DateTime.Now;

            for (int small = 2; small < 14; small += 1)
            {
                for (int big = 30; big < 80; big += 1)
                {
                    for (int take = 10; take < 50; take += 2)
                    {
                        for (int stop = 10; stop < 50; stop += 2)
                        {
                            configurationsCount++;
                            var simulation = SmaSimulation.CreateLongOnly(2, take, stop);
                            simulation.SimulationInfo = string
                                                        .Format("EMA_SMALL: {0}, EMA_BIG: {1}, TakeProfit: {2}, StopLoss: {3}",
                                                                small, big, take, stop);
                            SimulationRunner simulationRunner = new SimulationRunner(bars, simulation);
                            var smallEma = bars.EMA(small);
                            var bigEma   = bars.EMA(big);
                            simulationRunner.AddSerie("EMA_SMALL", smallEma);
                            simulationRunner.AddSerie("EMA_BIG", bigEma);
                            simulationRunner.Execute();
                            Console.WriteLine(simulation.GetReport());
                            if (bestSimulation == default(ISimulation) || simulation.Earnings > bestSimulation.Earnings)
                            {
                                bestSimulation         = simulation;
                                bestSimulationSmallEma = smallEma;
                                bestSimulationBigEma   = bigEma;
                            }
                            //ShowSimulation(simulation, bars, smallEma, bigEma);
                            //Console.ReadKey(true);
                        }
                    }
                }
            }
            Console.WriteLine("{0} configurations tested in {1}", configurationsCount, DateTime.Now - simulationsBegin);
            Console.WriteLine("Best simulation");
            ShowSimulation(bestSimulation, bars, bestSimulationSmallEma, bestSimulationBigEma);
            Console.ReadKey(true);
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: RomanS2N/trading
 static void ShowSimulation(ISimulation simulation, List <IBar> bars, TaResult smallEma, TaResult bigEma)
 {
     Console.WriteLine(simulation.GetReport());
     ChartPool.ClearSeries();
     ChartPool.AddSeries(
         new List <Series> {
         new Series("Prices", ChartType.Lines, Colors.Black, bars.Select(x => new Sample(x.DateTime, (double)x.Close))),
         new Series("EMA Small", ChartType.Lines, Colors.Blue, smallEma.InstantValues.Select(x => new Sample(x.DateTime, x.Value))),
         new Series("EMA Big", ChartType.Lines, Colors.DarkGreen, bigEma.InstantValues.Select(x => new Sample(x.DateTime, x.Value))),
         new Series("Trades", ChartType.Trades, Colors.Purple, simulation.ClosedPositions.Select(x => new Trade(x.OpenDateTime, x.CloseDateTime, x.Side, (double)x.OpenPrice, (double)x.ClosePrice))),
     }
         );
 }
コード例 #5
0
ファイル: Program.cs プロジェクト: RomanS2N/trading
 static void ShowSimulation(ISimulation simulation, List <IBar> bars, TaResult indicator0, TaResult indicator1, TaResult indicator2, TaResult indicator3)
 {
     Console.WriteLine(simulation.GetReport());
     ChartPool.ClearSeries();
     ChartPool.AddSeries(
         new List <Series> {
         new Series("Prices", ChartType.Lines, Colors.Black, bars.Select(x => new Sample(x.DateTime, (double)x.Close))),
         new Series("indicator0", ChartType.Lines, Colors.Blue, indicator0.InstantValues.Select(x => new Sample(x.DateTime, x.Value))),
         new Series("indicator1", ChartType.Lines, Colors.DarkGreen, indicator1.InstantValues.Select(x => new Sample(x.DateTime, x.Value))),
         new Series("indicator2", ChartType.Lines, Colors.DarkGreen, indicator2.InstantValues.Select(x => new Sample(x.DateTime, x.Value))),
         new Series("indicator3", ChartType.Lines, Colors.DarkGreen, indicator3.InstantValues.Select(x => new Sample(x.DateTime, x.Value))),
         new Series("Trades", ChartType.Trades, Colors.Purple, simulation.ClosedPositions.Select(x => new Trade(x.OpenDateTime, x.CloseDateTime, x.Side, (double)x.OpenPrice, (double)x.ClosePrice))),
     }
         );
 }
コード例 #6
0
ファイル: SimulationRunner.cs プロジェクト: RomanS2N/trading
        private Dictionary <string, IInstantValue <double> > GetSeriesValues(int index)
        {
            Dictionary <string, IInstantValue <double> > seriesValues = new Dictionary <string, IInstantValue <double> >();

            foreach (KeyValuePair <string, TaResult> serie in _series)
            {
                if (serie.Value.FirstValidSample > index)
                {
                    return(null);
                }
                string   serieKey   = serie.Key;
                TaResult serieValue = serie.Value;
                seriesValues[serieKey] = serieValue.InstantValues[index];
            }
            return(seriesValues);
        }
コード例 #7
0
        public BullPower(List <IBar> bars, int period)
        {
            InstantValues = new List <IInstantValue <double> >();
            TaResult ema   = bars.EMA(period);
            int      count = ema.Count;

            if (count != bars.Count)
            {
                throw new Exception("Samples count can't be different");
            }
            FirstValidSample = ema.FirstValidSample;
            for (int i = 0; i < count; i++)
            {
                DateTime dateTime  = bars[i].DateTime;
                double   bullPower = 0;
                if (i >= FirstValidSample)
                {
                    double high     = (double)bars[i].High;
                    double emaValue = ema.InstantValues[i].Value;
                    bullPower = high - emaValue;
                }
                InstantValues.Add(new InstantValue <double>(dateTime, bullPower));
            }
        }
コード例 #8
0
ファイル: Program.cs プロジェクト: RomanS2N/trading
        static void TrainWithIndexData()
        {
            List <double[]> data = new List <double[]>();

            var symbol        = YSQSymbol.YSQIndex.SNP;
            var begin         = new DateTime(2004, 1, 1);
            var end           = new DateTime(2008, 1, 1);
            var samplePackage = new YSQProvider().GetHistory(new Asset(symbol, AssetType.Index), begin, end, null);
            var barPackage    = (IBarPackage)samplePackage;
            var bars          = barPackage.Samples;

            TaResult indicator0 = bars.SMA(7);
            TaResult indicator1 = bars.SMA(14);
            TaResult indicator2 = bars.SMA(24);
            TaResult indicator3 = bars.SMA(60);

            List <TaResult> indicatorsList = new List <TaResult> {
                indicator0, indicator1, indicator2, indicator3
            };

            // discard bars and indicators previous to valid series
            int firstValidSampleOnSeries = TaResult.GetFirstValidSample(indicatorsList);

            Console.WriteLine("First valid sample on series: {0}", firstValidSampleOnSeries);

            bars.RemoveRange(0, firstValidSampleOnSeries);
            TaResult.DiscardFirstSamples(indicatorsList, firstValidSampleOnSeries);
            Console.WriteLine("Invalid samples removed");

            // possible answers
            var stay    = new double[] { 1, 0, 0 };
            var goLong  = new double[] { 0, 1, 0 };
            var goShort = new double[] { 0, 0, 1 };

            var deltaPrices = bars.Select(x => x.Close - x.Open).ToList();
            var action      = deltaPrices.Select(deltaPrice => {
                var abs = Math.Abs(deltaPrice);
                if (abs < 5)
                {
                    return(stay);
                }
                if (deltaPrice < 0)
                {
                    return(goShort);
                }
                return(goLong);
            }).ToList();

            Console.WriteLine("Times to stay: {0}", action.Count(x => x == stay));
            Console.WriteLine("Times to go long: {0}", action.Count(x => x == goLong));
            Console.WriteLine("Times to go short: {0}", action.Count(x => x == goShort));

            int samplesCount = bars.Count;

            for (int i = 0; i < samplesCount; i++)
            {
                var entry = new double[] {
                    indicator0.InstantValues[i].Value,
                    indicator1.InstantValues[i].Value,
                    indicator2.InstantValues[i].Value,
                    indicator3.InstantValues[i].Value,
                    action[i][0],
                    action[i][1],
                    action[i][2]
                };
                data.Add(entry);
            }

            NeuralNetwork neuralNetwork = Trainer.Execute(data);

            ChartPool.CreateChart();

            int     takeProfitPoints   = 15;
            int     stopLossPoints     = 10;
            decimal intensityThreshold = 0.0m;

            indicator0.Normalize();
            indicator1.Normalize();
            indicator2.Normalize();
            indicator3.Normalize();

            var simulation = new NNSimulation(neuralNetwork, intensityThreshold, takeProfitPoints, stopLossPoints, true);
            SimulationRunner simulationRunner = new SimulationRunner(bars, simulation);

            simulationRunner.AddSerie("INDICATOR_0", indicator0);
            simulationRunner.AddSerie("INDICATOR_1", indicator1);
            simulationRunner.AddSerie("INDICATOR_2", indicator2);
            simulationRunner.AddSerie("INDICATOR_3", indicator3);
            simulationRunner.Execute();
            ShowSimulation(simulation, bars, indicator0, indicator1, indicator2, indicator3);
        }