mql5中的OOP、模板和宏,细微之处和用途 - 页 25

 

fxsaber:

可能,有些编译器在这种情况下会发出警告。

指定器指的是一个引用,而不是整个对象,一切都很合法,为什么编译器要发誓?

 
TheXpert:

指定器指的是引用,而不是整个对象,一切都很合法,为什么编译器要发誓?

也许,如果是这样,这里就不会有骂声了。

void g1( A& ) {}
void g2( const A& ) {}

void OnStart()
{
  const A a;
  
  g1(a); // 'a' - constant variable cannot be passed as reference
  g2(a); // OK
}
 
fxsaber:

也许,如果是这样的话,这里就不会有脏话了。

这是一个常量对象,所以在逻辑上,常量对象 不能有非常量的引用

 
TheXpert:

这是一个常量对象,所以在逻辑上,一个非常量对象 不能有一个非常量引用。

我如何引用一个常量对象

 
fxsaber:

我如何对一个常量对象 进行引用?

void g1( A& ) {}
void g1(const A& ){}
void g2( const A& ) {}

void OnStart()
{
  const A a;
  
  g1(a);
  g2(a);
}

增加一个过载。

 
Vladimir Simakov:

重载添加。

这样的过载不是在不断的链接吗?

关于交易、自动交易系统和策略测试的论坛

mql5中的OOP、模板和宏,技巧和窍门

TheXpert, 2020.02.26 15:24

指定者指的是引用,而不是指整个对象。

 
fxsaber:

这样的超载不就是一个不断的参考吗?

你想做什么?

 
fxsaber:

这样的过载不是对恒定参考的过载吗?

如果你想让编译器在你的第一个例子上崩溃,那是行不通的,因为那里的一切都是合法的:你没有通过引用改变对象实例,你改变的是方法被调用的对象实例,而事实上,它可以是同一个对象,这不是编译器的问题,而是程序员的头疼。

对于一个班级,你可以做这一招(对于结构,你不能)。

class A
{
  int i;
public:
  void f( const A &Value )  
  {
    Print(Value.i); // 0
    
    if (&this!=&Value) this.i = Value.i + 1;
    
    Print(Value.i); // 1
  }
};

void OnStart()
{
  A a;
  
  a.f(a);
}
 
Vladimir Simakov:

如果你想让编译器让你的第一个例子崩溃,它不会的,因为那里的一切是合法的。

这与合法性无关,而是因为const修改器并不能保证对象保持不变。

 

关于交易、自动交易系统和交易策略测试的论坛

mql5中的OOP、模板和宏,技巧和窍门

fxsaber, 2020.02.25 22:23

我从未见过这个表达式返回错误。
ORDER_TIME_DONE_MSC == DEAL_TIME_MSC

这就是为什么很难根据交易历史对订单执行时间进行统计。

如果我们对市场订单还能比较ORDER_TIME_SETUP_MSC 的值,那么对挂单就没有意义。


关于交易、自动交易系统和策略测试的论坛

图书馆: MT4Orders

fxsaber, 2020.02.27 09:40

0 - 348806: 00:01:57.311
1 - 348530: 00:01:39.027
2 - 348494: 00:01:15.259
3 - 348406: 00:01:07.671
4 - 348950: 00:01:04.869
5 - 348960: 00:01:02.888
6 - 348814: 00:01:00.654
7 - 348392: 00:01:00.642
8 - 348508: 00:00:54.515
9 - 348550: 00:00:54.467


在一个正在运行的账户上最多可执行两分钟。在这里分享你的统计资料。该脚本不使用任何库,它适用于联网/对接。