Time()的问题 - 页 7

 
onewithzachy:

工具。告诉我们工具的情况,不要尴尬,我从RaptorUK、dabbler和SDC那天的评论中学到了。所以,请告诉我们。

:D

看来你的问题的答案是Molanis .. . http://www.molanis.com/forum/viewtopic.php?f=2&t=1450
 
RaptorUK:
看来你的问题的答案是Molanis .. . http://www.molanis.com/forum/viewtopic.php?f=2&t=1450

有趣的是,这也是

https://www.mql5.com/en/forum/126224

了解我们正在谈论的背景是有帮助的!


我一直在回避这个话题,因为各方都有如此多的不满。这似乎没有必要。


也许OP应该开始一个新的主题,这样受访者就不必100%准确地阅读200个帖子来弄清楚发生了什么。

而且,也许每个人都 可以停止叫人的名字。

 

RaptorUK:

Day(), DayOfWeek(), TimeDay()和TimeDayOfWeek()在Straegy Tester(build 427)中似乎都能正常工作 ......你真的是想在你的代码中使用Day(),还是应该用你的代码构建东西 ......不管你用什么东西来为你编码,它应该使用DayOfWeek()? 第一个,Day() 给出一个值0-31,第二个DayOfWeek() 给出一个值0-6 星期日是 0

Dooh!我浏览了那段代码,没有发现这个问题,而且我在自己的代码中也使用了这些确切的函数。发现得好:-)
 
dabbler:

有趣的是,这也是

https://www.mql5.com/en/forum/126224

了解我们正在谈论的背景是有帮助的!


我一直在回避这个话题,因为各方都有如此多的不满。 这似乎是不必要的。

是的 ......但有些人是帮不上忙的,他们脑子里有一个固定的想法,认为自己的代码是好的,而MT4是垃圾 ......。 我试图帮助OP,他显然是把Day()和DayOfWeek()混为一谈,尽管从他的第一篇帖子中可以看出情况是这样的,但他还是不愿意接受 ... ... 有些人就是帮不了忙。
 
dabbler:
Dooh!我浏览了那段代码,没有发现这个问题,而且我在自己的代码中也使用了这些确切的函数。发现得好:-)
onewithzachy :也发现了......但由于这个主题的所有活动,我错过了他的帖子。
 

还有一件事我们都没有注意到,好吧,我注意到了,但在这个疯狂的主题中,我没有意识到没有人提到它,OP发布了这个。

Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent()) >=23 &&
 TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57

你不能把所有这些|||||||||||||||&&&&作为一个条件串起来,而不使用一些括号来分解它。

看看它的最后部分。

|| Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
我不相信当前面的部分为假时,会导致条件为真,除非使用一些括号将其与条件的其他部分分开。
 
SDC:

还有一件事我们都没有注意到,好吧,我注意到了,但在这个疯狂的主题中,我没有意识到没有人提到它,OP发布了这个。

你不能把所有这些||||||||||||||&&&&作为一个条件串起来,而不使用一些括号来分解它。

有趣的是,我确实检查过 了,似乎没有问题。MQL4和C语言(以及其他每一种计算机语言)都有一套优先权规则,对逻辑表达式进行精确的 解释。然而,正在使用的工具说这样的 "复杂表达式 "是含糊不清的!(对于这一点,我们应该读作没有正确的解释。(对于这一点,我们应该理解为没有正确执行)。WHR之前确实发布过,表达式应该放在括号里。这显然是很好的做法,因为要打开书来弄清楚哪个表达式后面有哪个优先规则,意味着代码是不可读的。
 

好吧,我现在不得不检查一下,因为我从来没有写过这样的代码,并且让它按照我的想法工作,所以这里有一个简单的脚本来测试它。

我把原条件中的每一个比较都换成了相应的整数比较,以使它易于阅读/测试/调试。除了最后一个||运算符之后的部分,所有的都是假的。

int start()
  {
//----
   int a,b,c,d,e; 
   a=1;
   b=2;
   c=3;
   d=4;
   e=1;
//----
   if( a==b || b==c || c==d || d==e && a>=b && c>=d || a==e && b>=a && c>=a )
   Alert("condition true");
   else
   Alert("condition false");
//----
   return(0);
  }

这使得条件为假,告诉我。

|| Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57

在OP代码中,即使Day()被替换成DayOfWeek(),也不会使条件变为真,但如果我们在其中加入一些小括号....。

int start()
  {
//----
   int a,b,c,d,e; 
   a=1;
   b=2;
   c=3;
   d=4;
   e=1;
//----
   if( (a==b || b==c || c==d || d==e && a>=b && c>=d) || (a==e && b>=a && c>=a) )
   Alert("condition true");
   else
   Alert("condition false");
//----
   return(0);
  }
现在它起作用了,条件变成了真的。
 
SDC:

好吧,我现在不得不检查一下,因为我从来没有写过这样的代码,并且让它按照我的想法工作,所以这里有一个简单的脚本来测试它。

做得不错。我还发现,MQL4的优先级规则 ...

https://docs.mql4.com/basis/operations/rules

逻辑OR高于逻辑AND,这与K & R(第二版)不一致

但是,像你一样,我从来没有真正使用过这些东西,我只是在东西周围加上括号,或者使用单独的行,这样我就可以理解我自己的代码了。

 
SDC:
现在它起作用了,条件变成了真的。

这是我的贡献(测试脚本) ...

int start(){
   string str = "LOGIC";
   for( int N=0; N<2; N++ ){
      bool bN= (N==1);
      string strN= "false AND ";
      if( bN )
         strN = "true AND ";
      
      for( int M=0; M<2; M++ ){
         bool bM= (M==1);
         string strM= "false OR ";
         if( bM )
            strM = "true OR ";

         for( int P=0; P<2; P++ ){
            bool bP = (P==1);
            string strP= "false = ";
            if( bP )
               strP = "true = ";
            
            str = str + "\n" + strN + strM + strP;
            if( bN && bM || bP )
               str = str + "true";
            else
               str = str + "false";
         }
      }
   }
   
   Comment( str );

   return(0);
}

它是这样做的...


清楚地表明,逻辑OR 测试首先完成(更高的优先级),然后再进行逻辑AND 测试......事实上,就像MQL4文档中所说的:-)