예제 #1
0
        public void WriteEngineResult(ModelLoaderInterface loader, TickEngine engine, Action <int, double> fitnessCallback)
        {
            try {
                loader.OptimizeOutput = new FileStream(fileName, FileMode.Append);
                using (StreamWriter fwriter = new StreamWriter(loader.OptimizeOutput)) {
                    ModelInterface topModel = engine.Model;
                    foreach (var chain in topModel.Chain.Dependencies)
                    {
                        var passModel  = chain.Model as StrategyInterface;
                        var strings    = passModel.Name.Split(new char[] { '-' });
                        var passNumber = int.Parse(strings[2]);
                        if (fitnessCallback != null)
                        {
                            fitnessCallback(passNumber, passModel.OnGetFitness());
                        }

                        if (passModel == null)
                        {
                            log.Error("Model " + passModel + " must implement the StrategyInterface or PortfolioInterface for the optimizer statistics results to get recorded.");
                        }
                        else
                        {
                            WritePassStats(fwriter, passModel);
                        }
                    }
                }
            } catch (Exception ex) {
                log.Error("ERROR: Problem writing optimizer results.", ex);
            }
        }
예제 #2
0
        public TickEngine SetupEngine(bool quietMode)
        {
            TickEngine engine = Factory.Engine.TickEngine;

            ProjectProperties.Engine.CopyProperties(engine);
            engine.ChartProperties = ProjectProperties.Chart;
            engine.SymbolInfo      = ProjectProperties.Starter.SymbolProperties;

            engine.IntervalDefault  = ProjectProperties.Starter.IntervalDefault;
            engine.EnableTickFilter = ProjectProperties.Engine.EnableTickFilter;

            engine.Providers        = SetupProviders(quietMode, false);
            engine.BackgroundWorker = BackgroundWorker;
            engine.RunMode          = RunMode.Historical;
            engine.StartCount       = StartCount;
            engine.EndCount         = EndCount;
            engine.StartTime        = ProjectProperties.Starter.StartTime;
            engine.EndTime          = ProjectProperties.Starter.EndTime;

            if (quietMode)
            {
                engine.QuietMode = true;
                log.Info("Setting engine for quiet mode.");
            }
            else
            {
                engine.ShowChartCallback   = ShowChartCallback;
                engine.CreateChartCallback = CreateChartCallback;
                log.Info("Setting engine create chart callback = " + engine.CreateChartCallback);
            }
            return(engine);
        }
예제 #3
0
        public override void Run(ModelInterface model)
        {
            Factory.Parallel.SetMode(parallelMode);
            Factory.SysLog.ResetConfiguration();
            engine              = Factory.Engine.TickEngine("Design");
            engine.MaxBarsBack  = 2;
            engine.MaxTicksBack = 2;
            SymbolInfo symbolInfo = Factory.Symbol.LookupSymbol("Design");

            engine.SymbolInfo       = new SymbolInfo[] { symbolInfo };
            engine.IntervalDefault  = ProjectProperties.Starter.IntervalDefault;
            engine.DesiredRunMode   = RunMode.Historical;
            engine.DataFolder       = DataFolder;
            engine.EnableTickFilter = ProjectProperties.Engine.EnableTickFilter;

            if (CancelPending)
            {
                return;
            }

            engine.Model = model;

            engine.QueueTask();
            engine.WaitTask();
            var parallel = Factory.Parallel;

            parallel.Dispose();
        }
예제 #4
0
        public void Start_ShouldNotBlockMainThread()
        {
            TickEngine tickEngine = new TickEngine();
            Thread     tickThread = tickEngine.Start();

            tickEngine.Dispose();
        }
예제 #5
0
        public virtual void Run(ModelInterface model)
        {
            Factory.Parallel.SetMode(parallelMode);
            try
            {
                engine = Factory.Engine.TickEngine("Starter");
                if (ProjectProperties.Starter.SymbolProperties.Length == 0)
                {
                    throw new TickZoomException("Please enter at least one symbol.");
                }
                ProjectProperties.Engine.CopyProperties(engine);
                // Chaining of models.
                engine.Model           = model;
                engine.ChartProperties = ProjectProperties.Chart;
                engine.SymbolInfo      = ProjectProperties.Starter.SymbolProperties;

                engine.IntervalDefault  = ProjectProperties.Starter.IntervalDefault;
                engine.EnableTickFilter = ProjectProperties.Engine.EnableTickFilter;

                engine.BackgroundWorker = BackgroundWorker;
                engine.DesiredRunMode   = runMode;
                if (runMode == RunMode.RealTime)
                {
                    engine.Providers = SetupDataProviders();
                }
                engine.StartCount = StartCount;
                engine.EndCount   = EndCount;
                engine.DataFolder = dataFolder;

                engine.StartTime             = ProjectProperties.Starter.StartTime;
                engine.EndTime               = ProjectProperties.Starter.EndTime;
                engine.TestFinishedTimeout   = ProjectProperties.Starter.TestFinishedTimeout;
                engine.PortfolioSyncInterval = ProjectProperties.Starter.PortfolioSyncInterval;

                if (CancelPending)
                {
                    return;
                }

                engine.TickReplaySpeed     = ProjectProperties.Engine.TickReplaySpeed;
                engine.BarReplaySpeed      = ProjectProperties.Engine.BarReplaySpeed;
                engine.ShowChartCallback   = ShowChartCallback;
                engine.CreateChartCallback = CreateChartCallback;
                log.Info("Setting engine create chart callback = " + engine.CreateChartCallback);

                engine.Run();
                var parallel = Factory.Parallel;
                parallel.Dispose();
                if (CancelPending)
                {
                    return;
                }
            }
            finally
            {
                Factory.Parallel.ReleaseIOTasks();
                Factory.Parallel.SetMode(ParallelMode.Normal);
            }
        }
예제 #6
0
        public void RegisterTickable_ShouldRegisterTickable()
        {
            TickEngine   tickEngine   = new TickEngine();
            TimeTickable timeTickable = new TimeTickable();

            tickEngine.RegisterTickable(timeTickable);
            Assert.Contains(timeTickable, tickEngine.RegisteredTickables());
        }
예제 #7
0
        public void startGraphics(Graphics g)
        {
            gEngine = new GEngine(g);
            gEngine.init();

            tEngine = new TickEngine();
            tEngine.Init();
        }
예제 #8
0
 private void GetEngineResults()
 {
     for (int i = 0; i < engineIterations.Count; i++)
     {
         TickEngine engine = engineIterations[i];
         engine.WaitTask();
         --tasksRemaining;
     }
 }
예제 #9
0
    private void SetupContainer()
    {
        container = new UnityContainer();

        container.Bind <TickEngine>().AsSingle();
        tickEngine = container.Build <TickEngine>();

        container.Bind <ICommandFactory>().AsSingle <CommandFactory>();
    }
    void StartGame()
    {
        MonsterSpawner spawner = container.Build <MonsterSpawner>();

        //tickEngine could be added in the container as well
        //if needed to other classes!
        TickEngine tickEngine = new TickEngine();

        tickEngine.Add(spawner);
    }
예제 #11
0
        public void Start_ShouldStartToCallOnTickOnEachTickable()
        {
            TickEngine   tickEngine = new TickEngine();
            TestTickable test       = new TestTickable();

            tickEngine.RegisterTickable(test);
            tickEngine.Start();
            Thread.Sleep(TickEngine.TICK_MILLISECONDS * 3);
            Assert.GreaterOrEqual(test.tickCalled, 2);
            tickEngine.Dispose();
        }
예제 #12
0
        private void GetEngineResults()
        {
            for (int i = 0; i < engineIterations.Count; i++)
            {
                TickEngine engine = engineIterations[i];
                engine.WaitTask();
                --tasksRemaining;
            }
            var parallel = Factory.Parallel;

            parallel.Dispose();
        }
예제 #13
0
 private void GetEngineResults()
 {
     for (int i = 0; i < engineIterations.Count; i++)
     {
         TickEngine engine = engineIterations[i];
         engine.WaitTask();
                         #if CLRPROFILER
         CLRProfilerControl.LogWriteLine(tasksRemaining + " tasks remaining");
                 #endif
         --tasksRemaining;
     }
 }
예제 #14
0
        private object GetEngine()
        {
            TickEngine    engine     = Factory.Engine.TickEngine;
            PropertyTable properties = new PropertyTable(engine);

//			Starter starter = new DesignStarter();
//			starter.Model = engine;
//			starter.Run();
//			properties.SetAfterInitialize();
//			LoadIndicators(engine);
            return(properties);
        }
예제 #15
0
        private MainForm()
        {
            InitializeComponent();
            // This just loads the engine so that it avoids the
            // delay in openning the first form in the app.
            TickEngine engine = Factory.Engine.TickEngine;

            showRightToLeft.Checked = (RightToLeft == RightToLeft.Yes);
            RightToLeftLayout       = showRightToLeft.Checked;
            m_solutionExplorer      = new DummySolutionExplorer();
            m_solutionExplorer.RightToLeftLayout = RightToLeftLayout;
            m_deserializeDockContent             = new DeserializeDockContent(GetContentFromPersistString);
            this.LayoutMdi(MdiLayout.TileHorizontal);
        }
예제 #16
0
 public void CheckForEngine()
 {
     try
     {
         TickEngine engine = Factory.Engine.TickEngine;
         isEngineLoaded = true;
     }
     catch (Exception)
     {
         var    version = GetType().Assembly.GetName().Version;
         string msg     = "Sorry, cannot find an engine compatible with version " + version + ".";
         log.Notice(msg);
     }
     if (isEngineLoaded)
     {
         initialInterval = Factory.Engine.DefineInterval(BarUnit.Day, 1);
     }
 }
예제 #17
0
        public void PauseAndResume_ShouldStopCallingOnTick()
        {
            TickEngine   tickEngine = new TickEngine();
            TestTickable test       = new TestTickable();

            tickEngine.RegisterTickable(test);

            tickEngine.Start();

            Thread.Sleep(TickEngine.TICK_MILLISECONDS * 3);
            tickEngine.Pause();
            Assert.GreaterOrEqual(test.tickCalled, 2);
            var currentTickNb = test.tickCalled;

            Thread.Sleep(TickEngine.TICK_MILLISECONDS * 3);
            Assert.AreEqual(test.tickCalled, currentTickNb);
            tickEngine.Resume();
            Thread.Sleep(TickEngine.TICK_MILLISECONDS * 3);

            Assert.GreaterOrEqual(test.tickCalled, 4);
            tickEngine.Dispose();
        }
예제 #18
0
        public virtual void Run(ModelInterface model)
        {
            engine = Factory.Engine.TickEngine;
            ProjectProperties.Engine.CopyProperties(engine);
            // Chaining of models.
            engine.Model           = model;
            engine.ChartProperties = ProjectProperties.Chart;
            engine.SymbolInfo      = ProjectProperties.Starter.SymbolProperties;

            engine.IntervalDefault  = ProjectProperties.Starter.IntervalDefault;
            engine.EnableTickFilter = ProjectProperties.Engine.EnableTickFilter;

            engine.Providers        = SetupProviders(false, false);
            engine.BackgroundWorker = BackgroundWorker;
            engine.RunMode          = runMode;
            engine.StartCount       = StartCount;
            engine.EndCount         = EndCount;
            engine.StartTime        = ProjectProperties.Starter.StartTime;
            engine.EndTime          = ProjectProperties.Starter.EndTime;

            if (CancelPending)
            {
                return;
            }

            engine.TickReplaySpeed     = ProjectProperties.Engine.TickReplaySpeed;
            engine.BarReplaySpeed      = ProjectProperties.Engine.BarReplaySpeed;
            engine.ShowChartCallback   = ShowChartCallback;
            engine.CreateChartCallback = CreateChartCallback;
            log.Info("Setting engine create chart callback = " + engine.CreateChartCallback);

            engine.Run();

            if (CancelPending)
            {
                return;
            }
        }
예제 #19
0
        public override void Run(ModelInterface model)
        {
            Factory.SysLog.ResetConfiguration();
            engine              = Factory.Engine.TickEngine;
            engine.MaxBarsBack  = 2;
            engine.MaxTicksBack = 2;
            SymbolInfo symbolInfo = Factory.Symbol.LookupSymbol("Design");

            engine.SymbolInfo       = new SymbolInfo[] { symbolInfo };
            engine.Providers        = SetupProviders(false, false);
            engine.IntervalDefault  = ProjectProperties.Starter.IntervalDefault;
            engine.RunMode          = RunMode.Historical;
            engine.EnableTickFilter = ProjectProperties.Engine.EnableTickFilter;

            if (CancelPending)
            {
                return;
            }

            engine.Model = model;

            engine.QueueTask();
            engine.WaitTask();
        }
예제 #20
0
        public TickEngine SetupEngine(bool quietMode, string name)
        {
            if (ProjectProperties.Starter.SymbolProperties.Length == 0)
            {
                throw new TickZoomException("Please enter at least one symbol.");
            }
            TickEngine engine = Factory.Engine.TickEngine(name);

            ProjectProperties.Engine.CopyProperties(engine);
            engine.ChartProperties = ProjectProperties.Chart;
            engine.SymbolInfo      = ProjectProperties.Starter.SymbolProperties;

            engine.IntervalDefault  = ProjectProperties.Starter.IntervalDefault;
            engine.EnableTickFilter = ProjectProperties.Engine.EnableTickFilter;

            engine.BackgroundWorker = BackgroundWorker;
            engine.DesiredRunMode   = RunMode.Historical;
            engine.StartCount       = StartCount;
            engine.EndCount         = EndCount;
            engine.StartTime        = ProjectProperties.Starter.StartTime;
            engine.EndTime          = ProjectProperties.Starter.EndTime;
            engine.DataFolder       = dataFolder;

            if (quietMode)
            {
                engine.QuietMode = true;
                log.Info("Setting engine for quiet mode.");
            }
            else
            {
                engine.ShowChartCallback   = ShowChartCallback;
                engine.CreateChartCallback = CreateChartCallback;
                log.Info("Setting engine create chart callback = " + engine.CreateChartCallback);
            }
            return(engine);
        }
예제 #21
0
        public override void Run(ModelLoaderInterface loader)
        {
            Factory.SysLog.ResetConfiguration();
            try {
                if (loader.OptimizeOutput == null)
                {
                    Directory.CreateDirectory(Path.GetDirectoryName(FileName));
                    File.Delete(FileName);
                }
            } catch (Exception ex) {
                log.Error("Error while creating directory and deleting '" + FileName + "'.", ex);
                return;
            }
            this.loader           = loader;
            this.loader.QuietMode = true;
            startMillis           = Factory.TickCount;
            engineIterations      = new List <TickEngine>();

            loader.OnInitialize(ProjectProperties);

            totalTasks = 0;

            foreach (var num in RecursiveOptimize(0))
            {
                totalTasks++;
            }

            tasksRemaining = totalTasks;

            int tasksPerEngine = CalculateTasksPerEngine(totalTasks);

            int iterations     = Math.Max(1, totalTasks / maxParallelPasses);
            int leftOverPasses = Math.Max(0, totalTasks - (maxParallelPasses * iterations));

            if (totalTasks % maxParallelPasses > 0)
            {
                log.Notice("Planning " + iterations + " iterations with " + maxParallelPasses + " passes plus 1 pass with " + leftOverPasses + " iterations.");
            }
            else
            {
                log.Notice("Planning " + iterations + " iterations with " + maxParallelPasses + " passes each.");
            }

            ModelInterface topModel = new Portfolio();

            passCount = 0;
            foreach (var num in RecursiveOptimize(0))
            {
                ModelInterface model = ProcessLoader(loader, passCount);
                topModel.Chain.Dependencies.Add(model.Chain);
                passCount++;
                if (passCount % tasksPerEngine == 0)
                {
                    TickEngine engine = ProcessHistorical(topModel, true);
                    engine.QueueTask();
                    engineIterations.Add(engine);
                    topModel = new Portfolio();
                    if (engineIterations.Count >= Environment.ProcessorCount)
                    {
                        ProcessIteration();
                    }
                }
            }

            if (topModel.Chain.Dependencies.Count > 0)
            {
                TickEngine engine = ProcessHistorical(topModel, true);
                engine.QueueTask();
                engineIterations.Add(engine);
            }

            if (engineIterations.Count > 0)
            {
                ProcessIteration();
            }

            long elapsedMillis = Factory.TickCount - startMillis;

            log.Notice("Finished optimizing in " + elapsedMillis + "ms.");
        }
예제 #22
0
 public BaseDirectXOverlay()
 {
     _tickEngine = new TickEngine();
 }
예제 #23
0
        public override void Run(ModelLoaderInterface loader)
        {
            Factory.SysLog.ResetConfiguration();
            this.loader = loader;

            try {
                if (loader.OptimizeOutput == null)
                {
                    Directory.CreateDirectory(Path.GetDirectoryName(FileName));
                    File.Delete(FileName);
                }
            } catch (Exception ex) {
                log.Error("Error while creating directory and deleting '" + FileName + "'.", ex);
                return;
            }

            log.Notice("Beginning Genetic Optimize of: ");
            log.Notice(loader.Name + " model loader. Type: " + loader.GetType().Name);
            loader.QuietMode = true;

            loader.OnInitialize(ProjectProperties);

            optimizeVariables = new List <ModelProperty>();
            for (int i = 0; i < loader.Variables.Count; i++)
            {
                ModelProperty var = loader.Variables[i];
                if (var.Optimize)
                {
                    optimizeVariables.Add(var);
                }
            }

            // Get Total Number of Bits
            int totalBits = 0;

            for (int i = 0; i < optimizeVariables.Count; i++)
            {
                ModelProperty var  = optimizeVariables[i];
                int           bits = Convert.ToString(var.Count - 1, 2).Length;
                totalBits += bits;
            }

            if (optimizeVariables.Count == 1)
            {
                generationCount = 1;
            }

            // Get the highest count.
            populationCount = totalPasses / generationCount;
            tasksRemaining  = totalPasses;

            log.Notice("Assigning genomes.");

            // Create initial set of random chromosomes.
            generation = new List <Chromosome>();
            // This list assures we never retry a previous one twice.
            alreadyTried = new List <Chromosome>();

            // Create a genome holder.
            int[] genome = new int[optimizeVariables.Count];

            // Indexes for going through randomList
            int[] indexes = new int[optimizeVariables.Count];

//			for( int repeat=0; repeat < Math.Min(optimizeVariables.Count,2); repeat++) {
//
            //Get random values for each.
            List <List <int> > randomLists = new List <List <int> >();

            for (int i = 0; i < optimizeVariables.Count; i++)
            {
                randomLists.Add(GetRandomIndexes(optimizeVariables[i]));
            }

            // Create initial population
            for (int loop = 0; loop < populationCount; loop++)
            {
                // Set the genome from the randomLists using the indexes.
                for (int i = 0; i < optimizeVariables.Count; i++)
                {
                    genome[i] = randomLists[i][indexes[i]];
                }

                Chromosome chromosome = new Chromosome(genome);
                log.Debug(chromosome.ToString());
                generation.Add(chromosome);
                alreadyTried.Add(chromosome);
                for (int i = 0; i < indexes.Length; i++)
                {
                    indexes[i]++;
                    ModelProperty var = optimizeVariables[i];
                    if (indexes[i] >= populationCount)
                    {
                        indexes[i] = 0;
                    }
                }
            }
//			}

                        #if CLRPROFILER
            CLRProfilerControl.LogWriteLine("Entering Genetic Loop");
            CLRProfilerControl.AllocationLoggingActive = true;
            CLRProfilerControl.CallLoggingActive       = false;
                        #endif

            int totalEngineCount = Environment.ProcessorCount * generationCount;

            // Pre-setup engines. This causes the progress
            // bar to show a complete set of information for all
            // generations.
            var engines = new Stack <TickEngine>();
            for (int i = 0; i < totalEngineCount; i++)
            {
                engines.Push(SetupEngine(true));
            }

            for (int genCount = 0; genCount < generationCount && !CancelPending; genCount++)
            {
                // Assign fitness values
                var topModels = new List <ModelInterface>();
                for (int i = generation.Count - 1; i >= 0; i--)
                {
                    Chromosome chromosome = generation[i];
                    if (!chromosome.FitnessAssigned)
                    {
                        ModifyVariables(chromosome);
                        var model = ProcessLoader(loader, i);
                        topModels.Add(model);
                    }
                    else
                    {
                        tasksRemaining--;
                        log.Debug("Saves processing on " + chromosome + "!");
                    }
                }

                int tasksPerEngine = CalculateTasksPerEngine(topModels.Count);

                ModelInterface topModel  = new Portfolio();
                int            passCount = 0;
                foreach (var model in topModels)
                {
                    topModel.Chain.Dependencies.Add(model.Chain);
                    passCount++;
                    if (passCount % tasksPerEngine == 0)
                    {
                        var engine = engines.Pop();
                        engine.Model = topModel;
                        engine.QueueTask();
                        engineIterations.Add(engine);
                        topModel = new Portfolio();
                        if (engineIterations.Count >= Environment.ProcessorCount)
                        {
                            ProcessIteration();
                        }
                    }
                }

                if (topModel.Chain.Dependencies.Count > 0)
                {
                    TickEngine engine = ProcessHistorical(topModel, true);
                    engine.QueueTask();
                    engineIterations.Add(engine);
                }

                if (engineIterations.Count > 0)
                {
                    ProcessIteration();
                }

                generation.Sort();

                log.Notice("After sorting generation...");
                double maxFitness = 0;
                for (int i = 0; i < generation.Count; i++)
                {
                    log.Debug(generation[i].ToString());
                    maxFitness = Math.Max(generation[i].Fitness, maxFitness);
                }
                // If none of the genes in the chromosome
                // had a positive fitness, stop here.
                if (maxFitness <= 0)
                {
                    break;
                }

                List <Chromosome> newGeneration = new List <Chromosome>();
                log.Notice("Crossover starting...");
                while (newGeneration.Count < populationCount - 1)
                {
                    Chromosome chromo1 = Roulette();
                    Chromosome chromo2;
                    do
                    {
                        chromo2 = Roulette();
                    } while(chromo2.Equals(chromo1));

                    log.Debug("Before: " + chromo1 + " - " + chromo2);
                    chromo1.DoubleCrossOver(chromo2);
                    log.Debug("After: " + chromo1 + " - " + chromo2);

                    if (alreadyTried.Contains(chromo1))
                    {
                        chromo1 = alreadyTried[alreadyTried.IndexOf(chromo1)];
                    }
                    else
                    {
                        alreadyTried.Add(chromo1);
                    }
                    if (alreadyTried.Contains(chromo2))
                    {
                        chromo2 = alreadyTried[alreadyTried.IndexOf(chromo2)];
                    }
                    else
                    {
                        alreadyTried.Add(chromo2);
                    }
                    newGeneration.Add(chromo1);
                    newGeneration.Add(chromo2);
                }
                generation = newGeneration;
            }

            GetEngineResults();

            WriteEngineResults(loader, engineIterations);

            engineIterations.Clear();

                        #if CLRPROFILER
            CLRProfilerControl.AllocationLoggingActive = false;
            CLRProfilerControl.CallLoggingActive       = false;
            CLRProfilerControl.LogWriteLine("Exiting Genetic Loop");
                #endif

            log.Notice("Genetic Algorithm Finished.");
        }