Неадекватное поведение оператора if

 

Всем привет, сломал весь мозг но не понял что за бред.

Смотрите, внешний иф никогда не срабатывает, так и должно быть. НО при этом код вообще не работает, ни один алерт не вылетает, и ошибок компиляции тоже нет.

Теперь внимание - стоит во внутреннем ифе вместо if (1) написать if (0) алерты срабатывают. ЧТО вообще происходит?

Уточню - Alert("333"); никогда не срабатывает, в тот иф вообще никак попасть нельзя, так и должно быть. Но при этом после запуска ничего вообще не работает и ошибок нет.

Однако если сделать как я сказал - все работает, что это?

Alert("222");
if (symbol == "EURCHF" && ((type == OP_BUY) || (type == OP_SELL))) {
    Alert("333");
    if (1) {
        if (type == OP_BUY) {
            flag_1_1_b_need_first = false;
            flag_1_1_b_need_next  = fmax(flag_1_1_b_need_next, info[1]);
        } else {
            flag_1_1_s_need_first = false;
            flag_1_1_s_need_next  = fmax(flag_1_1_s_need_next, info[1]);
        }
    }
} else {
    Alert("444");
}
 
Попробуйте перезапустить терминал.
 
xordword85:

Всем привет, сломал весь мозг но не понял что за бред.

Смотрите, внешний иф никогда не срабатывает, так и должно быть. НО при этом код вообще не работает, ни один алерт не вылетает, и ошибок компиляции тоже нет.

Теперь внимание - стоит во внутреннем ифе вместо if (1) написать if (0) алерты срабатывают. ЧТО вообще происходит?

Уточню - Alert("333"); никогда не срабатывает, в тот иф вообще никак попасть нельзя, так и должно быть. Но при этом после запуска ничего вообще не работает и ошибок нет.

Однако если сделать как я сказал - все работает, что это?

Укажите данные терминала и операционной системы:

Forum on trading, automated trading systems and testing trading strategies

Very Glitchy MetaTrader

Vladimir Karputov, 2021.03.16 04:20

If you have a question, first of all you should show the first three lines from the 'Journal' tab


(select these lines, copy to the clipboard and paste into the message using the button Code). It should look like this:

2021.03.16 05:13:07.133 Terminal        MetaTrader 5 x64 build 2832 started for MetaQuotes Software Corp.
2021.03.16 05:13:07.134 Terminal        Windows 10 build 19042, Intel Core i7-9750H  @ 2.60GHz, 26 / 31 Gb memory, 842 / 947 Gb disk, IE 11, UAC, GMT+2
2021.03.16 05:13:07.134 Terminal        C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075
 
Dmitry Fedoseev:
Попробуйте перезапустить терминал.
Конешно же я много раз это сделал) Стабильно неадекватный результат! Если что речь о метатрейдере 4 и mql 4.
 
Vladimir Karputov:

Укажите данные терминала и операционной системы:

Терминал и язык 4 версии, ос винда 7.
 

Version 4.00 build 1340

23 jul 2021

Брокер Forex4You

 
xordword85:
Конешно же я много раз это сделал) Стабильно неадекватный результат! Если что речь о метатрейдере 4 и mql 4.

Тогда, может быть, есть какие-то ошибки перед выполнением этого кода. Может быть, выход за пределы массива, деление на 0. Может быть, в каком-то другом индикаторе или эксперте, работающем в терминале.

 
Dmitry Fedoseev:

Тогда, может быть, есть какие-то ошибки перед выполнением этого кода. Может быть, выход за пределы массива, деление на 0. Может быть, в каком-то другом индикаторе или эксперте, работающем в терминале.

К сожалению ничего нет, всего 3 пары со стандартным мовинг-авераге)

Чтобы я на форуме людей доставал причина должна быть серьезной, вот как раз сейчас такой случай)

Переустановил терминал - не помогло.

 
xordword85:

Переустановил терминал - не помогло.

А переустанавливать ОС не пробовали?))))

Говорят помогает иногда.

 
xordword85:

Всем привет, сломал весь мозг но не понял что за бред.

Смотрите, внешний иф никогда не срабатывает, так и должно быть. НО при этом код вообще не работает, ни один алерт не вылетает, и ошибок компиляции тоже нет.

Теперь внимание - стоит во внутреннем ифе вместо if (1) написать if (0) алерты срабатывают. ЧТО вообще происходит?

Уточню - Alert("333"); никогда не срабатывает, в тот иф вообще никак попасть нельзя, так и должно быть. Но при этом после запуска ничего вообще не работает и ошибок нет.

Однако если сделать как я сказал - все работает, что это?

Вы не предоставили всей информации. Если дополнить код, чтобы компилировался, то всё работает.

//+------------------------------------------------------------------+
//|                                                        trash.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
string symbol="EURUSD";
int type=1;
bool flag_1_1_b_need_first,flag_1_1_b_need_next,flag_1_1_s_need_first,flag_1_1_s_need_next;
int info[2];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   Alert("222");
   if(symbol == "EURCHF" && ((type == OP_BUY) || (type == OP_SELL)))
     {
      Alert("333");
      if(1)
        {
         if(type == OP_BUY)
           {
            flag_1_1_b_need_first = false;
            flag_1_1_b_need_next  = fmax(flag_1_1_b_need_next, info[1]);
           }
         else
           {
            flag_1_1_s_need_first = false;
            flag_1_1_s_need_next  = fmax(flag_1_1_s_need_next, info[1]);
           }
        }
     }
   else
     {
      Alert("444");
     }
  }
//+------------------------------------------------------------------+



 

Да, не стал весь кидать, ну ок, вот представлю весь. На самом деле непоняток еще больше, я просто решил на одной из них здесь сфокусироваться.

В данный момент все работает как я сказал, если if (0) то работает, если if (1) то нет.


#property copyright "Жан Батист Эмануэль Зорг"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

string symbols[3];
string state[3];

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   //--- create timer
   EventSetTimer(60);
   
   symbols[0] = "EURUSD";
   symbols[1] = "EURCHF";
   symbols[2] = "EURCAD";
   
   state[1] = "Необходимо открыть стартовые ордера";
   
   Alert("111");
   
   string buf = "";
   string symbol;
   int type;
   int i, total = OrdersHistoryTotal();
   bool flag_1_1_b_need_first = true;
   bool flag_1_1_s_need_first = true;
   int flag_1_1_b_need_next = 0;
   int flag_1_1_s_need_next = 0;
   string info[3];
   for (i = 0; i < total; i++) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) {
         Alert("Ошибка при доступе к исторической базе (", GetLastError(), ")");
         break;
      }
      
      symbol = OrderSymbol();
      type   = OrderType();
      Alert("222");
      if (symbol == "EURCHF" && ((type == OP_BUY) || (type == OP_SELL))) {
         Alert("333");
         if (0) {
            if (type == OP_BUY) {
               flag_1_1_b_need_first = false;
               flag_1_1_b_need_next  = fmax(flag_1_1_b_need_next, info[1]);
            } else {
               flag_1_1_s_need_first = false;
               flag_1_1_s_need_next  = fmax(flag_1_1_s_need_next, info[1]);
            }
         }
      } else {
         Alert("444");
      }
      break;
   }
   
   if (flag_1_1_b_need_first) {
      buf += "Необходимо открыть первый ордер на покупку.\n";
   }
   if (flag_1_1_b_need_next) {
      buf += "Необходимо открыть " + (flag_1_1_b_need_next + 1) + " ордер на покупку.\n";
   }
   if (flag_1_1_s_need_first) {
      buf += "Необходимо открыть первый ордер на продажу.\n";
   }
   if (flag_1_1_s_need_next) {
      buf += "Необходимо открыть " + (flag_1_1_s_need_next + 1) + " ордер на продажу.\n";
   }
   
   //---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
}
//+------------------------------------------------------------------+


ЗЫ: Там где эти if (0) у меня на самом деле был вызов функции самодельной, но я вот специально ее убрал ради чистоты эксперимента, думал в ней дело, но теперь ее нет.