任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 156

 

1) 为什么不在声明int err=0 时立即初始化

2) 没有检查,但根据文档,err被存储在某个变量中,当使用GetLastError() 函数时,该变量被自动清零。

而且在使用某些函数(主要是终端函数)时也总是发生变化

3)这就是为什么GetLastError() OrderSelect 中引用了一个不存在的票号后给出了一个0的值

" 其他函数在任何条件下都不会改变last_error变量的值。.................,OrderSelect, ...................."

 
hoz:

通常我在函数中会这样声明一个变量。

再往里走,在某个条件下,我已经调用它,看看是否有错误。好吧,不仅是我,我遇到的许多其他地方的代码。所以说,这是一个典型的情况。我今天想,在你想控制错误的每个函数中,每次都声明相同的变量,这是不符合逻辑的。我想了想,得出的结论是,在全局范围内声明一次,然后在init中初始化它,这样更容易。它是这样的。

还有,当你需要在用户函数中调用err变量时,知道它已经有一个值。事实上,GetLastError() 输出的是最后一个错误的代码,所以如果在所有计算结束时,在每个函数中调用这个变量err,负责输出错误代码,并调用GetLastError(),那么一切都会正确,对吗?

但如果你不在某个函数的末尾调用这个变量(跟随代码的执行链),它就不会被重置,而且可能会出现错误的执行,万一在之前的执行中出现了错误,但在当前的执行中没有,但错误代码最后被返回......而要重置它,你需要调用这个函数GetLastError()。也就是说,这里的一切都取决于它是否被调用。如果你不确定它将无处不在,那么每次都重新保险和重置就更容易了,对吗?

你可以全局声明它,然后在调用GetLastError() 之前在start()中重置它,例如

int err;
//------------------
int init() 
{
  // ...
  return(0);
}
//------------------
int start() 
{ 
  // ...
  RefreshRates();
  OrderClose(...);
  err=0;     // обнуление
  err=GetLastError();
  SomeErrFunction(err);
  // ...
return(0);
}
 
ALXIMIKS:

1) 为什么不在声明int err=0 时立即初始化


试试吧!:)这对我来说并不奏效。根据我的理解,在全局变量中通过特殊函数进行初始化是不允许的。尽管文件中似乎没有提到这一点。
ALXIMIKS

2) 没有检查,但根据文档,err被存储在某个变量中,当使用GetLastError() 函数时,该变量被自动清零。

而且在使用某些函数(主要是终端函数)时也总是发生变化

关于归零,上面写了,但在这里,如果数值进入LastError 变量后(), 那么为了重置它,我们需要调用GetLastError 函数() 来返回最后一个错误的代码,并重置LastError 变量 。否则,最后一个错误的代码将被永久保存,直到你调用GetLastError(),因此,它可能会在不存在的地方返回最后一个错误的代码。(即在另一个函数中,使其更难读出日志或打印)。
ALXIMIKS

3)这就是为什么GetLastError() OrderSelect 中引用了一个不存在的票号后给出了一个0的值

" 其他函数在任何条件下都不会改变last_error变量的值。.................,OrderSelect, ...................."

很可能 不是因为OrderSelect() ,而是其他方面出了问题(在同一个函数的旁边) 特别是它经常受到许多其他事情的影响。
 
paladin80:

你可以全局声明err,然后在调用GetLastError()之前在start()中把它归零,例如

如果你一开始就声明,然后在代码中出现1个以上的错误,那么逻辑就已经出错了。除非GetLastError() 被不断调用(理论上在每个用户函数的末尾)。
 
hoz:
那么就已经有了一个逻辑上的问题。除非GetLastError() 被不断调用(理论上 在每个用户函数的末尾)。

有时你必须更频繁地调用它
 

Victor(霍兹),我不理解你对最后一个错误 的大惊小怪。

声明用于错误处理的函数,并在需要时调用它。所有东西都将是本地的,可以在各地使用。

// Объявление:
void CommentError(int nLastCodeError, string sComment)
 {
  if (nLastCodeError != 0) Print(sComment, "  ", ErrorDescription(nLastCodeError));
 }

// Вызов:
void start()
 {
  CommentError(GetLastError(), "Ошибка в функции start()!");
 }
 
Zhunko:

Victor(霍兹),我不理解你对最后一个错误的大惊小怪。

声明用于错误处理的函数,并在需要时调用它。所有东西都将是本地的,可以在各地使用。


这是可以理解的。但这个函数将在我需要时被调用,即当我想检查是否有错误时。但如果之前某处有错误,而此刻没有错误,就会返回之前的错误......因为在你的函数Vadim中,LastError 变量没有被清零 通过调用GetLastError()。事情是这样的...
 
hoz:

这是可以理解的。但这个函数将在我需要的时候被调用,也就是说,当我想检查是否有错误的时候。但是,如果先前某个地方出现了错误,而此刻没有错误,它将返回先前的错误......因为在你的函数Vadim中,LastError 变量没有被清零 通过调用GetLastError()。这就是问题的关键...

它不应该被重置为零。应该有一种习惯,在函数之后到处检查错误。你也应该让电话失去作用。这样它在战斗模式下就不会变慢。也就是说,它是这样一个调试器。

当然,例外的是需要分析的错误,以做出决定。

 
hoz:

这是可以理解的。但这个函数将在我需要时被调用,即当我想检查是否有错误时。但如果之前某处有错误,而此刻没有错误,就会返回之前的错误......因为在你的函数Vadim中,LastError 变量没有被清零 通过调用GetLastError()。重点来了...
是什么阻止了它先归零(err=0;),然后调用动作,然后赋值 err=GetLastError(),处理它,然后err=0再次。
 
如何计算不同t/p和s/l的利润系数。很明显,如果取值和止损各为20点,让我们计算一下盈利和亏损的交易数量并将其划分。如果我采取40点的TP和30点的止损,我如何计算? 我们将以同样的方式使用它,在同样的地方使用它。