記事"制御された最適化: シミュレーティットアニーリング"についてのディスカッション

 

新しい記事 制御された最適化: シミュレーティットアニーリング はパブリッシュされました:

MetaTrader5トレーディングプラットフォームのストラテジーテスターは、パラメータと遺伝的アルゴリズムの完全な検索、つまり、2 つの最適化オプションのみを提供します。 この記事では、トレーディング戦略を最適化するための新しいメソッドを提案します (シミュレーティットアニーリング)。 このメソッドのアルゴリズム、実装、およびEAへの統合を考察します。 開発したアルゴリズムは移動平均 EA でテストします。

最適化するパラメータを持つエキスパートにアルゴリズムを統合する実装と手順を考えてみましょう。

アルゴリズムの実装は、最適化されたEAに含める必要があり、2つの新しいクラスが必要になります。

  • AnnealingMethod.mqh クラス-アルゴリズムの個別のステップを実装するメソッドのセットです。
  • FrameAnnealingMethod.mqh クラス-ターミナルチャートに表示されるグラフィカルインターフェイスの操作メソッドです。

また、このアルゴリズムの操作には、OnTester、OnTesterInit、OnTesterDeInit、OnTesterPass 関数を EA コードに追加するための追加のコードがあります。 このアルゴリズムをエキスパートに統合するプロセスを図2に示します。


図2. EAのアルゴリズムを含む

作者: Aleksey Zinovik

 

この記事は興味深く、とても参考になりました。しかし、疑問があります。このコードでは実数の比較はどの程度正しいのでしょうか?

double AnnealingMethod::FindValue(double val,double step)
  {
   double buf=0;
   if(val==step)
      return val;
   if(step==1)
      return round(val);
 
欠席
Images\AnnealingMethod\back.bmp
Images\AnnealingMethod\pause.bmp
Images\AnnealingMethod\play.bmp
Images\AnnealingMethod\stop.bmp
Images\AnnealingMethod\forward.bmp
 

メッセージをありがとう。

AnnealingMethod.zip
Zip-файл с картинками для создания интерфейса плеера. Файлы нужно разместить в папке MQL5/Images/AnnealingMethod


 

これは良い記事だった。著者に感謝する!

私はまだ少し混乱していますが、それについて言いたいことがあります。

Несмотря на значительные преимущества, алгоритм метода отжига имеет следующие недостатки реализации:

  • クラウドテストでアルゴリズムを実行できないこと;
  • Expert Advisorへの接続の複雑さ、最良の結果を得るためのパラメータ選択の必要性。

この記事を少し修正して、どんなExpert Advisorでも小さな動きで接続できるようにすることを提案します。

例えば、標準的なMoving Average.mq5をアニーリング法の実装に接続することができます。

//+------------------------------------------------------------------+
//|移動平均。mq5|移動平均。
//| Copyright 2009-2017, MetaQuotes Software Corp.
//|http://mql5.commql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>

input double MaximumRisk        = 0.02;    // 最大リスク(パーセンテージ
input double DecreaseFactor     = 3;       // デクリース係数。
input int    MovingPeriod       = 12;      // 移動平均期間
input int    MovingShift        = 6;       // 移動平均シフト

// すべての入力の後に挿入する
#include <AddAnnealingMethod.mqh>
#define  MaximumRisk         Inputs[0]
#define  DecreaseFactor      Inputs[1]
#define  MovingPeriod   (int)Inputs[2]
#define  MovingShift    (int)Inputs[3]

//---
int    ExtHandle=0;
bool   ExtHedging=false;
CTrade ExtTrade;

#define  MA_MAGIC 1234501

以上です!これ以上の操作は必要ありません。これを動作させるためには、1つの関数を少し変更する必要がありました。

最適化パラメータを設定する //関数
uint AnnealingMethod::RunOptimization(string &InputParams[],int count,double F0,double T)
  {
   Input Mass[];
   ArrayResize(Mass, ArraySize(InputParams));
   
   ResetLastError();
   bool Enable=false;
   double Start= 0;
   double Stop = 0;
   double Step = 0;
   double Value= 0;
   int j=0;
   Alg.HQRndRandomize(&state);//初期化
   for(int i=0;i<ArraySize(InputParams);i++)
     {
      if(!ParameterGetRange(InputParams[i],Enable,Value,Start,Step,Stop))
         return GetLastError();
// if(Enable)
        {
// ArrayResize(Mass,ArraySize(Mass)+1);
         Mass[j].num=i;
// Mass[j].Value=UniformValue(Start,Stop,Step);
         Mass[j].Value=Enable ? UniformValue(Start,Stop,Step) : Value;
         Mass[j].BestValue=Mass[j].Value;
         Mass[j].Start=Start;
         Mass[j].Stop=Stop;
         Mass[j].Step=Step;
         Mass[j].Temp=T*Distance(Start,Stop);
         j++;
// if(!ParameterSetRange(InputParams[i],false,Value,Start,Stop,count)))。
         if(Enable && !ParameterSetRange(InputParams[i],false,Value,Start,Step,Stop))
            return GetLastError();
        }
// さもなければ
// InputParams[i]=""";
     }
   if(j!=0)
     {
      if(!ParameterSetRange("iteration",true,1,1,1,count))
         return GetLastError();
      else
         return WriteData(Mass,F0,1);
     }
   return 0;
  }

そして、AddAnnealingMethod.mqhに コードの一部を隠します。

ファイル:
 

Таким образом, алгоритм сверхбыстрого отжига — достойный конкурент ГА и при правильных настройках может показать лучший результат.

どのような「正しい」設定で?

最適化アルゴリズムのポイントは、探索空間を縮小することである。探索が 進行中である場合、それはFF公式が知られていないことを意味し(そうでなければ、FFベースの公式を使用して極値を計算することができる)、したがって「正しい設定」は存在しない。

アルゴリズムは、他のすべての条件が同じか、より悪いかのどちらかを探すので、少し妊娠していることは不可能である。

通常のGAと他のAOを様々なテストで比較する試みが実際に行われた。

最適化可能なパラメーターが1つ、2つ?アニーリングで数百、数千のパラメーターを最適化してみろ。目が覚めますよ。

 

tester_fileは、コンパイル時に存在した場合のみ読み込まれる(内容は重要ではない)。

対応するファイルが存在しない時にmq5がコンパイルされた場合、EX5ではそれ以降の存在すら認識されない。

したがって、OnTesterInitでtester_file用のファイルを生成する場合は、少なくとも空の渡されたファイルがあるときにEAをコンパイルするようにしてください。


Renat Fatkhullin 氏の発言は少々間違っています。

取引、自動取引システム、取引戦略のテストに関するフォーラム

DLL関数のないEAはどこかにデータを送ることができますか?

Renat Fatkhullin, 2017.06.21 11:12 AM

fxsaber:

確認はしていませんが、このファイルはOnTesterInitで直接生成できるものと思われます。

いいえ、パス自体の計算データパケットには入りません。


この記事では、OnTesterInit がエージェントへ送信するデータをファイルとして完全に生成することを示しています。このデータが個人的な性質のものであることは明らかです。

 

著者は素晴らしい仕事をした。とても興味深い記事だ。

ありがとう。

 
Andrey Dik:

通常のGAと他のAOを様々なテストで比較する試みが実際に行われてきた。神々は言った-一輪車は存在しない、それにアーメンと。

最適化可能なパラメーターが1、2個?アニーリングで数百、数千のパラメーターを最適化してみろ。あなたの目が開かれるでしょう。

この記事の価値は、最適化アルゴリズムにあるのではなく(それは興味深いものではあるが)、標準的なオプティマイザーに組み込まれている実装にある。その実装は現時点では非常に非標準的で、開発者の発言と矛盾しているものさえある。しかし、それを理解するにはソースコードを読む必要があり、アニーリングアルゴリズム自体には関係ありません。

著者が行ったように、同様に独自のアルゴリズムを組み込み、その長所/短所をエキスパートアドバイザーに直接表示することを妨げるものは何もありません。

 
Sergey Pavlov:

この記事は興味深く、とても参考になりました。しかし、疑問があります。このコードでは実数の比較はどの程度正しいのでしょうか?

その通り、このような比較は不可能です。MQL5のヘルプでは、以下の関数を使うことを勧めています:

bool CompareDoubles(double number1,double number2) 
  { 
   if(NormalizeDouble(number1-number2,8)==0) return(true); 
   else return(false); 
  } 

しかし、たとえ比較が間違って実行されたとしても、FindValue関数は正しい結果を生成します。

 
fxsaber:

この記事の価値は、最適化アルゴリズムにあるのではなく(それ以上に興味深いものではあるが)、標準のオプティマイザーに組み込まれている実装にある。その実装は現時点では非常に非標準的で、開発者の発言と矛盾しているものさえある。しかし、それを理解するためには、アニーリングアルゴリズム自体には関係ないソースを読む必要がある。

著者が行ったように、同様に独自のアルゴリズムを組み込み、その長所/短所をExpert Advisors上で直接示すことを妨げるものは何もない。

この記事が最適化管理の 実装において価値あるものであることは明らかだが、著者は何らかの理由で標準的なアルゴリズムと比較しており、しかも無視できる程度のパラメータ数で比較している。これは私が投稿で強調しようとしたことであり、アルゴトレーダーの実用的な目的に十分な探索空間範囲(パラメータ数とそのステップ)で標準的なオプティマイザーと競合することは無意味である。

なぜなら、スピードの「ボトルネック」はAOではなくテスターそのものだからだ。