エラー、バグ、質問 - ページ 1962

 
Andrey Khatimlianskii:

どのように役立つのでしょうか?

最適化が進み、検索するすべてのパラメータを値域とともに 書き出しました。

そして、1つのテストを実行し、パラメータリストを読み込んで、parameter = valueと表示します。この場合、入力変数を名前で参照することができないので、値が わからない。

入力パラメータをbool Optimにするのです。OnInitでは、Optim == trueの場合、INIT_FAILEDを返します。同時にOnTesterPassでFrameInputsとParameterGetRangeを通して(またはグローバルクラスのオブジェクトのデストラクタで)、実際のOptimizationのSETを書きます。

そして、Optim = falseと入れるのです。そして、もう1つのパラメータsinput int Rangeを取り、ParameterSetRangeで0から1へ変更するように設定します。OnTesterInitでSETファイルを読み込み、ParameterSetRangeでファイルから全パラメータの値を設定する。Range == 0 の場合、OnInit で INIT_FAILED を返します。

以上です。シングル最適化の代わりにイマジナリー最適化があり、これもシングル最適化より速い......。さらに入力パラメーターの読み書きが可能。

 

オフトピックな質問ですが、MQL5ハンドブックに アルゴリズムの実装例を追加して、よりわかりやすく補足することは可能でしょうか?

 
fxsaber:

入力パラメータをboolにする Optim.OnInitでは、Optim == trueの場合、INIT_FAILEDを返します。同時にOnTesterPassでFrameInputsとParameterGetRangeを経由して(またはグローバルクラスのオブジェクトのデストラクタで)実際にSET-file Optimizationを書きます。

そして、Optim = falseと入れるのです。そして、もう1つのパラメータsinput int Rangeを取り、ParameterSetRangeで0から1へ変更するように設定します。OnTesterInitでSETファイルを読み込み、ParameterSetRangeでファイルから全パラメータの値を設定する。Range == 0 の場合、OnInit で INIT_FAILED を返します。

以上です。シングル最適化の代わりにイマジナリー最適化があり、これもシングル最適化より速い......。さらに入力パラメーターの読み書きが可能。

詳細なアルゴリズムをありがとうございました。

 
1643年のコンパイル時
'TesterBenchmark_Example.mq5'   TesterBenchmark_Example.mq5     1       1
'TesterBenchmark.mqh'   TesterBenchmark.mqh     1       1
0 error(s), 0 warning(s), compile time: 3113 msec               1       1

1648でのコンパイル時

'TesterBenchmark_Example.mq5'   TesterBenchmark_Example.mq5     1       1
'TesterBenchmark.mqh'   TesterBenchmark.mqh     1       1
0 error(s), 0 warning(s), compile time: 219 msec                1       1

何かが変更された!

 

コンパイルエラー

typedef void (*fn)( int );
struct A {
                void f() { return   ; } //(*)
        static  void f( int ) {}
};
void g( fn ) {}
void OnStart()
{
        g( A::f ); //error: 'f' - cannot resolve function address
}

そして、(*)の行を置き換えると

                int  f() { return 0; } //(*)
であれば、問題ないでしょう。何が違うの?

https://www.mql5.com/ru/forum/1111/page1977#comment_5595772 のように見えますが、エラーコードが異なります。


Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2017.08.11
  • www.mql5.com
Форум алго-трейдеров MQL5
 

コンパイル時のエラー

template<typename T>
void g( T ) {}
void f() {}
void OnStart()
{
        g( f ); //error: 'g' - cannot to apply function template
}

それ以外は。


template<typename T>
void g( T ) {}
void f() {}
typedef void (*fn)();
void OnStart()
{
        fn ff = f;
        g( ff ); //нормально
}

大丈夫です。どんな違いがあるのでしょうか?
 
A100:

コンパイル時のエラー

が、このように

を普通にしています。何が違うの?

その差は大きい。g(f)が呼ばれたとき、コンパイラはfがどのような型であるかを知らない。なぜなら、templateしか規定されていないからである。テンプレートをオーバーロードしても問題なし

typedef void (*fn)();

template<typename T>
void g( T Value ) { Print(typename(Value)); }
void f() {}

void g( fn Value ) { Print(typename(Value)); }
void OnStart()
{
        g( f ); // void(*fn)()
}
 
fxsaber:
1643でコンパイルタイム。

1648でのコンパイル時


かっこいいツッコミですねー。

私のはそのまま、コンピレーションが速くならない!

 
Vitaly Muzichenko:

まだ持っています、コンパイルは加速していません

おそらく、TesterBenchmark.mqhでスローダウンしていたものを使っていないのでしょう。

 
fxsaber:

その差は大きい。g(f)が呼ばれたとき、テンプレートだけが規定されているので、コンパイラはfがどのような型であるかを知らない。テンプレートをオーバーロードしても問題なし

もし大きな違いがあるのなら、なぜC++は両方の亜種でうまくコンパイルできるのでしょうか?