最適化の結果は、それらの単一テストとは異なります。 - ページ 6

 

拡散テストの問題が再三指摘されているようですね。最近、多少なりとも(実際の取引で)本格的と思われるシステムを思いついたので、徹底的なテストが必要である。そして、この問題についても懸念してきました。その結果、オフラインテストに必要なスプレッドを設定する簡単なスクリプトを書きました。

この原理はよく知られており、symbols.selファイルではAskは上書きされます。そこで、オフラインのターミナルでhistoryフォルダからexperts/filesフォルダにコピーしてスクリプトを起動し、ターミナルを閉じてsymbols.selをコピーバックして再度ターミナルを 起動してください。

P.S.スクリプトを交換し、小さな見落としは、誰もが突然SetSpreadではなくSetSpread_1を取るために時間を持っていた場合、再びダウンロードする必要があります。

ファイル:
 
同じ問題です。最適化では同じ結果が得られるが、単発では結果が大きく異なる。正しい方向性を示してくれたMathematicsに感謝します。

数学
テスト中のオブジェクトの取り扱いにご注意ください。まったく使わないほうがいい。

何が起きたのか、どのように解決したのか、もしかしたら誰かの役に立つかもしれないので、シェアします。トレンドラインを使って、自分でインジケータを書きました。このインジケータは、トレンドラインが途切れた数を端末のグローバル変数 に渡しました。こんな感じでした。

GlobalVariableSet("GV_name", number);

の値を取り、Expert Advisorでは

int dc = GlobalVariableGet("GV_name");

ビジュアライザーや単体テストではすべて順調でした。そこで、「余分な」変数を宣言するのを節約して、コードサイズを小さくすることにしました。以下の方法でコードを修正したところ、オプティマイザでも単体テストでも同じ結果ですべてが動作するようになりました。

string GlobVar = "GV_name";  // объявил переменную в индикаторе на глобальном уровне программы

int start(){
  GlobalVariableSet(GlobVar, number);
}
string GlobVar;  // объявил переменную в советнике на глобальном уровне программы
int dc;

int start(){
  dc = GlobalVariableGet(GlobVar);
}

このように、インジケータとEAにグローバル変数を設定することで、すべてが正常に動作するようになりました。

 

同僚の皆さん、こんばんは。

同じような問題に遭遇したので、このトピックを再活性化することにしました。

私のExpert Advisorはグラフィカルオブジェクトを使用しません。どこも同じようなカスタムスプレッドを設定しました。しかし、単体テストと最適化の結果とは 大きく異なります。さらに、異なるPCで単体テストを行ったところ、どれも 似たような結果になりましたが、最適化の結果とは一致しません。

もしかしたら、誰かが解決策を見つけたのかもしれませんね。

 
Andrey Kaunov:

同僚の皆さん、こんばんは。

同じような問題に遭遇したので、このトピックを再活性化することにしました。

私のExpert Advisorはグラフィカルオブジェクトを使用しません。どこも同じようなカスタムスプレッドを設定しました。しかし、単体テストと最適化の結果とは 大きく異なります。さらに、異なるPCで単体テストを行ったところ、どれも 似たような結果になりましたが、最適化の結果とは一致しません。

もしかしたら、誰かが解決策を見つけたのかもしれませんね。

そして、なぜそれらが一致する必要があるのでしょうか?パラメータを総合的に分析し、最適な選択肢を選ぶだけなら。しかし、これにはコストとリソースがかかります。そのために遺伝的アルゴリズムを使っているのです。そして、それらは基本的に、最適化されるパラメータセットからランダムに サンプリングして、最適なものを選び、そこでより詳細に探索するという形で構築されています。例えば6つのパラメータ。最適解を提示することは、6次元空間における最高密度のようなものです。そして、高密度化のポイントはいくつもありえます。良いアルゴリズムは、あまり密度がない滑らかな6次元のボリュームグレイドを与え、最適化はそれらを見つけることができますし、アルゴリズムが鋭い密度を与える場合、結果はランダムになることがあります。

 

ヴァレリー 答える代わりに、引用させていただきますが、よろしいでしょうか。

eugene-last:

あの...多くの人が問題を理解しようとしないだけだと思います。あるいは意図的に立ち去る。

最適化とは何か、単体テストとは何か。答え:最適化は、いくつかの単一のテストです。
どういう意味ですか? 回答:理論的には、最適化パスは単一テストと同じで、同じ結果に終わるということです。

しかし、実際にはそうではないことが分かっています。そして、Expert Advisor(ちなみに最大値ではありません、ここで何人かの人を悩ませているようですね)は、単一のテストがまったく同じ結果を示すので失敗しません。では、なぜ最適化におけるこのたった一つのテストが、異なる結果をもたらすのでしょうか?

 
Andrey Kaunov:

同僚の皆さん、こんばんは。

同じような問題に遭遇したので、このトピックを再活性化することにしました。

私のExpert Advisorはグラフィカルオブジェクトを使用しません。どこも同じようなカスタムスプレッドを設定しました。しかし、単体テストと最適化の結果とは 大きく異なります。さらに、異なるPCで単体テストを行ったところ、どれも 似たような結果になりましたが、最適化の結果とは一致しません。

もしかしたら、誰かが解決策を見つけたのかもしれませんね。

1.すべての変数が初期化されていることを確認する。ただし、過去のMQL4では、初期化されていない変数は0に等しかったが、今はわからない。

2、動的配列を使用する場合、ArrayResize()の結果をチェックする必要がある - 私はそれで問題があった、私は4-5の指標のためのEAをしました、それは1つの指標はすべてのメモリを食べて、私のEAで、ArrayResize()は常に要求された配列サイズを与えていないことが判明 - それは一度動作するかしない。私の記憶違いでなければ、MQL4は MQL-program 用に最大3Gb程度のメモリを搭載しており 、端末は32ビット です。

 
Andrey Kaunov:

ヴァレリー 答える代わりに、引用させていただきますが、よろしいでしょうか。

正確には、わからないんです。最適化とは、結局のところ、数回の単発のテストではなく、多くのテストを行うことなのです。その真相を解明するためには、再現性のある簡単な問題コードが必要です。そうすれば、開発者が答えてくれるかもしれません。

 
Igor Makanu:

1. すべての変数が初期化されているか確認する。以前MQL4では、初期化されていない変数は0に等しかったが、今はわからない。

2、動的配列を使用する場合 - あなたはArrayResize()の結果を確認する必要があります - 私はこの問題があった、私は4-5指標のためのEAをした、それは一つの指標はすべてのメモリを食べたことが判明し、EAで、私は常にArrayResize()は配列の要求サイズをマークされていない - それは働いたとそれは他の時間を動作しませんでした。私の記憶違いでなければ、MQL4は MQL-program 用に最大3Gb程度のメモリを搭載し 、端末は32ビット です。

イゴール、ありがとうございました。この方向で研究してみようと思います。

Valeriy Yastremskiy:

よくわからない、わからない。そのため、高速化のために入力データが異なる場合があります。その真相を解明するためには、再現性のある簡単な問題コードが必要です。そうすれば、開発者が答えてくれるかもしれません。

まあ、何も変わらない方がいいし、そうでないと最適化の意味がなくなる。そして、開発者は10年間何も答えてくれない...。

 
Andrey Kaunov:

イゴール、ありがとうございます。その方向で掘り下げてみる。

まあ、何も変わらない方がいい。そうでないと、最適化の意味がなくなる。そして、開発者は10年間何も答えてくれない...。

開発者は言葉や文句が通じない。問題を再現する理解できるコードのみ)。

 
Igor Makanu:

1. すべての変数が初期化されているか確認する。以前MQL4では、初期化されていない変数は0に等しかったが、今はわからない。

2、動的配列を使用する場合、ArrayResize()の結果を確認する必要がある - 私はこの問題を抱えていた、私は4-5の指標でEAをした、それは1つの指標はすべてのメモリを食べて、私のEAで、ArrayResize()は常にリクエスト配列サイズを与えていないことが判明 - それは一度かどうか動作しました。私の記憶違いでなければ、MQL4では MQLプログラム 用のメモリは最大3Gb程度で、端末は32ビット です。

4には0があり、5にはゴミがある。前回は、OnInitの外で初期化され、実行中、つまり最適化パス中に変化する変数を見つけることで、この問題は正確に解決されたようです。

が、次のパスでは元の値で終わらない。