Beispiel #1
0
        public Chrome2 startGA(int from, int to, int numbox, int num_chrom, int num_generation, int num_island, double immig_rate, int elite_crossover_generation, double pl_per_min_importance, double num_trade_importance, double pl_vola_importance, bool writelog)
        {
            Form1.Form1Instance.setLabel("GA - from:" + TickData.time[from].ToString() + " to:" + TickData.time[to].ToString());

            initialize(num_chrom, num_island);
            generateIsland(num_chrom, num_island, from, to, numbox);

            for (int i = 0; i < num_generation; i++)
            {
                for (int j = 0; j < num_island; j++)
                {
                    islands[j].evaluateChrom(i, pl_per_min_importance, num_trade_importance, 0, pl_vola_importance);
                    islands[j].roulettteSelectionNonElite(i, elite_crossover_generation);
                    islands[j].crossOver();
                    islands[j].mutation();
                    islands[j].goToNextGeneration();
                }
                immigration(immig_rate, num_island, num_chrom);
                checkBestChrome(i);

                var s = new SIMGA2();
                s.startContrarianTrendFollowSashine(from, to, best_chrome[best_chrome.Count - 1]);
                Form1.Form1Instance.addListBox("#" + i.ToString() + ", pl per min=" + Math.Round(best_ac[best_ac.Count - 1].pl_per_min, 2).ToString() + ", num trade per hour=" + Math.Round(best_ac[best_ac.Count - 1].num_trade_per_hour, 2).ToString()
                                               + ", total pl vola=" + Math.Round(best_ac[best_ac.Count - 1].total_pl_vola, 2).ToString());
            }

            if (writelog)
            {
                writeResults();
            }

            return(best_chrome[num_generation - 1]);
        }
Beispiel #2
0
        public void evaluateChrom(int num_generation, double pl_per_min_importance, double num_trade_importance, double profit_factor_importance, double pl_vola_importance)
        {
            //do sim for all chromes
            eva     = new List <double>();
            ac_list = new Dictionary <int, AccountGA2>();
            Parallel.For(0, chromes.Count, i => {
                SIMGA2 sim = new SIMGA2();
                addAcList(i, sim.startContrarianTrendFollowSashine(from, to, chromes[i]));
            });


            //calc for performance eva
            var aclists = new List <AccountGA2>();

            for (int i = 0; i < chromes.Count; i++)
            {
                aclists.Add(ac_list[i]);
            }

            var pl_per_min    = aclists.Select(x => x.pl_per_min).ToList();
            var num_trade     = aclists.Select(x => x.num_trade_per_hour).ToList();
            var profit_factor = aclists.Select(x => x.profit_factor).ToList();
            var pl_vola       = aclists.Select(x => (1.0 / x.total_pl_vola)).ToList();

            if (num_generation == 0)
            {
                min_pl_per_min  = pl_per_min.Min();
                max_pl_per_min  = (pl_per_min.Max() - min_pl_per_min) * 10000;
                base_pl_per_min = (pl_per_min_importance * max_pl_per_min) / (pl_per_min.Max() - min_pl_per_min);

                min_num_trade  = num_trade.Min();
                max_num_trade  = (num_trade.Max() - min_num_trade) * 10000;
                base_num_trade = (num_trade_importance * max_num_trade) / (num_trade.Max() - num_trade.Min());

                min_profit_factor  = profit_factor.Min();
                max_profit_factor  = (profit_factor.Max() - min_profit_factor) * 10000;
                base_profit_factor = (profit_factor_importance * max_profit_factor) / (profit_factor.Max() - profit_factor.Min());

                min_pl_vola  = pl_vola.Min();
                max_pl_vola  = (pl_vola.Max() - min_pl_vola) * 10000;
                base_pl_vola = (pl_vola_importance * max_pl_vola) / (pl_vola.Max() - pl_vola.Min());
            }

            for (int i = 0; i < aclists.Count; i++)
            {
                double eva_pl_per_min    = (pl_per_min[i] >= min_pl_per_min) ? base_pl_per_min * (pl_per_min[i] - min_pl_per_min) / max_pl_per_min : min_pl_per_min;
                double eva_num_trade     = (num_trade[i] >= min_num_trade) ? base_num_trade * (num_trade[i] - min_num_trade) / max_num_trade : min_num_trade;
                double eva_profit_factor = (profit_factor[i] >= min_profit_factor) ? base_profit_factor * (profit_factor[i] - min_profit_factor) / max_profit_factor : min_profit_factor;
                double eva_pl_vola       = (pl_vola[i] >= min_pl_vola) ? base_pl_vola * (pl_vola[i] - min_pl_vola) / max_pl_vola : min_pl_vola;

                eva.Add(pl_per_min_importance * calcPowerFunction(2, eva_pl_per_min) + num_trade_importance * calcLN(eva_num_trade) + pl_vola_importance * calcLinerFunction(1, eva_pl_vola));
            }

            //check for max eva inde
            double max = eva.Max();
            var    m   = eva.Select((p, i) => new { Content = p, Index = i })
                         .Where(ano => ano.Content >= max)
                         .Select(ano => ano.Index).ToList();

            best_chrom_ind.Add(m[0]);
            best_eva_log.Add(eva[m[0]]);
            best_ac_log.Add(aclists[m[0]]);
        }