English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
EAのパラメータの選択における テスト(最適化) テクニックとその基準

EAのパラメータの選択における テスト(最適化) テクニックとその基準

MetaTrader 4テスター | 6 2月 2013, 13:24
2 709 0
Rider
Rider

イントロダクション

EAのトレードロジックと比較して、パラメータの選定はあまり重要ではないように扱われています。このことは、フォーラムにおける大量の件名をみれば明らかです。トレードオペレーションの自動化は、かなりはっきりと見えますが、完璧に論理的に最適化されたアルゴリズムに出会ったことはありません。

プロセスが非常に難しいと時間がかかるため、すべてのトランザクションを自動化し、1つの単一のアルゴリズムに削減する努力に値することを認めなければなりません。このアプローチとメソッドをこの記事で紹介します。

コンセプト

タスク。分析と最適化中に受信した、実際のトレードの有効でないパラメータのスクリーニング。ターミナルの性能と操作の自動化を最大限に活用します。

全体のプロセスは、いくつかのステージで構成されています。最適化段階でシステムのパラメータに必要な要件 (フィルター) を定義することができません。一般的に、その必要はありません。

個人的な意見としては、マシンが取る戦略的意思決定は「最も良い方法」ではありません。パラメータ (パラメータ グループ) の選択こそが、戦略です。運用ルールの決定にトレーダーが従う必要があります。

すべてのステージの実用的な段階が自動化されています。

第 1 段階。最適化 省略可能な標準的なバリアントです。

また、これは外すことはできません。
遺伝的手法は、便利で合理的です。実際は、このアルゴリズムは利益になる組み合わせを発見すると、その周辺でのみ探索するようになります。これが何をもたらすかお分かりかと思います。本当に良い変化が取り残される可能性があり、その結果は「最適化結果」テーブルには登録されません。

いくつかの方法があります。抜本的な1つの方法は、遺伝的アルゴリズムを使用することです。しかし、 必ずしも最適だとは言えません。2つ目は半分有効ですが、何もしないよりはマシです。

-複数回最適化を実行します。最初は、「残高」、次は「最大ドローダウン」またはその他パラメータにしましょう。EA プロパティの「テスト」タブの「最適化パラメータ」ウィンドウでそのような選択をします。その後、結果の受信テーブルを結合し、結合されたテーブルで作業します。

-パラメータの組み合わせの数を最大限に減らすためです。

最適化を実装する場合、考慮する別のものがあります。便利なものがあります。

EA プロパティの「最適化」タブでさまざまな制限を設定できます。まずは、「最大ドローダウン」について説明したいと思います。このパラメータを使用して、現在のバランスのドローダウンであることを覚えておいてください。何を考慮に入れられなければならないでしょうか。例えば、10%を制限として設定し、初期証拠金を10000にして15000まで達した場合、最初の1000は1500になります。最初の資産に反応します。1000000の初期証拠金と0.1%の限度を設定すると、これは約1,000のままです。


第2段階。「最適化結果」の操作をします. すべての結果は、Excel にコピーされ、そこで処理されます。多くのセットがあるので、減らすべきです。「カット」は、レポートの任意の列に対して実行できます。


ステージ3。テスト. 「作成した」セットの自動グループ テストを実行前の段階のテストの履歴の一部を選択します。グループ テストです。この段階では、全てのテストを個別に検討する必要はありません。ポイントは一度に設定した残りのすべてのテスト結果を得ることです。ターミナルが実際に同じような最適化を実装し、作成済みファイルからパラメータが使用されます。

ステージ2と同様に、すべての受信結果は、最適化結果を含む同じ Excel のテーブルにコピーされます。


ステージ4。分析とスクリーニング

明らかに、損失を生むテスト結果は、情け容赦なく破棄 (削除された行数) されます。問題は、残りのものをどう評価するかです。

多くの場合、視覚的なバランスグラフのレポートに等しく、時には数字ではなく、よりよい考えを与えられることがあります。原則として、曲線が「良い」く見えれば、レポートの数字も「良い」です。しかし、連続的な成長を欠いている場合でも、良いことがあります。

個別にレポートを分析し、すべてのグラフを見てテストすることは非常に難しいです。1つに頑固になれば、どんどん止まらなくなります。

この問題を回避するため、セットの数を削減するために、比較対象領域に適用される「」の条件をします。3つの値が比較されます: 最適化でそれぞれ、1 日あたりの利益、最大ドローダウン、トレード数です。大まかに、特定の許容リミット内にある場合、さらに分析から除外されます。特定の条件下でより具体的に、テストが非常に長い場合、ある程度生じる「滑らかな」バランス曲線のアイデアがあります。

ステージ3と4が、ヒストリーのさまざまな部分でまず、選択した結果の信頼性を確認するために減らします。残りの 3-5 は、最終的な選択です。

ステージ 3 と 4 の完了は、比較、選択などの任意の部分で個々のテストの実装が含まれます。

基本的に、すべてトレーダーの好みの問題ですが、それはこの記事の範囲外です。

テクニック

必要なものは注意と精度です。さぁ、始めましょう。

1. コンピューターの構成- コントロール パネル/ローカルと言語オプション/ローカルオプション/ロシア語カスタマイズ/数値/小数シンボルではなく「コンマ」「ポイント」を選択する必要があります。正確なデータ、Excel テーブルにターミナルから (テスト) 最適化結果のコピーします。

-マイクロソフト ・ オフィス (Excel) バージョン 2000以上のものが 、コンピューターにインストールされている必要があります。

マクロは、Excel のセキュリティ設定で有効にする必要があります。Analise.bas (記事に添付) モジュールをインポートする必要があります。モジュールとその構造は、普通のユーザーが何かを変更したり編集したりする必要はないので、この記事では扱いません。

2. EAの準備

EAの例は、添付ファイルで利用できます。

コードの初めに、外部パラメータの次に挿入する必要があります。

//テストと最適化パラメータ
extern int          VarOptimTest    = 0;       //0 - 標準的な最適化 (EAの通常の動作)
                                                                     //1-選択したセットのテストの実行         
                                                                     //2 設定ファイルの生成
extern int          Counter              = 1;       //カウンター
extern string       nameEA          = "MA";  //EA名


これらの変数は、最適化、およびテスト モードを制御します。

init()関数は次のようになります。

int init() 
{
   //最適化、テスト関数の呼び出しのブロック
   if(IsOptimization() && VarOptimTest !=0)
      {
      if (VarOptimTest == 1 && Counter !=0) _ReadParametrs();
      if (VarOptimTest == 2 && Counter !=0)
         _ReadParametrs(); _WriteSet();}
      }   
...........
...........
return (0);
} 


ここで全体のプロセスのオートメーションを確保し、2 つの関数が呼び出されます。

Start()に次の行を追加。

int start() 
{
   if(IsOptimization() && VarOptimTest ==2) return(0);
..........

1. パラメータ (テスト) の最適化結果の分析後に、Excel ファイルを読み取るための関数を読みます。

関数の変数の部分は太字です。同じ構造と構文が、正確かつ慎重に最適化のための責任を負います。bool型とstring型、最初の 3 つを除いてEAのすべての入力パラメーターをリストする必要があり、その変数を入力します。

void  _ReadParametrs()
{
   string FileName="test.csv";
   int handle=FileOpen(FileName,FILE_READ||FILE_CSV);//'');
   if(handle<1) return(0);
   FileSeek(handle,0,SEEK_SET);
   int str = StrToInteger(FileReadString(handle)); 
   int data = StrToInteger(FileReadString(handle)); 
   if (data < Counter) 
      {
      Alert("Incorrect number of test runs entered. Sorry");
      return(0);
      }
   for (int y=1; y <=Counter; y++)
      {
      for (int x=1; x <= str; x++)
         {
         string s = FileReadString(handle); 
         string ds = FileReadString(handle); 
         if (y != Counter) continue;
         s=StringTrimLeft(s);s=StringTrimRight(s);
         ds = StringTrimLeft(ds);ds=StringTrimRight(ds);
         double d = StrToDouble(ds);

         if (s == "Lots"){Lots=d;continue;}
         if (s == "MaximumRisk"){MaximumRisk=d;continue;}
         if (s == "DecreaseFactor"){DecreaseFactor=d;continue;}
         if (s == "MovingPeriod"){MovingPeriod=d;continue;}
         if (s == "MovingShift"){MovingShift=d;continue;}
         
         }
      }
   FileClose(handle);
  return(0);
}


2. Set-ファイルの生成と関数を記述します。その構造は、EA セット ファイル構造を反映する必要があります。関数の変数の部分は太字です。

void  _WriteSet ()
{
   string FileName=nameEA+"_"+Symbol()+Period()+"_"+Counter+".set";
   int handle=FileOpen(FileName,FILE_WRITE|FILE_CSV);
   if(handle<1) return(0);

   FileWrite(handle,"VarOptimTest="+0);
   FileWrite(handle,"VarOptimTest,F="+0);
   FileWrite(handle,"VarOptimTest,1="+0);
   FileWrite(handle,"VarOptimTest,2="+0);
   FileWrite(handle,"VarOptimTest,3="+0);
   
   FileWrite(handle,"Counter="+0);
   FileWrite(handle,"Counter,F="+0);
   FileWrite(handle,"Counter,1="+1);
   FileWrite(handle,"Counter,2="+1);
   FileWrite(handle,"Counter,3="+100);

   FileWrite(handle,"nameEA="+nameEA+"_"+Symbol()+Period()+"_"+Counter);

   FileWrite(handle,"Lots="+Lots);
   FileWrite(handle,"Lots,F="+0);
   FileWrite(handle,"Lots,1="+0.00000000);
   FileWrite(handle,"Lots,2="+0.00000000);
   FileWrite(handle,"Lots,3="+0.00000000);
   
   .................................
   
   FileWrite(handle,"MovingShift="+MovingShift);
   FileWrite(handle,"MovingShift,F="+1);
   FileWrite(handle,"MovingShift,1="+2);
   FileWrite(handle,"MovingShift,2="+1);
   FileWrite(handle,"MovingShift,3="+4);
   
   FileClose(handle);
return(0);
}

3. プロセス

注意!任意の操作を実行する前に、ワークシートまたはブック全体を複製することを強くお勧めします。Excel でマクロを実行するのは不可逆的な操作であり、エラーの場合最適化の結果が失われることがあります。中間結果の保存はされません。

3.1. 最適化

最適化に専念してみましょう。十分な情報を行うことができます。スクリーンショットに示すように、最適化およびEAのプロパティでテストパラメータを設定する必要があります。


図1 EA プロパティ、「エントリーパラメータ」タブ。最適化およびテスト パラメータ


3.2. 最適化の結果とパラメータの初期スクリーニング分析

完了すると、最適化の結果は、クリップボードにコピーする必要があります。


図2 最適化結果のコピー

Excel を起動し、新しいワークシートにコピーされたデータを貼り付けます。

コピー後は、 Optim_1マクロを実行する必要があります。すべてが正しく行われている場合、ワークシートは次のようになります。


図3 Excel マクロを実行

マクロを実行する場合、ダイアログ ボックスに最適化期間の日数をエントリーする必要があります。他の条件の計算に必要です。


図4 日のエントリ ダイアログ ボックス

結果のテーブルに列名がありません。これには理由があります。まず、(後で必要な) パラメータの番号をエントリーするときに、ミスを避けるためです。ここで、青と緑の 2 つの列を除いて、すべて同様です。左から右へ: パスナンバー、利益、一日当たりの利益、総トレード、一日当たりのトレード、プロフィットファクター、期待ペイオフ、$のドローダウン、%のドローダウン。

今後の作業に選択されているパラメータのみ含まれる場合 (すなわち不要な行が削除されている)、次のステップに進めます。

並べ替えを容易にするため、個々のカラムで並べ替えを可能にします。ホットキーを割り当て...


3.3. パラメータをファイルに保存

"Write"マクロを実行して、パラメータ ファイルを保存する場所のパスをエンターする必要があります。terminal\tester\files\)

図5 パラメータ ファイルの保存する ダイアログ ボックス

"ファイル名"ウィンドウには事前定義された名前"test"がありますが、変更しないでください。

Test.csvの操作の完了時にファイルが表示されます (または前に存在する場合は上書きされる) 。

注意重要。ファイルの作成は、テーブル内の行のポジションを変更しないでください。テスト結果は使用されるパラメータにバインドされます。


3.4. テスト

EAの設定:




図6-8 EAの設定グループのテスト実施

仮定するすべてで必要な場合、遺伝的アルゴリズムを無効にすると、カウンターは、1からNのパラメータで有効で、残りの行の数に設定します。

別の設定:


図 9「最適化結果」タブの設定

テスト期間およびその他の重要な最適化パラメータが設定されている場合、「スタート」ボタンをクリックし、「最適化」モードでストラテジーテスターを実行できます。

長い時間がかかる最初の実行で、大規模なテストが完了したら、次のステップに進めることができます。


3.5. テスト結果の操作

まず、Excel のテーブルは、新しいデータのエントリー結果として、 空列"Optim_2"テーブルの左側に表示されます。受信結果は、昇順でソートする必要があります。


図10  テスト結果の並べ替え

この結果はその後 (ステップ 2) のようにコピーされ、ワークシートの新しい Excel ワークシートに貼り付ける必要があります。

一連の"Optim_3""Optim_4"マクロを実行します。すべてが正しく行われている場合、テーブルは次の構造になります。


図 11 保存と最適化の処理とテスト結果テーブルの構造

すでに列 L-T について説明した通り、列 D-K は列М-T と似ていますが、テスト領域を参照しています。
しかし、 最初の3列に進む前に、どうやら「日あたり利益」や「一日情報」などの条件が導入された理由を説明する必要がありそうです。

最適化、テスト期間は、長さが異なる場合があります。この場合、合理的な質問は浮上します。つまり、結果をどのように比較する必要があるでしょうか。2つのパラメータは、少なくとも部分的にこの問題を解決し、結果を比較するプロセスを容易にするために設計されています。

よって、: А = N/E (一日当たりの利益), B = P/G (一日当たりの取引数), С =S/J (ドローダウン比率).

列の値が現在1で、既存のヒストリーの中でのテスト領域が最適化領域と一致する場合にのみ最適なバリアントで表されます。EAが正しく準備されているかどうかを確認する方法の1つを示すための意図的なものではありません。同様に、設定ファイルの作成の正確さを確認できます。

これで準備が整いました。すべての情報が利用できます。すべてがトレーダーの手にあり、EAのすべての秘密の関数を知り、必要な許容範囲を設定できます。

進みましょう。テーブルが削減されているが、まだ十分ではありません。別のテストを実行しましょう。
A-Kの列を削除し、ステップ3に戻ります。

3-5-8 から成るテーブルがあります。次に行くのでこれは十分です。


3.6. 設定ファイルの生成。

上記5-8 のパラメータのセットを裁量で処理することができ、ある人は必要は無いと言うかもしれない。好きなようにしてみてください。しかし、個人的にはマシンを好みます。「書き込み」マクロと最後の時間は、次のEAの設定を「最適化」モードでストラテジーテスターを実行する必要があります。


図12  EAの設定ファイルの生成

この設定は、テストモードで1つの変数の値と最終的なカウンター値をされている唯一の違いで使用されるものとほぼ同じです。

EAの最適化プロセスの完了時に、設定ファイルがディレクトリtester\filesで生成されます。最後の図は、テーブル内の行の数です。


図13 生成された設定ファイル

標準EAの設定ファイルとして処理できます。

実は、この記事の主題はクリアされています。


結論

上の情報は、従来の「最適化理論」と呼ばれるものではありません。これは、純粋に実用的なガイダンスで、それ以上でもそれ以下でもありません。しかし、これは言及しておかなければならないトピックだと思います。
ここに記載されているすべては、トレーダーのタスクを最大限に促進するように設計ツールです。グラフ上の見た目が良いからという理由で、100%の保証を与えることは誰にもできないでしょう。

そして、もう一つ。文字と図に尻込みしないでください。実際、すべては非常に簡単で、数回このような最適化をやればよいでしょう。

誰かがより効果的な最適化、テスト ウィンドウを作成する方法についてアイデアがある気がします。もしそうなら:)

上手くいきますように。

P. s.こんなに多くの言葉が必要になるとは思いもしませんでした。:)

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/1347

添付されたファイル |
Analise.zip (2.2 KB)

この著者による他の記事

新しいMetaTrader 5 とMQL5の登場 新しいMetaTrader 5 とMQL5の登場
これはMetaTrader5のただの簡単なレビューです。このような短い時間でシステムのすべての特徴を述べることはできません。2009年9月9日に試用を開始しました。これはシンボル的な日付でラッキーナンバーになると信じています。ベータ版のMetaTrader5とMQL5を手に入れて数日が経ちました。まだ全ての特徴を使ってはいませんが、すでに関心させられました。
1分でできるデータ品質評価 1分でできるデータ品質評価
1分でできるデータ品質評価
新しいレールへの第一歩: MQL5内のカスタムインディケーター 新しいレールへの第一歩: MQL5内のカスタムインディケーター
新しいターミナルと言語のすべての可能性と特徴をリストすることはしません。それらはあまりにも多くありすぎ、新規の特徴によっては別の記事で説明するに値します。またここにはオブジェクト指向プログラミングで書かれたコードがありません。開発者にとってさらに有利になる点として、ただ単に言及するにはあまりにも真剣なトピックです。本記事ではインディケーターとその構造・図面・タイプ・プログラミング の詳細についてMQL4と比較しながら考察します。初心者にも経験のある開発者にも本記事が有益となる事を願います。おそらく何か新しく学べることがあると思います。
EAのサンプル EAのサンプル
一般的なMACDを使ったEAを例として、MQL4開発の原則を紹介します。