2024年6月17日月曜日

遺伝的アルゴリズム2

遺伝的アルゴリズムは最適化問題を解くための手法です。

概要は一つ前のブログを御覧ください。

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 件のコメント:

コメントを投稿