遺伝的アルゴリズムは最適化問題を解くための手法です。
概要は一つ前のブログを御覧ください。
OnTester()で使うコードを作成しました。
関数の想定最大値(~Max)と最小値(~Min)は最適化するEAに合わせる必要があります。
ex)利益(Profit)の設定:利益の最大値は3,000,000、最小は初期証拠金が1,000,000のため、-1,000,000と設定しています。
この最大値と最小値の幅が実際の数値に近いほど、アルゴリズムの精度が高くなると考えられます。
間違えなどありましたら教えてください。(^^;)
double OnTester()
{
//想定最大値、最小値
double Profit_Max=3000000;
double Profit_Min=-1000000;
double PF_Max=2;
double PF_Min=0;
double EX_Max=500;
double EX_Min=-500;
double DD_Max=1000000;
double DD_Min=-1000000;
double Trades_Max=10000;
double Trades_Min=0;
//値の取得
double Profit=TesterStatistics(STAT_PROFIT);
double PF=TesterStatistics(STAT_PROFIT_FACTOR);
double Ex_Payoff=TesterStatistics(STAT_EXPECTED_PAYOFF);
double DD=TesterStatistics(STAT_BALANCE_DD);
double Trades=TesterStatistics(STAT_TRADES);
//値が想定最大値、最小値の範囲を逸脱した場合修正
Profit=MathMin(Profit,Profit_Max);
Profit=MathMax(Profit,Profit_Min);
PF=MathMin(PF,PF_Max);
PF=MathMax(PF,PF_Min);
Ex_Payoff=MathMin(Ex_Payoff,EX_Max);
Ex_Payoff=MathMax(Ex_Payoff,EX_Min);
DD=MathMin(DD,DD_Max);
DD=MathMax(DD,DD_Min);
Trades=MathMax(Trades,Trades_Max);
Trades=MathMin(Trades,Trades_Min);
//標準化(各数字を0~1の範囲に標準化する)
double ProfitNM =(Profit-Profit_Min) / (Profit_Max-Profit_Min);
double PFNM =(PF-PF_Min) / (PF_Max-PF_Min);
double ExNM =(Ex_Payoff-EX_Min) / (EX_Max-EX_Min);
double DDNM =(DD_Max-DD) / (DD_Max-DD_Min);//DDは小さいほうがいい
double TradesNM =(Trades-Trades_Min) / (Trades_Max-Trades_Min);
//平均二乗誤差でコスト計算&返す(コストは小さいほど優秀なので1/コスト)
return 1/(pow(1-ProfitNM,2)+pow(1-PFNM,2)+pow(1-ExNM,2)+pow(1-DDNM,2)+pow(1-TradesNM,2));
}
0 件のコメント:
コメントを投稿