错误、漏洞、问题 - 页 1962

 
Andrey Khatimlianskii:

这有什么帮助?

优化工作已经完成,我们已经写下了所有要搜索的参数的数值范围

然后我们运行一个测试,读取参数列表,并显示:参数=值。在这种情况下,我们不知道这个值,因为我们不能用名字来指代这个直观变量。

你让输入的参数变成bool Optim。在OnInit中,如果Optim == true,你将返回INIT_FAILED。同时在OnTesterPass中通过FrameInputs和ParameterGetRange(或在全局类对象的析构器中),你写下实际的优化SET。

然后你把Optim = false。再取一个参数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-文件优化。

然后你把Optim = false。再取一个参数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是什么类型,因为只有模板被规定。如果你的模板过载,就没有问题了

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++在两种变体中都能很好地编译?