MT開発者向けではない!?INIT_PARAMETERS_INCORRECTを何に置き換えたらいいのでしょうか?

 

プログラムのロジック上、無効な関数呼び出しを ふるい落とす必要があるのですが、この問題が発生しました。私はこのためにINIT_PARAMETERS_INCORRECTを使用しています。しかし、遺伝的最適化は実質的に一旦停止してしまう。このような状況について質問すると、開発者は怒ります。遺伝子解析の勉強をしましょう、などとアドバイスしています。

でも、何のために必要なのか?ユーザーである私は、結果を出したいので、仕組みはどうでもいいんです。

そこで、3つの関数1、2、3に関する例を挙げてみます。0 は使用しない。

チェーンでは、関数は繰り返してはならず、関数間に0があってはならない(さもなければ繰り返しが発生する可能性がある)。

許容される連鎖の一例。

  • 100
  • 120
  • 130
  • 123
  • 132
  • 2..
  • 3..

許容できない連鎖の例

  • 010
  • 001
  • 110
  • 101
  • 111
  • 121
  • 122
  • 131
  • 133
  • 112
  • 113
  • 102
  • 103
  • 2..
  • 3..
見ての通り、有効な鎖より無効な鎖の方が桁違いに多い。サンプリングの方法は? INIT_PARAMETERS_INCORRECTの置き換え方法は?どこを掘ればいいんだ?

 
パラメータが左巻きの場合、On-functions の計算をキャンセルします。INIT_PARAMETERS_INCORRECT よりも実行速度が遅くなりますが、大きな 影響はありません。
 
どうですか?小さな例を挙げてみましょうか。
 

可能な入力パラメータのセット、望ましくないセット、望ましくないセットが多すぎる理由について、もっと明確に説明してもらえますか?

好ましくないセットはあまりない方がいいというのは、開発者の意見に全面的に賛成です。最適なのは10%以下です。

 
Сергей Таболин:
どうですか?小さな例を挙げてみましょうか。

fxsaberの言うとおりです。

不正確なパラメータが入力された場合、すべての OnTick() 関数を一度に返します。そしてonTester - 最小の結果を返します。

 
Сергей Таболин:
どうですか?小さな例を挙げてみましょうか。
input int i = 0; 

bool Incorrect;
 
int OnInit()
{
  Incorrect = !i; // нулевое значение считается некорректным (пример)
  
//  return(Incorrect ? INIT_PARAMETERS_INCORRECT : INIT_SUCCEEDED); // Было
  return(INIT_SUCCEEDED);
}

void OnTick()
{
  if (Incorrect)
    return;
    
  // ...
}
 
これらは、入力パラメータのセットではありません繰り返してはならない機能の集合体なのだ!低速最適化では、INIT_PARAMETERS_INCORRECTは、これらの関数を呼び出すための有効なチェーンを構築するために本当に役立ちますが、私はそれらの6を持っています。チェーンバリエーションが117649個もあるんです。しかし、これらのチェーンは、何らかの入力パラメータがなければ意味がない。これで、すでに38,000,000枚を超えました !スローブルートフォースではどうしようもない。
 
Сергей Таболин:
これらは、入力パラメータのセットではありません繰り返してはいけない機能の集合体なのです遅い最適化ではINIT_PARAMETERS_INCORRECTはこれらの関数を呼び出すための有効なチェーンを構築するために本当に役立ちますが、私はそれらの6を持っています。チェーンバリエーションが117649個もあるんです。しかし、これらのチェーンは、何らかの入力パラメータがなければ意味がない。これで、すでに38,000,000枚を超えました !スローブルートフォースではどうしようもない。

最適化 基準の最適化面は多かれ少なかれ連続的(滑らか)であるべきなので、遺伝子が死んでしまうのです。しかし、あなたの場合は、膨大な数のスパイク(失敗)が発生していますね。


以下の実験を設定することができます。標準のExpert Advisorを使い、そこに最適化のためのパラメータを追加する - 偽のもの。セットの9割が不正解。GAが死んでしまう。フェイクパラメーターがなくても結構いけそうですが。

 
fxsaber:

了解です。オプティマイザーの中で、正しい関数とその順番を選択すればいいのです。そして、不適当なチェーンはすべて手動で書き込む...。そのとき、オプティマイザーはどのようにそれを見つけるのでしょうか?

 
fxsaber:

最適化 基準の最適化面は多かれ少なかれ連続的(滑らか)であるべきなので、遺伝子が死んでしまうのです。しかし、あなたの場合は、膨大な数のスパイク(ディップ)が発生していますね。

これはわかります。私はそれを回避する方法だけ理解していない?

 
Сергей Таболин:

それはわかります。わからないのは、それを回避する方法ですか?

1つの方法は、開発者がINCORRECTパスの結果を、最も近い以前に計算されたCORRECTパスとして扱うことである。これにより、最適化面の穴が均等になります。

理由: