Проблемы с Time() - страница 7

 
onewithzachy:

Инструменты. Расскажите нам об инструментах, не стесняйтесь, я узнал из комментариев RaptorUK, dabbler и SDC на днях. Так что, пожалуйста, расскажите нам.

:D

Кажется, ответ на ваш вопрос - Моланис . . . http://www.molanis.com/forum/viewtopic.php?f=2&t=1450
 
RaptorUK:
Кажется, ответ на ваш вопрос - Моланис. . . http://www.molanis.com/forum/viewtopic.php?f=2&t=1450

Интересно, как и это

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

Полезно знать историю того, о чем мы говорим!


Я избегал этой темы, потому что здесь так много расстройств со всех сторон. Это кажется таким ненужным.


Может быть, ОП стоит начать новую тему, чтобы респондентам не пришлось читать 200 сообщений со 100% точностью, чтобы понять, что происходит.

И, может быть, все перестанут обзывать людей.

 

RaptorUK:

Day(), DayOfWeek(), TimeDay() и TimeDayOfWeek() работают правильно в Straegy Tester (сборка 427) ... Вы действительно хотели использовать Day() в своем коде, или это должно было сделать ваше кодовое здание ... что бы вы ни использовали для кодирования, оно должно было использовать DayOfWeek() ? Первый, Day() дает значение 0 - 31, второй DayOfWeek() дает значение 0 - 6 воскресенье равно 0

Дооо! Я просмотрел этот код и не заметил этой проблемы, а ведь я использовал именно эти функции в своем собственном коде. Хорошо подмечено :-)
 
dabbler:

Интересно, как и это

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

Полезно знать историю того, о чем мы говорим!


Я избегаю этой темы, потому что здесь так много расстройства со всех сторон. Это кажется таким ненужным.

Так и есть... Но некоторым людям нельзя помочь, у них в голове засело, что их код хорош, а MT4 - мусор... Я пытался помочь ОП, он явно путает Day() и DayOfWeek(), и несмотря на то, что из его первого сообщения было очевидно, что это так, он не хочет с этим согласиться... некоторым людям просто невозможно помочь.
 
dabbler:
Dooh! Я просмотрел этот код и не заметил этой проблемы, а ведь я использовал именно эти функции в своем собственном коде. Хорошо подмечено :-)
onewithzachy :тоже заметил это... но со всей активностью в этой теме я пропустил его сообщение.
 

Еще одна вещь, которую мы все не заметили, ну, я заметил, но в середине этой сумасшедшей темы я не понял, что никто не упомянул об этом, ОП опубликовал это:

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:

Еще одна вещь, которую мы все не заметили, ну, я заметил, но в середине этой сумасшедшей темы я не понял, что никто не упомянул об этом, ОП опубликовал это:

Вы не можете объединить все эти || || || || || || || && && || && && && как условие, не используя скобки, чтобы разбить его на части.

Интересно, что я проверил это, и все оказалось в порядке. 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);
  }

Это дает условие false, что говорит мне:

|| 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

логическое ИЛИ выше логического И, что расходится с K & R (2-е изд.)

Но, как и вы, я никогда не использую их в значительной степени, я просто ставлю скобки вокруг вещей или использую отдельные строки, чтобы я мог понять свой собственный код!

 
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 :-)