Time()の問題点 - ページ 7

 
onewithzachy:

道具のこと道具について教えてください 恥ずかしがらないでください 先日のRaptorUKさん、dabblerさん、SDCさんのコメントで勉強になりました。というわけで、教えてください.

:D

あなたの質問の答えは、モラニスのようです.. . 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

私たちが話していることの背景を知ることは役に立ちます


このスレッドは、各方面であまりに多くの動揺があるため、私は避けていました。余計なお世話としか思えません。


回答者が100%の正確さで200の投稿を読んで何が起こっているのかを把握する必要がないように、OPは新しいスレッドを立ち上げるべきかもしれませんね。

あと、みんな 人の名前を呼ぶのをやめたらいいんじゃないかな。

 

RaptorUK:

Day(), DayOfWeek(), TimeDay() and TimeDayOfWeek() all seem to work correctly in Straegy Tester (build 427) ... 本当にあなたのコードでDay()を使うつもりだったのか、あなたのコードを作るべきもの ... あなたがあなたのためにコード化するのが何だとしても、それはDayOfWeekを使うべきだったか? 最初の、Day() は値0 - 31、第2のDayOfWeek() 0 - 6日曜日が0という値で与える

Dooh!私はこのコードに目を通しましたが、その問題には気がつきませんでしたし、私自身のコードでその通りの関数を使用しています。よくわかりました :-)
 
dabbler:

興味深いのは、このような

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

私たちが話していることの背景を知ることは役に立ちます


このスレッドは、各方面であまりに多くの動揺があるため、私は避けていました。 ただ、あまりに不要な気がします。

しかし、一部の人々は、自分のコードが優れていて、MT4がゴミであるという固定観念を持っています。 私はOPを助けようとしました。彼は明らかにDay()とDayOfWeek()を混同しており、彼の最初の投稿からそれが事実であることが明らかであるにもかかわらず、彼はそれを受け入れようとしませんでした ... 助けられない人がいるのです。
 
dabbler:
どーもー。私はそのコードに目を通しましたが、その問題には気がつきませんでしたし、私自身のコードでまさにその関数を使用しています。よくわかりました :-)
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は以前、式は括弧で囲むべきだと投稿しています。どの優先順位規則がどの式に従うかを知るために本を開かなければならないのは、コードが読めないことを意味するので、これはとにかく明らかに良い習慣です。
 

OK 私はこのようなコードを書いて、思ったように動作させたことがなかったので、今これを確認する 必要がありました。そこで、これをテストするための簡単なスクリプトを紹介します。

読みやすく/テストしやすく/デバッグしやすくするために、元の条件の各比較を対応する整数の比較に置き換えてみた。最後の || 演算子の後を除いて、すべて偽になります。

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:

OK 私はこのようなコードを書いて、思ったように動作させたことがなかったので、今これを確認する必要がありましたので、ここにそれをテストするための簡単なスクリプトがあります。

いい出来だ。あと、MQL4の優先順位のルールに目をつけました・・・。

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

は論理ORが論理ANDより上位にあり、K & R(2nd ed)と異なって いる。

しかし、あなたのように、私はこれらをあまり使うことがなく、ただ自分のコードを理解できるように括弧をつけたり、行を分けたりするだけです

 
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のドキュメントに書かれている通りです :-)