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]); }
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]]); }