Задачка

 

Кто-нибудь подскажите, в чем ошибка (или не ошибка?)

void OnStart(){
   Print("Script Condition started");
   MqlRates rates[];
   ArraySetAsSeries(rates,true);
   if(CopyRates("EURUSD",PERIOD_M1,D'2012.01.02 05:03',20,rates)!=20){
      Print("Error retrieving price data!");
      return;
   }
   Print("Candle 0: ",TimeToString(rates[0].time)," OHLC: ",_dtsd(rates[0].open)," ",_dtsd(rates[0].high)," ",_dtsd(rates[0].low)," ",_dtsd(rates[0].close));
   Print("Candle 1: ",TimeToString(rates[1].time)," OHLC: ",_dtsd(rates[1].open)," ",_dtsd(rates[1].high)," ",_dtsd(rates[1].low)," ",_dtsd(rates[1].close));
   bool signal=true;
   Print("Signal = ",signal);
   Print("Condition = ",(rates[0].close<rates[0].open?
      rates[0].open<=rates[1].close+(rates[1].high-rates[1].low)*0.1:
      rates[0].open<rates[1].close&&rates[0].close<=rates[1].close+(rates[1].high-rates[1].low)*0.1));
   Print("Signal AND Condition = ",signal&&(rates[0].close<rates[0].open?
      rates[0].open<=rates[1].close+(rates[1].high-rates[1].low)*0.1:
      rates[0].open<rates[1].close&&rates[0].close<=rates[1].close+(rates[1].high-rates[1].low)*0.1));
}
//+------------------------------------------------------------------+
string _dtsd(double value){ return(DoubleToString(value,_Digits)); }

 Выдает результат (true && false = true):

GS      0       Condition (EURUSD,H1)   01:03:25        Script Condition started
JO      0       Condition (EURUSD,H1)   01:03:25        Candle 0: 2012.01.02 05:03 OHLC: 1.29211 1.29278 1.29211 1.29228
CL      0       Condition (EURUSD,H1)   01:03:25        Candle 1: 2012.01.02 05:02 OHLC: 1.29264 1.29277 1.29206 1.29213
KR      0       Condition (EURUSD,H1)   01:03:25        Signal = true
GL      0       Condition (EURUSD,H1)   01:03:25        Condition = false
OD      0       Condition (EURUSD,H1)   01:03:25        Signal AND Condition = true

Если же поместить предварительно условие в переменную и совершить ту же операцию, 

void OnStart(){
   Print("Script Condition started");
   MqlRates rates[];
   ArraySetAsSeries(rates,true);
   if(CopyRates("EURUSD",PERIOD_M1,D'2012.01.02 05:03',20,rates)!=20){
      Print("Error retrieving price data!");
      return;
   }
   Print("Candle 0: ",TimeToString(rates[0].time)," OHLC: ",_dtsd(rates[0].open)," ",_dtsd(rates[0].high)," ",_dtsd(rates[0].low)," ",_dtsd(rates[0].close));
   Print("Candle 1: ",TimeToString(rates[1].time)," OHLC: ",_dtsd(rates[1].open)," ",_dtsd(rates[1].high)," ",_dtsd(rates[1].low)," ",_dtsd(rates[1].close));
   bool signal=true;
   bool condition=(rates[0].close<rates[0].open?
      rates[0].open<=rates[1].close+(rates[1].high-rates[1].low)*0.1:
      rates[0].open<rates[1].close&&rates[0].close<=rates[1].close+(rates[1].high-rates[1].low)*0.1);
   Print("Signal = ",signal);
   Print("Condition = ",condition);
   Print("Signal AND Condition = ",signal&&condition);
}
//+------------------------------------------------------------------+
string _dtsd(double value){ return(DoubleToString(value,_Digits)); }

То все происходит как и должно быть (true && false = false):

FM      0       Condition (EURUSD,H1)   01:09:37        Script Condition started
KF      0       Condition (EURUSD,H1)   01:09:37        Candle 0: 2012.01.02 05:03 OHLC: 1.29211 1.29278 1.29211 1.29228
JK      0       Condition (EURUSD,H1)   01:09:37        Candle 1: 2012.01.02 05:02 OHLC: 1.29264 1.29277 1.29206 1.29213
JK      0       Condition (EURUSD,H1)   01:09:37        Signal = true
JE      0       Condition (EURUSD,H1)   01:09:37        Condition = false
CQ      0       Condition (EURUSD,H1)   01:09:37        Signal AND Condition = false
 
AntFX:

Кто-нибудь подскажите, в чем ошибка (или не ошибка?)

 Выдает результат (true && false = true):

Если же поместить предварительно условие в переменную и совершить ту же операцию, 

То все происходит как и должно быть (true && false = false):

 

если скажете что должен выводить скрипт - то будет проще
 

 

lazarev-d-m:
если скажете что должен выводить скрипт - то будет проще

Скрипты должны выводить идентичный результат, причем в первом случае результат неверный, т.к. он равнозначен true && false = true, что неверно. Либо я в чем-то ошибся.

Вывод скриптов как раз я привел в первом посте. Котировки MetaQuotes-Demo 

 
AntFX:

Скрипты должны выводить идентичный результат, причем в первом случае результат неверный, т.к. он равнозначен true && false = true, что неверно. Либо я в чем-то ошибся.

Вывод скриптов как раз я привел в первом посте. Котировки MetaQuotes-Demo 

Если в первом варианте убрать скобки для condition, то тогда результаты идентичны:

   Print("Signal AND Condition = ",signal && rates[0].close<rates[0].open?
         rates[0].open<=rates[1].close+(rates[1].high-rates[1].low)*0.1:
         rates[0].open<rates[1].close && rates[0].close<=rates[1].close+(rates[1].high-rates[1].low)*0.1);

 //---

А вот почему так, не знаю. )) 

 

 

tol64:

Если в первом варианте убрать скобки для condition, то тогда результаты идентичны:

 //---

А вот почему так, не знаю. )) 

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

 

bool condition=(rates[0].close<rates[0].open?
rates[0].open<=rates[1].close+(rates[1].high-rates[1].low)*0.1:
rates[0].open<rates[1].close&&rates[0].close<=rates[1].close+(rates[1].high-rates[1].low)*0.1

);

Может быть так и требовалсь и какой-то здравый смысл в это вложен, но все же...

Запишите в несколько строк, для каждого элементарного выражения свою переменную, потом выражения с переменными и т.д. пока на конце не будет нужное выражение. 

 

 

 

Integer:

bool condition=(rates[0].close<rates[0].open?
rates[0].open<=rates[1].close+(rates[1].high-rates[1].low)*0.1:
rates[0].open<rates[1].close&&rates[0].close<=rates[1].close+(rates[1].high-rates[1].low)*0.1

);

Может быть так и требовалсь и какой-то здравый смысл в это вложен, но все же...

Запишите в несколько строк, для каждого элементарого выражения сою переменную, потом выражения с переменными и т.д. пока на конце не будет нужно выражение. 

 

По моему, так все очевидно - последняя свеча открылась с гэпом к телу предыдущей, и её тело находится в пределах нижних 10% тела предыдущей свечи.

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

 
AntFX:

 

По моему, так все очевидно - последняя свеча открылась с гэпом к предыдущей, и её тело находится в пределах нижних 10% от предыдущей свечи.

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

Не заметил && в середине.

Потому-что так не надо писать выражения, их надо разбивать на несколько элементарных, ато замучаешься. 

 
AntFX:

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

Просто попробовал. Это что-то из той же серии похоже, что и:

if((var=Func())=="") { return; }

Если не заключить в скобки var=Func(), то тоже предупреждение выходит:

 

//---

Как это объяснить не знаю. ))

 

 

 

Все же хотелось бы, чтобы спецы MQL5 пояснили, почему в первом моем скрипте true && false = true

 
AntFX:

Все же хотелось бы, чтобы спецы MQL5 пояснили, почему в первом моем скрипте true && false = true

Тоже интересно. Ждём...
Причина обращения: